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, getGradingLabel} 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, BsBan, BsBook, BsClipboard, BsClipboardFill, BsEyeFill, BsHeadphones, BsMegaphone, BsPen, BsShareFill, } from "react-icons/bs"; import {LevelScore} from "@/constants/ielts"; import {getLevelScore} from "@/utils/score"; import {capitalize} from "lodash"; import Modal from "@/components/Modal"; import {UserSolution} from "@/interfaces/exam"; import ai_usage from "@/utils/ai.detection"; import useGradingSystem from "@/hooks/useGrading"; import {Assignment} from "@/interfaces/results"; interface Score { module: Module; correct: number; total: number; missing: number; } interface Props { user: User; modules: Module[]; scores: Score[]; information: { timeSpent?: number; inactivity?: number; }; solutions: UserSolution[]; isLoading: boolean; assignment?: Assignment; onViewResults: (moduleIndex?: number) => void; } export default function Finish({user, scores, modules, information, solutions, isLoading, assignment, onViewResults}: Props) { const [selectedModule, setSelectedModule] = useState(modules[0]); const [selectedScore, setSelectedScore] = useState(scores.find((x) => x.module === modules[0])!); const [isExtraInformationOpen, setIsExtraInformationOpen] = useState(false); const aiUsage = Math.round(ai_usage(solutions) * 100); const exams = useExamStore((state) => state.exams); const {gradingSystem} = useGradingSystem(); 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" || exam.module === "level") { 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 label = getGradingLabel(level, gradingSystem?.steps || []); return (
{label}
); } return {level}; }; return ( <> setIsExtraInformationOpen(false)}>
{!!information.timeSpent && ( Time Spent: {Math.floor(information.timeSpent / 60)} minute(s) )} {!!information.inactivity && ( Inactivity: {Math.floor(information.inactivity / 60)} minute(s) )}
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
{aiUsage >= 50 && user.type !== "student" && (
= 80, })}> AI Usage
)}
)} {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!
)} {assignment && !assignment.released && !isLoading && (
{/* */} This exam has not yet been released by its assigner.
You can check it later on your records page when it is released!
)} {!isLoading && !(assignment && !assignment.released) && (
{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 All
Review {capitalize(selectedModule)}
{(!!information.inactivity || !!information.timeSpent) && (
Extra Information
)}
)} ); }