fix(panel): keep WebSocket alive across route transitions
Some checks failed
Deploy to Production / test (push) Failing after 33s

Disconnecting and reconnecting the WebSocket on every route change caused
a race condition: the old socket's async onclose handler would null out
globalWs after the new socket was created, causing JOIN_ROOM messages to
be silently dropped. The WebSocket is a global singleton — keep it alive
and let the built-in reconnection logic handle actual disconnects.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
syntaxbullet
2026-04-02 14:03:35 +02:00
parent 9f105ada5e
commit 5527981fff

View File

@@ -1,4 +1,4 @@
import { useEffect, useRef, useCallback, useState } from "react";
import { useEffect, useCallback, useState } from "react";
type MessageHandler = (data: any) => void;
@@ -50,23 +50,11 @@ function connect(): void {
globalWs = ws;
}
function disconnect(): void {
if (reconnectTimer) {
clearTimeout(reconnectTimer);
reconnectTimer = null;
}
globalWs?.close();
globalWs = null;
globalConnected = false;
}
export function useWebSocket() {
const [connected, setConnected] = useState(globalConnected);
const refCount = useRef(0);
useEffect(() => {
refCount.current++;
if (refCount.current === 1 && !globalWs) {
if (!globalWs) {
connect();
}
@@ -78,10 +66,6 @@ export function useWebSocket() {
return () => {
globalHandlers.delete(handler);
refCount.current--;
if (refCount.current === 0) {
disconnect();
}
};
}, []);