@@ -2,6 +2,9 @@ import { Metadata } from 'next';
22import { notFound } from 'next/navigation' ;
33
44import { QuizEditorList } from '@/components/admin/quiz/QuizEditorList' ;
5+ import { QuizMetadataEditor } from '@/components/admin/quiz/QuizMetadataEditor' ;
6+ import { QuizStatusControls } from '@/components/admin/quiz/QuizStatusControls' ;
7+ import { UploadMoreQuestions } from '@/components/admin/quiz/UploadMoreQuestions' ;
58import { getAdminQuizFull } from '@/db/queries/quizzes/admin-quiz' ;
69import { Link } from '@/i18n/routing' ;
710import { issueCsrfToken } from '@/lib/security/csrf' ;
@@ -23,7 +26,16 @@ export default async function AdminQuizEditPage({
2326 const title =
2427 quiz . translations . en ?. title ?? quiz . translations . uk ?. title ?? quiz . slug ;
2528
29+ const isDraft = quiz . status === 'draft' ;
30+
2631 const csrfToken = issueCsrfToken ( 'admin:quiz:question:update' ) ;
32+ const csrfTokenDelete = isDraft
33+ ? issueCsrfToken ( 'admin:quiz:question:delete' )
34+ : undefined ;
35+ const csrfTokenAddQuestions = isDraft
36+ ? issueCsrfToken ( 'admin:quiz:questions:add' )
37+ : undefined ;
38+ const csrfTokenUpdate = issueCsrfToken ( 'admin:quiz:update' ) ;
2739
2840 return (
2941 < div className = "mx-auto max-w-5xl px-6 py-8" >
@@ -38,15 +50,62 @@ export default async function AdminQuizEditPage({
3850
3951 < div className = "mb-6" >
4052 < h1 className = "text-foreground text-2xl font-bold" > { title } </ h1 >
41- < p className = "text-muted-foreground mt-1 text-sm" >
42- { quiz . questions . length } questions · slug: { quiz . slug }
43- </ p >
53+ < div className = "mt-1 flex items-center gap-3" >
54+ < span className = "text-muted-foreground text-sm" >
55+ { quiz . questions . length } questions · slug: { quiz . slug }
56+ </ span >
57+ < span
58+ className = { `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${
59+ isDraft
60+ ? 'bg-amber-500/10 text-amber-500'
61+ : 'bg-emerald-500/10 text-emerald-500'
62+ } `}
63+ >
64+ { isDraft ? 'Draft' : 'Ready' }
65+ </ span >
66+ < span
67+ className = { `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${
68+ quiz . isActive
69+ ? 'bg-emerald-500/10 text-emerald-500'
70+ : 'bg-muted text-muted-foreground'
71+ } `}
72+ >
73+ { quiz . isActive ? 'Active' : 'Inactive' }
74+ </ span >
75+ </ div >
76+ </ div >
77+ < div className = "mb-6" >
78+ < QuizStatusControls
79+ quizId = { quiz . id }
80+ status = { quiz . status }
81+ isActive = { quiz . isActive }
82+ csrfToken = { csrfTokenUpdate }
83+ />
4484 </ div >
85+ < div className = "mb-6" >
86+ < QuizMetadataEditor
87+ quizId = { quiz . id }
88+ translations = { quiz . translations }
89+ timeLimitSeconds = { quiz . timeLimitSeconds }
90+ csrfToken = { csrfTokenUpdate }
91+ />
92+ </ div >
93+
94+ { isDraft && csrfTokenAddQuestions && (
95+ < div className = "mb-6" >
96+ < UploadMoreQuestions
97+ quizId = { quiz . id }
98+ csrfToken = { csrfTokenAddQuestions }
99+ />
100+ </ div >
101+ ) }
45102
46103 < QuizEditorList
47104 questions = { quiz . questions }
48105 quizId = { quiz . id }
49106 csrfToken = { csrfToken }
107+ csrfTokenDelete = { csrfTokenDelete }
108+ isDraft = { isDraft }
50109 />
51110 </ div >
52111 ) ;
0 commit comments