import React, { useEffect, useState } from 'react'; import { Socket } from 'socket.io-client'; import { ENV_VARIABLES } from 'src/constants'; import StudentModeQuiz from 'src/components/StudentModeQuiz/StudentModeQuiz'; import TeacherModeQuiz from 'src/components/TeacherModeQuiz/TeacherModeQuiz'; import webSocketService, { AnswerSubmissionToBackendType } from '../../../services/WebsocketService'; import DisconnectButton from 'src/components/DisconnectButton/DisconnectButton'; import './joinRoom.css'; import { QuestionType } from '../../../Types/QuestionType'; import { TextField } from '@mui/material'; import LoadingButton from '@mui/lab/LoadingButton'; import LoginContainer from 'src/components/LoginContainer/LoginContainer' import ApiService from '../../../services/ApiService' const JoinRoom: React.FC = () => { const [roomName, setRoomName] = useState(''); const [username, setUsername] = useState(ApiService.getUsername()); const [socket, setSocket] = useState(null); const [isWaitingForTeacher, setIsWaitingForTeacher] = useState(false); const [question, setQuestion] = useState(); const [quizMode, setQuizMode] = useState(); const [questions, setQuestions] = useState([]); const [connectionError, setConnectionError] = useState(''); const [isConnecting, setIsConnecting] = useState(false); useEffect(() => { handleCreateSocket(); return () => { disconnect(); }; }, []); const handleCreateSocket = () => { console.log(`JoinRoom: handleCreateSocket: ${ENV_VARIABLES.VITE_BACKEND_URL}`); const socket = webSocketService.connect(ENV_VARIABLES.VITE_BACKEND_URL); socket.on('join-success', (roomJoinedName) => { setIsWaitingForTeacher(true); setIsConnecting(false); console.log(`on(join-success): Successfully joined the room ${roomJoinedName}`); }); socket.on('next-question', (question: QuestionType) => { console.log('on(next-question): Received next-question:', question); setQuizMode('teacher'); setIsWaitingForTeacher(false); setQuestion(question); }); socket.on('launch-student-mode', (questions: QuestionType[]) => { console.log('on(launch-student-mode): Received launch-student-mode:', questions); setQuizMode('student'); setIsWaitingForTeacher(false); setQuestions(questions); setQuestion(questions[0]); }); socket.on('end-quiz', () => { disconnect(); }); socket.on('join-failure', (message) => { console.log('Failed to join the room.'); setConnectionError(`Erreur de connexion : ${message}`); setIsConnecting(false); }); socket.on('connect_error', (error) => { switch (error.message) { case 'timeout': setConnectionError("JoinRoom: timeout: Le serveur n'est pas disponible"); break; case 'websocket error': setConnectionError("JoinRoom: websocket error: Le serveur n'est pas disponible"); break; } setIsConnecting(false); console.log('Connection Error:', error.message); }); setSocket(socket); }; const disconnect = () => { localStorage.clear(); webSocketService.disconnect(); setSocket(null); setQuestion(undefined); setIsWaitingForTeacher(false); setQuizMode(''); setRoomName(''); setUsername(''); setIsConnecting(false); }; const handleSocket = () => { setIsConnecting(true); setConnectionError(''); if (!socket?.connected) { handleCreateSocket(); } if (username && roomName) { console.log(`Tentative de rejoindre : ${roomName}, utilisateur : ${username}`); webSocketService.joinRoom(roomName, username); } }; const handleOnSubmitAnswer = (answer: string | number | boolean, idQuestion: number) => { const answerData: AnswerSubmissionToBackendType = { roomName: roomName, answer: answer, username: username, idQuestion: idQuestion }; localStorage.setItem(`Answer${idQuestion}`, JSON.stringify(answer)); webSocketService.submitAnswer(answerData); }; const handleReturnKey = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && username && roomName) { handleSocket(); } }; if (isWaitingForTeacher) { return (
Salle: {roomName}
En attente que le professeur lance le questionnaire...
); } switch (quizMode) { case 'student': return ( ); case 'teacher': return ( question && ( ) ); default: return ( setRoomName(e.target.value.toUpperCase())} placeholder="Nom de la salle" sx={{ marginBottom: '1rem' }} fullWidth={true} onKeyDown={handleReturnKey} /> setUsername(e.target.value)} placeholder="Nom d'utilisateur" sx={{ marginBottom: '1rem' }} fullWidth={true} onKeyDown={handleReturnKey} /> Rejoindre ); } }; export default JoinRoom;