correction page quizzes2
This commit is contained in:
parent
0ccd3ed0ff
commit
3cca2f6613
@ -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 }}
|
||||
/>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user