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
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,
|
|
};
|
|
}
|
|
|