import React, { useEffect, useState, useCallback } from 'react'; import { useParams } from 'react-router-dom'; import { Container, Typography, Box, CircularProgress, Alert, TextField, Button } from '@mui/material'; import { useSession, Session, Participant, DesireSet, Decision, SessionState } from '../hooks/useSession'; import { webSocketService } from '../services/websocket'; import DesireForm from '../components/DesireForm'; import ResultsDisplay from '../components/ResultsDisplay'; const SessionPage = () => { const { sessionId } = useParams<{ sessionId: string }>(); const [session, setSession, sendMessage, clientId] = useSession(sessionId || ''); const [error, setError] = useState(null); const [expectedResponses, setExpectedResponses] = useState(2); const [topic, setTopic] = useState(''); const handleSetupSession = () => { sendMessage({ type: 'SETUP_SESSION', payload: { expectedResponses, topic } }); }; const handleSubmitDesires = (desires: { wants: string[], accepts: string[], noGoes: string[] }) => { if (!session || !clientId) return; const desireSet: DesireSet = { participantId: clientId, // Use the clientId from the hook wants: desires.wants, accepts: desires.accepts, noGoes: desires.noGoes, }; sendMessage({ type: 'SUBMIT_RESPONSE', payload: { response: desireSet }, }); }; if (!session) { return Loading session...; } const remainingResponses = session.expectedResponses - session.submittedCount; const hasSubmittedCurrentParticipant = session.responses && session.responses[clientId]; return ( {error && {error}} Session: {session.topic || session.sessionId} {session.state === SessionState.SETUP && ( Set Up the Session setTopic(e.target.value)} /> setExpectedResponses(parseInt(e.target.value, 10))} InputProps={{ inputProps: { min: 1 } }} /> )} {session.state !== SessionState.SETUP && ( <> Expected Responses: {session.expectedResponses} Status: {session.state} )} {session.state === SessionState.GATHERING && !hasSubmittedCurrentParticipant && ( )} {session.state === SessionState.GATHERING && hasSubmittedCurrentParticipant && ( Waiting for {remainingResponses} more responses... Your desires have been submitted. The results will be calculated once all participants have responded. )} {session.state === SessionState.HARMONIZING && ( Harmonizing Desires... )} {session.state === SessionState.FINAL && session.finalResult && ( )} ); }; export default SessionPage;