// NumericalQuestion.tsx import React, { useState, useEffect } from 'react'; import '../questionStyle.css'; import { Button, TextField } from '@mui/material'; import { FormattedTextTemplate } from '../../GiftTemplate/templates/TextTypeTemplate'; import { NumericalQuestion, SimpleNumericalAnswer, RangeNumericalAnswer, HighLowNumericalAnswer } from 'gift-pegjs'; import { isSimpleNumericalAnswer, isRangeNumericalAnswer, isHighLowNumericalAnswer, isMultipleNumericalAnswer } from 'gift-pegjs/typeGuards'; import { StudentType } from 'src/Types/StudentType'; import { AnswerType } from 'src/pages/Student/JoinRoom/JoinRoom'; interface Props { question: NumericalQuestion; handleOnSubmitAnswer?: (answer: AnswerType) => void; showAnswer?: boolean; passedAnswer?: AnswerType; students?: StudentType[]; isDisplayOnly?: boolean; } const NumericalQuestionDisplay: React.FC = (props) => { const { question, showAnswer, handleOnSubmitAnswer, students, passedAnswer, isDisplayOnly } = props; const [answer, setAnswer] = useState(passedAnswer || []); const correctAnswers = question.choices; let correctAnswer = ''; const [showCorrectAnswers, setShowCorrectAnswers] = useState(false); const [correctAnswerRate, setCorrectAnswerRate] = useState(0); const [submissionCounts, setSubmissionCounts] = useState({ correctSubmissions: 0, totalSubmissions: 0 }); const toggleShowCorrectAnswers = () => { setShowCorrectAnswers(!showCorrectAnswers); }; useEffect(() => { if (passedAnswer !== null && passedAnswer !== undefined) { setAnswer(passedAnswer); } if (showCorrectAnswers && students) { calculateCorrectAnswerRate(); } }, [passedAnswer, showCorrectAnswers, students]); const calculateCorrectAnswerRate = () => { if (!students || students.length === 0) { setSubmissionCounts({ correctSubmissions: 0, totalSubmissions: 0 }); return; } const totalSubmissions = students.length; const correctSubmissions = students.filter(student => student.answers.some(ans => ans.idQuestion === Number(question.id) && ans.isCorrect ) ).length; setSubmissionCounts({ correctSubmissions, totalSubmissions }); setCorrectAnswerRate((correctSubmissions / totalSubmissions) * 100); }; //const isSingleAnswer = correctAnswers.length === 1; if (isSimpleNumericalAnswer(correctAnswers[0])) { correctAnswer = `${(correctAnswers[0] as SimpleNumericalAnswer).number}`; } else if (isRangeNumericalAnswer(correctAnswers[0])) { const choice = correctAnswers[0] as RangeNumericalAnswer; correctAnswer = `Entre ${choice.number - choice.range} et ${choice.number + choice.range}`; } else if (isHighLowNumericalAnswer(correctAnswers[0])) { const choice = correctAnswers[0] as HighLowNumericalAnswer; correctAnswer = `Entre ${choice.numberLow} et ${choice.numberHigh}`; } else if (isMultipleNumericalAnswer(correctAnswers[0])) { correctAnswer = `MultipleNumericalAnswer is not supported yet`; } else { throw new Error('Unknown numerical answer type'); } return (
{showAnswer ? ( <>
La bonne réponse est: {correctAnswer}
Votre réponse est: {answer.toString()} {question.formattedGlobalFeedback &&
} ) : ( <>
) => { setAnswer([e.target.valueAsNumber]); }} inputProps={{ 'data-testid': 'number-input' }} />
{question.formattedGlobalFeedback && showAnswer && (
)} {handleOnSubmitAnswer && ( )} )} {isDisplayOnly && ( <>
Taux de réponse correcte: {submissionCounts.correctSubmissions}/{submissionCounts.totalSubmissions}
{correctAnswerRate.toFixed(1)}%
)}
); }; export default NumericalQuestionDisplay;