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]); 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}
); } 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)}
{!["writing", "speaking"].includes(selectedModule) ? (
{(((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
)} ); }