"use client"; import { useState, useEffect, useCallback } from "react"; type Question = { id: string; questionText: string; options: string[]; order: number }; type Quiz = { id: string; windowStart: string | Date; windowEnd: string | Date; isProcessed: boolean; questions: Question[]; }; function useCountdown(target: Date) { const calc = useCallback(() => Math.max(0, target.getTime() - Date.now()), [target]); const [ms, setMs] = useState(calc); useEffect(() => { const t = setInterval(() => setMs(calc()), 1000); return () => clearInterval(t); }, [calc]); const s = Math.floor(ms / 1000); return { hours: Math.floor(s / 3600), minutes: Math.floor((s % 3600) / 60), seconds: s % 60, done: ms === 0 }; } function CountdownUnit({ value, label }: { value: number; label: string }) { return (
{String(value).padStart(2, "0")}
{label}
); } export default function DailyQuizClient({ quiz, alreadySubmitted, }: { quiz: Quiz | null; alreadySubmitted: boolean; }) { const [answers, setAnswers] = useState<(number | null)[]>( quiz ? Array(quiz.questions.length).fill(null) : [] ); const [step, setStep] = useState(0); const [submitted, setSubmitted] = useState(alreadySubmitted); const [result, setResult] = useState<{ score: number; correct: number; total: number; rewardTier: "GOLD" | "SILVER" | "BRONZE" | null; rewardTierLabel: string | null; } | null>(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const windowEnd = quiz ? new Date(quiz.windowEnd) : new Date(); const windowStart = quiz ? new Date(quiz.windowStart) : new Date(); const countdown = useCountdown(windowEnd); const startCountdown = useCountdown(windowStart); const now = new Date(); const isProcessed = quiz?.isProcessed ?? false; const isActive = quiz ? !isProcessed && now >= windowStart && now <= windowEnd : false; const notStarted = quiz ? !isProcessed && now < windowStart : false; async function handleSubmit() { if (!quiz) return; if (answers.some((a) => a === null)) { setError("لطفاً به همه سوالات پاسخ دهید"); return; } setLoading(true); setError(""); const res = await fetch("/api/quiz/submit", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ quizId: quiz.id, answers }), }); const data = await res.json(); if (res.ok) { setResult(data); setSubmitted(true); } else { setError(data.error ?? "خطا"); } setLoading(false); } if (!quiz) { return (
*

کوییزی برای امروز وجود ندارد

فردا دوباره بیا

); } if (submitted) { return (
{result ? ( <>
{result.score === 100 ? "*" : result.score >= 50 ? "+" : "-"}

نتیجه شما

{result.score}%

{result.correct} از {result.total} سوال صحیح

{result.score === 100 && (

شما در قرعه‌کشی Golden Card شرکت دارید

)} ) : ( <>
OK

پاسخ‌های شما ثبت شد

)}
); } if (notStarted) { return (

کوییز هنوز شروع نشده و در این زمان باز می‌شود:

); } if (!isActive) { return (
!

{isProcessed ? "این کوییز بعد از قرعه‌کشی بسته شده است" : "بازه زمانی کوییز به پایان رسیده"}

); } const q = quiz.questions[step]; const progress = ((step + 1) / quiz.questions.length) * 100; return (

کوییز روزانه

پاسخ صحیح = شانس برنده شدن Golden Card

سوال {step + 1} از {quiz.questions.length} {Math.round(progress)}%

{q.questionText}

{q.options.map((opt, oi) => ( ))}
{error &&

{error}

}
{step > 0 && ( )} {step < quiz.questions.length - 1 ? ( ) : ( )}
); }