import { Module } from "@/interfaces"; import { moduleLabels } from "@/utils/moduleUtils"; import clsx from "clsx"; import { ReactNode, useState } from "react"; import { BsBook, BsClipboard, BsHeadphones, BsMegaphone, BsPen, BsStopwatch } from "react-icons/bs"; import ProgressBar from "../Low/ProgressBar"; import Timer from "./Timer"; import { Exercise, LevelExam, MultipleChoiceExercise, ShuffleMap, UserSolution } from "@/interfaces/exam"; import { BsFillGrid3X3GapFill } from "react-icons/bs"; import Button from "../Low/Button"; import useExamStore from "@/stores/examStore"; import Modal from "../Modal"; import React from "react"; interface Props { minTimer: number; module: Module; examLabel?: string; label?: string; exerciseIndex: number; totalExercises: number; disableTimer?: boolean; partLabel?: string; showTimer?: boolean; showSolutions?: boolean; currentExercise?: Exercise; runOnClick?: ((questionIndex: number) => void) | undefined; } export default function ModuleTitle({ minTimer, module, label, examLabel, exerciseIndex, totalExercises, disableTimer = false, partLabel, showTimer = true, showSolutions = false, runOnClick = undefined }: Props) { const { userSolutions, partIndex, exam } = useExamStore((state) => state); const examExerciseIndex = useExamStore((state) => state.exerciseIndex) const [isOpen, setIsOpen] = useState(false); const moduleIcon: { [key in Module]: ReactNode } = { reading: , listening: , writing: , speaking: , level: , }; const isMultipleChoiceLevelExercise = () => { if (exam?.module === 'level' && typeof partIndex === "number" && partIndex > -1) { const currentExercise = (exam as LevelExam).parts[partIndex].exercises[examExerciseIndex]; return currentExercise && currentExercise.type === 'multipleChoice'; } return false; }; const renderMCQuestionGrid = () => { if (!isMultipleChoiceLevelExercise() && !userSolutions) return null; const currentExercise = (exam as LevelExam).parts[partIndex!].exercises[examExerciseIndex] as MultipleChoiceExercise; const userSolution = userSolutions!.find((x) => x.exercise.toString() == currentExercise.id.toString())!; const answeredQuestions = new Set(userSolution.solutions.map(sol => sol.question.toString())); const exerciseOffset = Number(currentExercise.questions[0].id); const lastExercise = exerciseOffset + (currentExercise.questions.length - 1); const getQuestionColor = (questionId: string, solution: string, userQuestionSolution: string | undefined) => { const questionShuffleMap = userSolutions.reduce((foundMap, userSolution) => { if (foundMap) return foundMap; return userSolution.shuffleMaps?.find(map => map.questionID.toString() === questionId.toString()) || null; }, null as ShuffleMap | null); const newSolution = questionShuffleMap ? questionShuffleMap?.map[solution] : solution; if (!userSolutions) return ""; if (!userQuestionSolution) { return "!bg-mti-gray-davy !border--mti-gray-davy !text-mti-gray-davy !text-white hover:!bg-gray-700"; } return userQuestionSolution === newSolution ? "!bg-mti-purple-light !text-mti-purple-light !text-white hover:!bg-mti-purple-dark" : "!bg-mti-rose-light !border-mti-rose-light !text-mti-rose-light !text-white hover:!bg-mti-rose-dark"; } return ( <>

{`Part ${partIndex + 1} (Questions ${exerciseOffset} - ${lastExercise})`}

{currentExercise.questions.map((_, index) => { const questionNumber = exerciseOffset + index; const isAnswered = answeredQuestions.has(questionNumber.toString()); const solution = currentExercise.questions.find((x) => x.id.toString() == questionNumber.toString())!.solution; const userQuestionSolution = currentExercise.userSolutions?.find((x) => x.question.toString() == questionNumber.toString())?.option; return ( ); })}

Click a question number to jump to that question

); }; return ( <> {showTimer && }
{partLabel && (
{partLabel.split("\n\n").map((partInstructions, index) => { if (index === 0) return (

{partInstructions}

); else return (
{partInstructions.split("\\n").map((line, lineIndex) => ( not correct')}}> ))}
); })}
)}
{moduleIcon[module]}
{module === "level" ? (examLabel ? examLabel : "Placement Test") : `${moduleLabels[module]} exam${label ? ` - ${label}` : ''}` } Question {exerciseIndex}/{totalExercises}
{isMultipleChoiceLevelExercise() && ( <> setIsOpen(false)} className="w-full max-w-md transform overflow-hidden rounded-2xl bg-white shadow-xl transition-all" > <> {renderMCQuestionGrid()} )}
); }