/** * 个人中心数据 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 => { 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, }; }