diff --git a/src/app/(web)/(oa)/assessment/[assessmentId]/page.tsx b/src/app/(web)/(oa)/assessment/[assessmentId]/page.tsx index f518d893..fb83d9eb 100644 --- a/src/app/(web)/(oa)/assessment/[assessmentId]/page.tsx +++ b/src/app/(web)/(oa)/assessment/[assessmentId]/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { use } from 'react'; +import { use, useEffect, useState } from 'react'; import useAssessment from '@/lib/hooks/useAssessment'; import AssessmentIntro from '@/lib/components/assessment-flow/AssessmentIntro'; import AssessmentOutro from '@/lib/components/assessment-flow/AssessmentOutro'; @@ -10,11 +10,27 @@ import AssessmentContent from '@/lib/components/assessment-flow/AssessmentConten import { useHeartbeat } from '@/lib/hooks/useHeartbeat'; import { LostConnectionModal } from '@/lib/components/modal/LostConnectionModal'; import AssessmentSkeleton from '@/lib/components/assessment-flow/AssessmentSkeleton'; +import { useWindowUnfocused } from '@/lib/hooks/useWindowUnfocused'; +import { WindowUnfocusedModal } from '@/lib/components/modal/WindowUnfocusedModal'; export default function AssessmentPage({ params }: { params: Promise<{ assessmentId: string }> }) { const { assessmentId } = use(params); const assessment = useAssessment(assessmentId); const { isConnected } = useHeartbeat(assessment.token ?? null); + const isWindowUnfocused = useWindowUnfocused(); + const [isUnfocusedModalOpen, setIsUnfocusedModalOpen] = useState(false); + const isExamActive = + !assessment.isLoading && + !assessment.error && + isConnected && + assessment.phase !== 'intro' && + assessment.phase !== 'outro'; + + useEffect(() => { + if (isExamActive && isWindowUnfocused) { + setIsUnfocusedModalOpen(true); + } + }, [isExamActive, isWindowUnfocused]); if (assessment.isLoading) return ( @@ -52,6 +68,10 @@ export default function AssessmentPage({ params }: { params: Promise<{ assessmen
{/* onOpenChange is returning nothing as we don't have recovery implemented just yet */} {}} /> + setIsUnfocusedModalOpen(false)} + />
void; +}; + +export function WindowUnfocusedModal({ open, onAcknowledge }: WindowUnfocusedModalProps) { + if (!open) return null; + + return ( +
+
+
+

+ You can't unfocus your assessment window during the exam +

+

The admin has been notified.

+
+ +
+
+ ); +}