feat(results): add resutls page

fix(leaderboard): fix leaderboard fetch logic

fix(test): fix navigation bug upon test quit
This commit is contained in:
shafin-r
2026-02-10 19:32:46 +06:00
parent 8cfcb11f0a
commit 7f82e640e0
17 changed files with 560 additions and 82 deletions

View File

@ -1,5 +1,5 @@
import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
import { Navigate, useNavigate } from "react-router-dom";
import {
Card,
CardContent,
@ -39,6 +39,7 @@ import {
} from "../../../components/ui/dialog";
import { useExamNavigationGuard } from "../../../hooks/useExamNavGuard";
import { useExamConfigStore } from "../../../stores/useExamConfigStore";
import { useResults } from "../../../stores/useResults";
export const Test = () => {
const sheetId = localStorage.getItem("activePracticeSheetId");
@ -79,6 +80,8 @@ export const Test = () => {
const goToQuestion = useSatExam((s) => s.goToQuestion);
const finishExam = useSatExam((s) => s.finishExam);
const quitExam = useSatExam((s) => s.quitExam);
const setResults = useResults((s) => s.setResults);
const startExam = async () => {
if (!user || !sheetId) return;
@ -181,6 +184,11 @@ export const Test = () => {
if (next?.status === "COMPLETED") {
useExamConfigStore.getState().clearPayload();
console.log(next.results);
setResults(next.results);
// ✅ Store results first
finishExam();
} else {
await loadSessionQuestions(sessionId);
@ -190,14 +198,20 @@ export const Test = () => {
const handleQuitExam = () => {
useExamConfigStore.getState().clearPayload();
finishExam();
navigate("/student/home");
quitExam();
};
useEffect(() => {
resetExam(); // ✅ important
}, [sheetId]);
useEffect(() => {
return () => {
resetExam();
};
}, []);
useEffect(() => {
if (phase === "FINISHED") {
const timer = setTimeout(() => {
@ -402,7 +416,7 @@ export const Test = () => {
{currentQuestion?.context && (
<section className="h-100 overflow-y-auto px-10 pt-30">
<p className="font-satoshi tracking-wide text-lg">
{currentQuestion?.context}
{renderQuestionText(currentQuestion?.context)}
</p>
</section>
)}
@ -611,6 +625,8 @@ export const Test = () => {
<p className="text-lg text-gray-500">Redirecting to results...</p>
</div>
);
case "QUIT":
return <Navigate to="/student/home" replace />;
default:
return null;