轻松聘
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

71 lines
1.9 KiB

/**
* 个人中心数据 hook:并行组合用户信息、综合评分、维度评分、求职偏好、勋章、菜单六类数据,
* 统一管理 loading / error / refresh 三态。
*/
import { useCallback } from 'react';
import {
fetchBadges,
fetchDimensionScores,
fetchEnterpriseEntry,
fetchJobPreference,
fetchMenuItems,
fetchOverallScore,
fetchUserProfile,
fetchUserStats,
} from '../api';
import type {
AppRole,
Badge,
DimensionScore,
EnterpriseEntry,
JobPreference,
MenuItem,
OverallScore,
UserProfile,
UserStats,
} from '../types';
import { useAsyncData } from './useAsyncData';
/** 个人中心聚合数据 */
interface ProfileData {
profile: UserProfile;
userStats: UserStats;
overallScore: OverallScore;
dimensions: DimensionScore[];
preference: JobPreference;
badges: Badge[];
menuItems: MenuItem[];
enterpriseEntry: EnterpriseEntry;
}
export function useProfileData(role: AppRole = 'candidate') {
const fetcher = useCallback(async (): Promise<ProfileData> => {
const [profile, userStats, overallScore, dimensions, preference, badges, menuItems, enterpriseEntry] = await Promise.all([
fetchUserProfile(),
fetchUserStats(),
fetchOverallScore(),
fetchDimensionScores(),
fetchJobPreference(),
fetchBadges(),
fetchMenuItems(role),
fetchEnterpriseEntry(),
]);
return { profile, userStats, overallScore, dimensions, preference, badges, menuItems, enterpriseEntry };
}, [role]);
const { data, loading, error, refresh } = useAsyncData(fetcher);
return {
profile: data?.profile ?? null,
userStats: data?.userStats ?? null,
overallScore: data?.overallScore ?? null,
dimensions: data?.dimensions ?? [],
preference: data?.preference ?? null,
badges: data?.badges ?? [],
menuItems: data?.menuItems ?? [],
enterpriseEntry: data?.enterpriseEntry ?? null,
loading,
error,
refresh,
};
}