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/exam"; import { calculateBandScore, getGradingLabel } from "@/utils/score"; import clsx from "clsx"; import { useRouter } from "next/router"; import { useEffect, useMemo, useState } from "react"; import { BsArrowCounterclockwise, BsBan, BsBook, BsClipboard, BsClipboardFill, BsEyeFill, BsHeadphones, BsMegaphone, BsPen, } from "react-icons/bs"; 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[]; practiceScores: Score[] information: { timeSpent?: number; inactivity?: number; }; solutions: UserSolution[]; isLoading: boolean; assignment?: Assignment; onViewResults: (moduleIndex?: number) => void; destination?: string } export default function Finish({ user, practiceScores, scores, modules, information, solutions, isLoading, assignment, onViewResults, destination }: Props) { const [selectedModule, setSelectedModule] = useState(modules[0]); const [selectedScore, setSelectedScore] = useState(scores.find((x) => x.module === modules[0])!); const [selectedPracticeScore, setSelectedPracticeScore] = useState(practiceScores.find((x) => x.module === modules[0])); const [isExtraInformationOpen, setIsExtraInformationOpen] = useState(false); const {selectedModules, exams, dispatch} = useExamStore((s) => s); const aiUsage = Math.round(ai_usage(solutions) * 100); const entity = useMemo(() => assignment?.entity || user.entities[0]?.id || "", [assignment?.entity, user.entities]) const { gradingSystem } = useGradingSystem(entity); const router = useRouter() useEffect(() => setSelectedScore(scores.find((x) => x.module === selectedModule)!), [scores, selectedModule]); useEffect(() => setSelectedPracticeScore(practiceScores.find((x) => x.module === selectedModule)!), [practiceScores, 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}; }; const handlePlayAgain = () => { dispatch({type: "INIT_EXAM", payload: {exams, modules: selectedModules}}) router.push(destination || "/exam") } 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} preview={false} 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 && selectedModule === "writing" && 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 (Graded)
{(selectedScore.total - selectedScore.correct).toString().padStart(2, "0")} Wrong (Graded)
{selectedPracticeScore && (
{selectedPracticeScore.correct} / {selectedPracticeScore.total} Practice Questions
)}
) : (
)}
)}
{!isLoading && (
Play Again
Review All
Review {capitalize(selectedModule)}
{(!!information.inactivity || !!information.timeSpent) && (
Extra Information
)}
)} ); }