import Button from "@/components/Low/Button"; import Modal from "@/components/Modal"; import { Exam, LevelExam, MultipleChoiceExercise, ShuffleMap } from "@/interfaces/exam"; import useExamStore from "@/stores/examStore"; import clsx from "clsx"; import { useMemo, useState } from "react"; import { BsFillGrid3X3GapFill } from "react-icons/bs"; interface Props { exam: LevelExam showSolutions: boolean; runOnClick: ((index: number) => void) | undefined; } const MCQuestionGrid: React.FC = ({ exam, showSolutions, runOnClick }) => { const [isOpen, setIsOpen] = useState(false); const { userSolutions, partIndex: sectionIndex, exerciseIndex, } = useExamStore((state) => state); const currentExercise = useMemo(() => (exam as LevelExam).parts[sectionIndex!].exercises[exerciseIndex] as MultipleChoiceExercise, [exam, exerciseIndex, sectionIndex]) const userSolution = useMemo(() => userSolutions!.find((x) => x.exercise.toString() == currentExercise.id.toString())!, [currentExercise.id, userSolutions]) const answeredQuestions = useMemo(() => new Set(userSolution.solutions.map(sol => sol.question.toString())), [userSolution.solutions]) const exerciseOffset = useMemo(() => Number(currentExercise.questions[0].id), [currentExercise.questions]) const lastExercise = useMemo(() => exerciseOffset + (currentExercise.questions.length - 1), [currentExercise.questions.length, exerciseOffset]); 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 ( <> setIsOpen(false)} className="w-full max-w-md transform overflow-hidden rounded-2xl bg-white shadow-xl transition-all" > <>

{`Part ${sectionIndex + 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

); } export default MCQuestionGrid;