97 lines
4.0 KiB
TypeScript
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,
|
|
};
|
|
}
|