diff --git a/web/src/App.tsx b/web/src/App.tsx index f0a995f..f4c9d07 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -273,6 +273,17 @@ function Sala({ * blanco sin que nada diga que algo está pasando. */ const [cargandoFrame, setCargandoFrame] = useState(false); + + /** + * Ya llegó el estado de la sala (el `joined`). + * + * Sin esto, entre que el socket conecta y el server responde, el chat vacío se + * ve IGUAL que una sala donde nadie ha hablado. Con internet lento eso son + * varios segundos, y en las sesiones con estudiantes fue lo más reportado: + * recargaban, veían todo en blanco y creían que habían perdido su trabajo. + * Nadie perdió nada, faltaba decirles que estaban esperando. + */ + const [unido, setUnido] = useState(false); const [draft, setDraft] = useState(""); /** * El nombre de la sala, o null si nadie la ha nombrado (ahí se ve el id). @@ -459,6 +470,10 @@ function Sala({ const socket = connectSocket(); socketRef.current = socket; + // Se cayó la conexión. Socket.io reconecta solo, así que esto no arregla + // nada: solo evita que la sala se vea normal mientras ya no llega nada. + socket.on("disconnect", () => setUnido(false)); + socket.on("connect", () => { socket.emit("join", { roomId, name }); // La key ya configurada viaja sola: no se pide de nuevo en cada sala. @@ -467,6 +482,7 @@ function Sala({ }); socket.on("joined", (p: JoinedPayload) => { + setUnido(true); setMembers(p.members); setNombre(p.nombre ?? null); recordarNombre(roomId, p.nombre ?? null); @@ -905,6 +921,12 @@ function Sala({