Skip to content

Commit e271f70

Browse files
authored
window unfocused modal (#279)
* window unfocused modal * PR fixes
1 parent 38d826d commit e271f70

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

src/app/(web)/(oa)/assessment/[assessmentId]/page.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import { use } from 'react';
3+
import { use, useEffect, useState } from 'react';
44
import useAssessment from '@/lib/hooks/useAssessment';
55
import AssessmentIntro from '@/lib/components/assessment-flow/AssessmentIntro';
66
import AssessmentOutro from '@/lib/components/assessment-flow/AssessmentOutro';
@@ -10,11 +10,27 @@ import AssessmentContent from '@/lib/components/assessment-flow/AssessmentConten
1010
import { useHeartbeat } from '@/lib/hooks/useHeartbeat';
1111
import { LostConnectionModal } from '@/lib/components/modal/LostConnectionModal';
1212
import AssessmentSkeleton from '@/lib/components/assessment-flow/AssessmentSkeleton';
13+
import { useWindowUnfocused } from '@/lib/hooks/useWindowUnfocused';
14+
import { WindowUnfocusedModal } from '@/lib/components/modal/WindowUnfocusedModal';
1315

1416
export default function AssessmentPage({ params }: { params: Promise<{ assessmentId: string }> }) {
1517
const { assessmentId } = use(params);
1618
const assessment = useAssessment(assessmentId);
1719
const { isConnected } = useHeartbeat(assessment.token ?? null);
20+
const isWindowUnfocused = useWindowUnfocused();
21+
const [isUnfocusedModalOpen, setIsUnfocusedModalOpen] = useState(false);
22+
const isExamActive =
23+
!assessment.isLoading &&
24+
!assessment.error &&
25+
isConnected &&
26+
assessment.phase !== 'intro' &&
27+
assessment.phase !== 'outro';
28+
29+
useEffect(() => {
30+
if (isExamActive && isWindowUnfocused) {
31+
setIsUnfocusedModalOpen(true);
32+
}
33+
}, [isExamActive, isWindowUnfocused]);
1834

1935
if (assessment.isLoading)
2036
return (
@@ -52,6 +68,10 @@ export default function AssessmentPage({ params }: { params: Promise<{ assessmen
5268
<div className="flex h-screen w-full flex-col overflow-hidden">
5369
{/* onOpenChange is returning nothing as we don't have recovery implemented just yet */}
5470
<LostConnectionModal open={!isConnected} onOpenChange={() => {}} />
71+
<WindowUnfocusedModal
72+
open={isUnfocusedModalOpen}
73+
onAcknowledge={() => setIsUnfocusedModalOpen(false)}
74+
/>
5575
<AssessmentNavbar candidateName={assessment.candidateName} />
5676
<div className="flex flex-1 overflow-hidden">
5777
<AssessmentSidebar
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Button } from '@/lib/components/ui/Button';
2+
3+
type WindowUnfocusedModalProps = {
4+
open: boolean;
5+
onAcknowledge: () => void;
6+
};
7+
8+
export function WindowUnfocusedModal({ open, onAcknowledge }: WindowUnfocusedModalProps) {
9+
if (!open) return null;
10+
11+
return (
12+
<div className="fixed inset-0 z-50 flex items-center justify-center bg-white/25 p-4 backdrop-blur-md">
13+
<div className="bg-sarge-gray-0 border-sarge-gray-200 flex w-full max-w-[380px] flex-col items-center gap-4 rounded-lg border px-8 py-7 text-center shadow-lg">
14+
<div className="space-y-3">
15+
<h2 className="text-sarge-gray-900 text-base leading-snug font-bold">
16+
You can&apos;t unfocus your assessment window during the exam
17+
</h2>
18+
<p className="text-sarge-gray-600 text-sm">The admin has been notified.</p>
19+
</div>
20+
<Button className="h-9 min-w-28 px-5" onClick={onAcknowledge}>
21+
I understand
22+
</Button>
23+
</div>
24+
</div>
25+
);
26+
}

0 commit comments

Comments
 (0)