frontend_nyla/src/hooks/useCommcoachDashboard.ts
2026-03-02 00:51:25 +01:00

55 lines
1.8 KiB
TypeScript

/**
* useCommcoachDashboard Hook
*
* Loads and manages dashboard data for the CommCoach feature.
*/
import { useState, useEffect, useCallback, useRef } from 'react';
import { useApiRequest } from './useApi';
import { useInstanceId } from './useCurrentInstance';
import { getDashboardApi, getProfileApi, type DashboardData, type CoachingUserProfile } from '../api/commcoachApi';
export interface CommcoachDashboardReturn {
dashboard: DashboardData | null;
profile: CoachingUserProfile | null;
loading: boolean;
error: string | null;
refresh: () => Promise<void>;
}
export function useCommcoachDashboard(): CommcoachDashboardReturn {
const { request } = useApiRequest();
const instanceId = useInstanceId();
const [dashboard, setDashboard] = useState<DashboardData | null>(null);
const [profile, setProfile] = useState<CoachingUserProfile | null>(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const isMountedRef = useRef(true);
useEffect(() => { isMountedRef.current = true; return () => { isMountedRef.current = false; }; }, []);
const refresh = useCallback(async () => {
if (!instanceId) return;
setLoading(true);
setError(null);
try {
const [dashData, profileData] = await Promise.all([
getDashboardApi(request, instanceId),
getProfileApi(request, instanceId),
]);
if (isMountedRef.current) {
setDashboard(dashData);
setProfile(profileData);
}
} catch (err: any) {
if (isMountedRef.current) setError(err.message || 'Fehler beim Laden des Dashboards');
} finally {
if (isMountedRef.current) setLoading(false);
}
}, [request, instanceId]);
useEffect(() => { if (instanceId) refresh(); }, [instanceId, refresh]);
return { dashboard, profile, loading, error, refresh };
}