From a36dd4c3378855f89c6ae04e66c66023d811c8a2 Mon Sep 17 00:00:00 2001 From: Gayatri Padalia Date: Mon, 20 Jul 2026 18:43:45 +0530 Subject: [PATCH] feat: add quiz timer and improve quiz UI Signed-off-by: Gayatri Padalia --- app/quiz/[slug]/QuizClient.tsx | 63 ++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/app/quiz/[slug]/QuizClient.tsx b/app/quiz/[slug]/QuizClient.tsx index f467a04..bb72d1b 100644 --- a/app/quiz/[slug]/QuizClient.tsx +++ b/app/quiz/[slug]/QuizClient.tsx @@ -56,10 +56,16 @@ export default function QuizClient({ quiz, inline, onClose, autoStart }: Props) { question: string; chosen: number; correct: number }[] >([]); const [questionSet, setQuestionSet] = useState([]); + + const QUIZ_TIME = 5 * 60; // 5 minutes + + const [timeLeft, setTimeLeft] = useState(QUIZ_TIME); + const [didAutoStart, setDidAutoStart] = useState(false); + const isInline = inline ?? false; - const q = questionSet[current]!; + const q = questionSet[current]; const total = Math.min(10, quiz.questions.length); function startQuiz() { @@ -70,6 +76,7 @@ export default function QuizClient({ quiz, inline, onClose, autoStart }: Props) setAnswered(false); setScore(0); setResults([]); + setTimeLeft(QUIZ_TIME); setState("active"); setDidAutoStart(true); } @@ -107,10 +114,21 @@ export default function QuizClient({ quiz, inline, onClose, autoStart }: Props) } useEffect(() => { - if (isInline && autoStart && state === "idle" && !didAutoStart) { - startQuiz(); - } - }, [autoStart, didAutoStart, isInline, state]); + if (state !== "active") return; + + const timer = setInterval(() => { + setTimeLeft((prev) => { + if (prev <= 1) { + clearInterval(timer); + setState("finished"); + return 0; + } + return prev - 1; + }); + }, 1000); + + return () => clearInterval(timer); + }, [state]); function getOptionClass(idx: number): string { const base = @@ -126,6 +144,8 @@ export default function QuizClient({ quiz, inline, onClose, autoStart }: Props) } const pct = Math.round((score / total) * 100); + const minutes = Math.floor(timeLeft / 60); + const seconds = String(timeLeft % 60).padStart(2, "0"); if (state === "idle") { return ( @@ -174,7 +194,7 @@ export default function QuizClient({ quiz, inline, onClose, autoStart }: Props)
{total} questions · - No time limit + 5 minute time limit · Instant feedback
@@ -186,7 +206,7 @@ export default function QuizClient({ quiz, inline, onClose, autoStart }: Props)
{total} questions · - No time limit + 5 minute time limit · Instant feedback
@@ -353,11 +373,32 @@ export default function QuizClient({ quiz, inline, onClose, autoStart }: Props) > ← Back - Quiz + Quiz -
- Question {current + 1} of {total} - Score: {score} +
+ Question {current + 1} of {total} + + + ⏳ {minutes}:{seconds} + + + Score: {score} +
+
+