"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 ? (
) : (
)}
);
}