correction page quizzes2

This commit is contained in:
corenthin-lebreton 2026-02-26 23:31:14 +01:00
parent 0ccd3ed0ff
commit 3cca2f6613

View File

@ -1,53 +1,71 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { redirect } from 'next/navigation'
import { createClient } from '@/lib/supabase/server'
import QuizzesClient from './QuizzesClient'
export default async function QuizzesPage() {
const supabase = await createClient()
const db = supabase as any
const { data: { user } } = await supabase.auth.getUser()
try {
const supabase = await createClient()
const db = supabase as any
const { data: categories } = await db
.from('categories')
.select(`id, name, description, subchapters(id, name, quizzes(id, title, updated_at))`)
.order('name')
const { data: { user }, error: authError } = await supabase.auth.getUser()
if (authError || !user) redirect('/login')
const { count: totalQuizzes } = await db
.from('quizzes')
.select('id', { count: 'exact', head: true })
.eq('author_id', user!.id)
const { data: sessionIds } = await db
.from('sessions')
.select('id')
.eq('trainer_id', user!.id)
const ids = (sessionIds ?? []).map((s: any) => s.id)
const { count: totalStudents } = ids.length > 0
? await db
.from('student_participations')
const [
{ data: categories },
{ count: totalQuizzes },
{ data: sessionIds },
] = await Promise.all([
db
.from('categories')
.select('id, name, description, subchapters(id, name, quizzes(id, title, updated_at))')
.order('name'),
db
.from('quizzes')
.select('id', { count: 'exact', head: true })
.in('session_id', ids)
: { count: 0 }
.eq('author_id', user.id),
db
.from('sessions')
.select('id')
.eq('trainer_id', user.id),
])
// Supabase peut retourner `quizzes: null` quand un sous-chapitre n'a aucun quiz —
// on normalise en tableau vide pour éviter les crash .length côté client.
const normalizedCategories = (categories ?? []).map((cat: any) => ({
...cat,
subchapters: (cat.subchapters ?? []).map((sub: any) => ({
...sub,
quizzes: sub.quizzes ?? [],
})),
}))
const ids = (sessionIds ?? []).map((s: any) => s.id)
const { count: totalStudents } = ids.length > 0
? await db
.from('student_participations')
.select('id', { count: 'exact', head: true })
.in('session_id', ids)
: { count: 0 }
return (
<QuizzesClient
initialCategories={normalizedCategories}
stats={{
totalQuizzes: totalQuizzes ?? 0,
totalCategories: categories?.length ?? 0,
activeStudents: totalStudents ?? 0,
}}
/>
)
// Supabase retourne `quizzes: null` (pas `[]`) quand un sous-chapitre n'a
// aucun quiz — on normalise pour éviter les crash .length côté client.
const normalizedCategories = (categories ?? []).map((cat: any) => ({
...cat,
subchapters: (cat.subchapters ?? []).map((sub: any) => ({
...sub,
quizzes: Array.isArray(sub.quizzes) ? sub.quizzes : [],
})),
}))
return (
<QuizzesClient
initialCategories={normalizedCategories}
stats={{
totalQuizzes: totalQuizzes ?? 0,
totalCategories: normalizedCategories.length,
activeStudents: totalStudents ?? 0,
}}
/>
)
} catch (err) {
console.error('[QuizzesPage]', err)
// Renvoie une page vide plutôt qu'un 500 nu
return (
<QuizzesClient
initialCategories={[]}
stats={{ totalQuizzes: 0, totalCategories: 0, activeStudents: 0 }}
/>
)
}
}