import Button from "@/components/Low/Button"; import ModuleTitle from "@/components/Medium/ModuleTitle"; import {levelText, LEVEL_TEXT} 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, BsEyeFill, BsHeadphones, BsMegaphone, BsPen, BsShareFill} from "react-icons/bs"; 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", }, }; return ( <>
x.module === selectedModule)!.exercises.length} exerciseIndex={exams.find((x) => x.module === selectedModule)!.exercises.length} minTimer={exams.find((x) => x.module === selectedModule)!.minTimer} disableTimer />
{modules.includes("reading") && (
setSelectedModule("reading")} className={clsx( "flex gap-2 items-center rounded-xl p-4 cursor-pointer hover:shadow-lg transition duration-300 ease-in-out hover:bg-ielts-reading hover:text-white", selectedModule === "reading" ? "bg-ielts-reading text-white" : "bg-mti-gray-smoke text-ielts-reading", )}> Reading
)} {modules.includes("listening") && (
setSelectedModule("listening")} className={clsx( "flex gap-2 items-center rounded-xl p-4 cursor-pointer hover:shadow-lg transition duration-300 ease-in-out hover:bg-ielts-listening hover:text-white", selectedModule === "listening" ? "bg-ielts-listening text-white" : "bg-mti-gray-smoke text-ielts-listening", )}> Listening
)} {modules.includes("writing") && (
setSelectedModule("writing")} className={clsx( "flex gap-2 items-center rounded-xl p-4 cursor-pointer hover:shadow-lg transition duration-300 ease-in-out hover:bg-ielts-writing hover:text-white", selectedModule === "writing" ? "bg-ielts-writing text-white" : "bg-mti-gray-smoke text-ielts-writing", )}> Writing
)} {modules.includes("speaking") && (
setSelectedModule("speaking")} className={clsx( "flex gap-2 items-center rounded-xl p-4 cursor-pointer hover:shadow-lg transition duration-300 ease-in-out hover:bg-ielts-speaking hover:text-white", selectedModule === "speaking" ? "bg-ielts-speaking text-white" : "bg-mti-gray-smoke text-ielts-speaking", )}> Speaking
)}
{isLoading && (
Evaluating your answers...
)} {!isLoading && (
{levelText(calculateBandScore(selectedScore.correct, selectedScore.total, selectedModule, user.focus))}
Level {calculateBandScore(selectedScore.correct, selectedScore.total, selectedModule, user.focus)}
{(((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
)} ); }