corenthin-lebreton 28aa3b0e10 initial project
2026-02-26 20:10:14 +01:00

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,
}))}
/>
)
}