"use client"; import { useEffect, useState } from "react"; import { useRouter, useParams } from "next/navigation"; import DarkThemeLayout from "../../components/DarkThemeLayout"; import Navbar from "../../components/Navbar"; import QuizQuestion from "../../components/QuizQuestion"; interface User { username: string; points: number; } interface Quiz { id: string; title: string; description: string; questions: Array<{ id: string; text: string; options: string[]; correctAnswer: number; }>; pointsPerQuestion: number; } export default function QuizPage() { const router = useRouter(); const params = useParams(); const quizId = params.id as string; const [user, setUser] = useState(null); const [quiz, setQuiz] = useState(null); const [loading, setLoading] = useState(true); const [currentQuestion, setCurrentQuestion] = useState(0); const [answers, setAnswers] = useState>([]); const [completed, setCompleted] = useState(false); const [totalPoints, setTotalPoints] = useState(0); useEffect(() => { const token = localStorage.getItem("token"); if (!token) { router.push("/login"); return; } fetchData(); }, [router, quizId]); const fetchData = async () => { try { const token = localStorage.getItem("token"); const headers = { Authorization: `Bearer ${token}` }; const [userRes, quizRes] = await Promise.all([ fetch("/api/users/me", { headers }), fetch(`/api/quizzes/${quizId}`, { headers }) ]); if (!userRes.ok || !quizRes.ok) { throw new Error("Failed to fetch data"); } const userData = await userRes.json(); const quizData = await quizRes.json(); if (userData.success && userData.data) { setUser({ username: userData.data.name, points: userData.data.pointsBalance || 0, }); } if (quizData.success && quizData.data) { setQuiz(quizData.data); } } catch (error) { console.error("Error fetching data:", error); router.push("/tasks"); } finally { setLoading(false); } }; const handleAnswer = (selectedIndex: number, isCorrect: boolean) => { setAnswers([...answers, { selected: selectedIndex, correct: isCorrect }]); if (isCorrect && quiz) { setTotalPoints(totalPoints + quiz.pointsPerQuestion); } }; const handleNext = () => { if (quiz && currentQuestion < quiz.questions.length - 1) { setCurrentQuestion(currentQuestion + 1); } else { handleComplete(); } }; const handleComplete = async () => { setCompleted(true); try { await fetch(`/api/quizzes/${quizId}/complete`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ answers, points: totalPoints }) }); if (user) { setUser({ ...user, points: user.points + totalPoints }); } } catch (error) { console.error("Error completing quiz:", error); } }; if (loading) { return (
); } if (!user || !quiz) { return null; } const correctAnswers = answers.filter(a => a.correct).length; const totalQuestions = quiz.questions.length; const progressPercent = ((currentQuestion + (completed ? 1 : 0)) / totalQuestions) * 100; if (completed) { return ( <>

Quiz Complete!

Great job completing the quiz

Score

{correctAnswers}/{totalQuestions}

Accuracy

{Math.round((correctAnswers / totalQuestions) * 100)}%

Points Earned

+{totalPoints}

); } return ( <>

{quiz.title}

{quiz.description}

Question {currentQuestion + 1} of {totalQuestions} {quiz.pointsPerQuestion} points
{answers[currentQuestion] && ( )}
); }