import Button from "@/components/Low/Button"; import ModuleTitle from "@/components/Medium/ModuleTitle"; import { moduleResultText } from "@/constants/ielts"; import { Module } from "@/interfaces"; import { User } from "@/interfaces/user"; import useExamStore from "@/stores/examStore"; import { calculateBandScore } from "@/utils/score"; import clsx from "clsx"; import Link from "next/link"; import { useRouter } from "next/router"; import { Fragment, useEffect, useState } from "react"; import { BsArrowCounterclockwise, BsBook, BsClipboard, BsEyeFill, BsHeadphones, BsMegaphone, BsPen, BsShareFill, } from "react-icons/bs"; import { LevelScore } from "@/constants/ielts"; import { getLevelScore } from "@/utils/score"; interface Score { module: Module; correct: number; total: number; missing: number; } interface Props { user: User; modules: Module[]; scores: Score[]; isLoading: boolean; onViewResults: () => void; } export default function Finish({ user, scores, modules, isLoading, onViewResults, }: Props) { const [selectedModule, setSelectedModule] = useState(modules[0]); const [selectedScore, setSelectedScore] = useState( scores.find((x) => x.module === modules[0])!, ); const exams = useExamStore((state) => state.exams); useEffect( () => setSelectedScore(scores.find((x) => x.module === selectedModule)!), [scores, selectedModule], ); useEffect(() => console.log(scores), [scores]); const moduleColors: { [key in Module]: { progress: string; inner: string } } = { reading: { progress: "text-ielts-reading", inner: "bg-ielts-reading-light", }, listening: { progress: "text-ielts-listening", inner: "bg-ielts-listening-light", }, writing: { progress: "text-ielts-writing", inner: "bg-ielts-writing-light", }, speaking: { progress: "text-ielts-speaking", inner: "bg-ielts-speaking-light", }, level: { progress: "text-ielts-level", inner: "bg-ielts-level-light", }, }; const getTotalExercises = () => { const exam = exams.find((x) => x.module === selectedModule)!; if (exam.module === "reading" || exam.module === "listening") { return exam.parts.flatMap((x) => x.exercises).length; } return exam.exercises.length; }; const bandScore: number = calculateBandScore( selectedScore.correct, selectedScore.total, selectedModule, user.focus, ); const showLevel = (level: number) => { if (selectedModule === "level") { const [levelStr, grade] = getLevelScore(level); return (
{levelStr} {grade}
); } return {level}; }; return ( <>
x.module === selectedModule)!.minTimer} disableTimer />
{modules.includes("reading") && (
setSelectedModule("reading")} className={clsx( "hover:bg-ielts-reading flex cursor-pointer items-center gap-2 rounded-xl p-4 transition duration-300 ease-in-out hover:text-white hover:shadow-lg", selectedModule === "reading" ? "bg-ielts-reading text-white" : "bg-mti-gray-smoke text-ielts-reading", )} > Reading
)} {modules.includes("listening") && (
setSelectedModule("listening")} className={clsx( "hover:bg-ielts-listening flex cursor-pointer items-center gap-2 rounded-xl p-4 transition duration-300 ease-in-out hover:text-white hover:shadow-lg", selectedModule === "listening" ? "bg-ielts-listening text-white" : "bg-mti-gray-smoke text-ielts-listening", )} > Listening
)} {modules.includes("writing") && (
setSelectedModule("writing")} className={clsx( "hover:bg-ielts-writing flex cursor-pointer items-center gap-2 rounded-xl p-4 transition duration-300 ease-in-out hover:text-white hover:shadow-lg", selectedModule === "writing" ? "bg-ielts-writing text-white" : "bg-mti-gray-smoke text-ielts-writing", )} > Writing
)} {modules.includes("speaking") && (
setSelectedModule("speaking")} className={clsx( "hover:bg-ielts-speaking flex cursor-pointer items-center gap-2 rounded-xl p-4 transition duration-300 ease-in-out hover:text-white hover:shadow-lg", selectedModule === "speaking" ? "bg-ielts-speaking text-white" : "bg-mti-gray-smoke text-ielts-speaking", )} > Speaking
)} {modules.includes("level") && (
setSelectedModule("level")} className={clsx( "hover:bg-ielts-level flex cursor-pointer items-center gap-2 rounded-xl p-4 transition duration-300 ease-in-out hover:text-white hover:shadow-lg", selectedModule === "level" ? "bg-ielts-level text-white" : "bg-mti-gray-smoke text-ielts-level", )} > Level
)}
{isLoading && (
Evaluating your answers, please be patient...
You can also check it later on your records page!
)} {!isLoading && (
{moduleResultText(selectedModule, bandScore)}
Level {showLevel(bandScore)}
{( ((selectedScore.total - selectedScore.missing) / selectedScore.total) * 100 ).toFixed(0)} % Completion
{selectedScore.correct.toString().padStart(2, "0")} Correct
{(selectedScore.total - selectedScore.correct) .toString() .padStart(2, "0")} Wrong
)}
{!isLoading && (
Play Again
Review Answers
)} ); }