/* eslint-disable @next/next/no-img-element */ import { MultipleChoiceExercise, MultipleChoiceQuestion, ShuffleMap } from "@/interfaces/exam"; import useExamStore from "@/stores/examStore"; import clsx from "clsx"; import { useEffect, useState } from "react"; import reactStringReplace from "react-string-replace"; import { CommonProps } from "."; import Button from "../Low/Button"; function Question({ id, variant, prompt, solution, options, userSolution, }: MultipleChoiceQuestion & { userSolution: string | undefined; onSelectOption?: (option: string) => void; showSolution?: boolean }) { const { userSolutions } = useExamStore((state) => state); /* const getShuffledOptions = (options: {id: string, text: string}[], questionShuffleMap: ShuffleMap) => { const shuffledOptions = ['A', 'B', 'C', 'D'].map(newId => { const originalId = questionShuffleMap.map[newId]; const originalOption = options.find(option => option.id === originalId); return { id: newId, text: originalOption!.text }; }); return shuffledOptions; } const getShuffledSolution = (originalSolution: string, questionShuffleMap: ShuffleMap) => { for (const [newPosition, originalPosition] of Object.entries(questionShuffleMap.map)) { if (originalPosition === originalSolution) { return newPosition; } } return originalSolution; } const questionShuffleMap = userSolutions.reduce((foundMap, userSolution) => { if (foundMap) return foundMap; return userSolution.shuffleMaps?.find(map => map.id === id) || null; }, null as ShuffleMap | null); */ const questionOptions = options; // questionShuffleMap ? getShuffledOptions(options as {id: string, text: string}[], questionShuffleMap) : options; const newSolution = solution; //questionShuffleMap ? getShuffledSolution(solution, questionShuffleMap) : solution; const renderPrompt = (prompt: string) => { return reactStringReplace(prompt, /(.*?<\/u>)/g, (match) => { const word = match.replaceAll("", "").replaceAll("", ""); return word.length > 0 ? {word} : null; }); }; const optionColor = (option: string) => { if (option === newSolution && !userSolution) { return "!border-mti-gray-davy !text-mti-gray-davy"; } if (option === newSolution) { return "!border-mti-purple-light !text-mti-purple-light"; } return userSolution === option ? "!border-mti-rose-light !text-mti-rose-light" : ""; }; return (
{isNaN(Number(id)) ? ( {renderPrompt(prompt).filter((x) => x?.toString() !== "")} ) : ( <> {id} - {renderPrompt(prompt).filter((x) => x?.toString() !== "")} )}
{variant === "image" && questionOptions.map((option) => (
{option?.id} {"src" in option && {`Option}
))} {variant === "text" && questionOptions.map((option) => (
{option?.id}. {option?.text}
))}
); } export default function MultipleChoice({ id, type, prompt, questions, userSolutions, onNext, onBack }: MultipleChoiceExercise & CommonProps) { const { questionIndex, setQuestionIndex } = useExamStore((state) => state); const calculateScore = () => { const total = questions.length; const correct = userSolutions.filter( (x) => questions.find((y) => y.id.toString() === x.question.toString())?.solution === x.option || false, ).length; const missing = total - userSolutions.filter((x) => questions.find((y) => y.id.toString() === x.question.toString())).length; return { total, correct, missing }; }; const next = () => { if (questionIndex === questions.length - 1) { onNext({ exercise: id, solutions: userSolutions, score: calculateScore(), type }); } else { setQuestionIndex(questionIndex + 1); } }; const back = () => { if (questionIndex === 0) { onBack({ exercise: id, solutions: userSolutions, score: calculateScore(), type }); } else { setQuestionIndex(questionIndex - 1); } }; return ( <>
{prompt} {userSolutions && questionIndex < questions.length && ( questions[questionIndex].id === x.question)?.option} /> )}
Correct
Unanswered
Wrong
); }