97 lines
4.0 KiB
TypeScript

import { useState } from 'react';
import { useFrameEntries } from '@/business/frame/hooks';
import { useSafetyQuizCompliance } from '@/business/safety-quiz/hooks';
import { usePersonalityCompletion } from '@/business/personality/queryHooks';
import { useZoneCheckInCompletion } from '@/business/zone-checkin/hooks';
import {
useStaffAttendanceRecords,
useStaffAttendanceSummary,
} from '@/business/staff-attendance/hooks';
import { usePolicyAcknowledgmentReport } from '@/business/policies/hooks';
import {
buildDirectorFramePreviews,
buildDirectorOverviewCards,
buildDirectorQuizResults,
buildDirectorRiskAreas,
} from '@/business/director-dashboard/selectors';
import type { DirectorDashboardPage } from '@/business/director-dashboard/types';
import {
DIRECTOR_DASHBOARD_QUICK_ACTIONS,
type DirectorDashboardTimeRange,
} from '@/shared/constants/directorDashboard';
import { useAuth } from '@/shared/app/useAuth';
import { getLeadershipDashboardName } from '@/business/app-shell/selectors';
import { getActiveTenant } from '@/business/scope/selectors';
import { useScopeContext } from '@/shared/app/scope-context';
import { DEFAULT_PRODUCT_ROLE } from '@/shared/constants/roles';
import { getCurrentSafetyQuizWeek } from '@/business/safety-quiz/selectors';
export function useDirectorDashboardPage(): DirectorDashboardPage {
const { user, profile } = useAuth();
const { effectiveTenant } = useScopeContext();
const role = profile?.role ?? DEFAULT_PRODUCT_ROLE;
const title = getLeadershipDashboardName(role);
const activeTenant = effectiveTenant ?? getActiveTenant(user);
const scopeLabel = activeTenant?.name ?? '';
const scopeKey = activeTenant ? `${activeTenant.level}:${activeTenant.id}` : null;
const [timeRange, setTimeRangeState] = useState<DirectorDashboardTimeRange>('month');
const safetyQuizWeek = getCurrentSafetyQuizWeek(new Date());
const frameEntriesQuery = useFrameEntries();
const quizCompletionQuery = useSafetyQuizCompliance(safetyQuizWeek, true);
const emotionalIntelligenceCompletionQuery = usePersonalityCompletion(true);
const zoneCheckinCompletionQuery = useZoneCheckInCompletion(true, scopeKey);
const staffAttendanceRecordsQuery = useStaffAttendanceRecords();
const staffAttendanceSummaryQuery = useStaffAttendanceSummary();
const acknowledgmentReportQuery = usePolicyAcknowledgmentReport();
const frameEntries = frameEntriesQuery.data ?? [];
const quizRows = quizCompletionQuery.data?.rows ?? [];
const emotionalIntelligenceCompletion = emotionalIntelligenceCompletionQuery.data ?? null;
const zoneCheckinCompletion = zoneCheckinCompletionQuery.data ?? null;
const quizSummary = quizCompletionQuery.data?.summary ?? {
totalStaff: 0,
completedCount: 0,
pendingCount: 0,
completionRate: 0,
};
const attendanceRecords = staffAttendanceRecordsQuery.data ?? [];
const isLoading = frameEntriesQuery.isLoading
|| quizCompletionQuery.isLoading
|| emotionalIntelligenceCompletionQuery.isLoading
|| zoneCheckinCompletionQuery.isLoading
|| staffAttendanceRecordsQuery.isLoading
|| staffAttendanceSummaryQuery.isLoading
|| acknowledgmentReportQuery.isLoading;
const error = frameEntriesQuery.error
?? quizCompletionQuery.error
?? emotionalIntelligenceCompletionQuery.error
?? zoneCheckinCompletionQuery.error
?? staffAttendanceRecordsQuery.error
?? staffAttendanceSummaryQuery.error
?? acknowledgmentReportQuery.error;
return {
title,
scopeLabel,
timeRange,
overviewCards: buildDirectorOverviewCards(
attendanceRecords,
quizSummary,
frameEntries,
acknowledgmentReportQuery.data?.summary,
),
riskAreas: buildDirectorRiskAreas(
attendanceRecords,
quizSummary,
emotionalIntelligenceCompletion,
zoneCheckinCompletion,
),
framePreviews: buildDirectorFramePreviews(frameEntries),
quickActions: DIRECTOR_DASHBOARD_QUICK_ACTIONS,
quizResults: buildDirectorQuizResults(quizRows, emotionalIntelligenceCompletion, zoneCheckinCompletion),
isLoading,
error,
setTimeRange: setTimeRangeState,
};
}