85 lines
2.4 KiB
TypeScript
85 lines
2.4 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
import { createClient } from '@/lib/supabase/server'
|
|
import { redirect } from 'next/navigation'
|
|
import ExamClient from './ExamClient'
|
|
|
|
export default async function ExamPage({
|
|
params,
|
|
searchParams,
|
|
}: {
|
|
params: Promise<{ code: string }>
|
|
searchParams: Promise<{ pid?: string }>
|
|
}) {
|
|
const { code } = await params
|
|
const { pid: participationId } = await searchParams
|
|
|
|
if (!participationId) {
|
|
redirect(`/quiz/${code}`)
|
|
}
|
|
|
|
const supabase = await createClient()
|
|
const db = supabase as any
|
|
|
|
const { data: session } = await db
|
|
.from('sessions')
|
|
.select('id, is_active, quiz_id')
|
|
.eq('short_code', code.toUpperCase())
|
|
.single()
|
|
|
|
if (!session) redirect(`/quiz/${code}`)
|
|
|
|
if (!session.is_active) {
|
|
return (
|
|
<div className="min-h-screen bg-background flex items-center justify-center">
|
|
<div className="text-center max-w-md mx-auto px-4">
|
|
<div className="text-6xl mb-4">🏁</div>
|
|
<h1 className="text-2xl font-bold text-text-primary mb-3">Ce quiz est terminé</h1>
|
|
<p className="text-text-secondary">Le formateur a clôturé cette session.</p>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const { data: participation } = await db
|
|
.from('student_participations')
|
|
.select('id, status, score, first_name, last_name')
|
|
.eq('id', participationId)
|
|
.single()
|
|
|
|
if (!participation) redirect(`/quiz/${code}`)
|
|
|
|
if (participation.status === 'completed') {
|
|
redirect(`/quiz/${code}/results?pid=${participationId}`)
|
|
}
|
|
|
|
const { data: questions } = await db
|
|
.from('questions')
|
|
.select(`id, question_text, order, answers(id, answer_text)`)
|
|
.eq('quiz_id', session.quiz_id)
|
|
.order('order')
|
|
|
|
const { data: existingAnswers } = await db
|
|
.from('student_answers')
|
|
.select('question_id, answer_id')
|
|
.eq('participation_id', participationId)
|
|
|
|
const answersMap = new Map(
|
|
(existingAnswers ?? []).map((a: any) => [a.question_id, a.answer_id])
|
|
)
|
|
|
|
return (
|
|
<ExamClient
|
|
sessionCode={code.toUpperCase()}
|
|
participationId={participationId}
|
|
studentName={`${participation.first_name} ${participation.last_name}`}
|
|
questions={(questions ?? []).map((q: any) => ({
|
|
id: q.id,
|
|
text: q.question_text,
|
|
order: q.order,
|
|
answers: q.answers.map((a: any) => ({ id: a.id, text: a.answer_text })),
|
|
selectedAnswerId: answersMap.get(q.id) ?? null,
|
|
}))}
|
|
/>
|
|
)
|
|
}
|