// LiveResults.tsx import React, { useMemo, useState } from 'react'; import { Socket } from 'socket.io-client'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faCheck, faCircleXmark } from '@fortawesome/free-solid-svg-icons'; import { QuestionType } from '../../Types/QuestionType'; import './liveResult.css'; import { FormControlLabel, FormGroup, Paper, Switch, Table, TableBody, TableCell, TableContainer, TableFooter, TableHead, TableRow } from '@mui/material'; import { StudentType } from '../../Types/StudentType'; import { FormattedTextTemplate } from '../GiftTemplate/templates/TextTypeTemplate'; interface LiveResultsProps { socket: Socket | null; questions: QuestionType[]; showSelectedQuestion: (index: number) => void; quizMode: 'teacher' | 'student'; students: StudentType[] } const LiveResults: React.FC = ({ questions, showSelectedQuestion, students }) => { const [showUsernames, setShowUsernames] = useState(false); const [showCorrectAnswers, setShowCorrectAnswers] = useState(false); const maxQuestions = questions.length; const getStudentGrade = (student: StudentType): number => { if (student.answers.length === 0) { return 0; } const uniqueQuestions = new Set(); let correctAnswers = 0; for (const answer of student.answers) { const { idQuestion, isCorrect } = answer; if (!uniqueQuestions.has(idQuestion)) { uniqueQuestions.add(idQuestion); if (isCorrect) { correctAnswers++; } } } return (correctAnswers / questions.length) * 100; }; const classAverage: number = useMemo(() => { let classTotal = 0; students.forEach((student) => { classTotal += getStudentGrade(student); }); return classTotal / students.length; }, [students]); const getCorrectAnswersPerQuestion = (index: number): number => { return ( (students.filter((student) => student.answers.some( (answer) => parseInt(answer.idQuestion.toString()) === index + 1 && answer.isCorrect ) ).length / students.length) * 100 ); }; return (
Résultats du quiz
Afficher les noms
} control={ ) => setShowUsernames(e.target.checked) } /> } /> Afficher les réponses
} control={ ) => setShowCorrectAnswers(e.target.checked) } /> } />
Nom d'utilisateur
{Array.from({ length: maxQuestions }, (_, index) => ( showSelectedQuestion(index)} >
{`Q${index + 1}`}
))}
% réussite
{students.map((student) => (
{showUsernames ? student.name : '******'}
{Array.from({ length: maxQuestions }, (_, index) => { const answer = student.answers.find( (answer) => parseInt(answer.idQuestion.toString()) === index + 1 ); const answerText = answer ? answer.answer.toString() : ''; const isCorrect = answer ? answer.isCorrect : false; return ( {showCorrectAnswers ? (
) : isCorrect ? ( ) : ( answerText !== '' && ( ) )}
); })} {getStudentGrade(student).toFixed()} %
))}
% réussite
{Array.from({ length: maxQuestions }, (_, index) => ( {students.length > 0 ? `${getCorrectAnswersPerQuestion(index).toFixed()} %` : '-'} ))} {students.length > 0 ? `${classAverage.toFixed()} %` : '-'}
); }; export default LiveResults;