First cut

This commit is contained in:
khalid@traclabs.com
2026-04-18 15:22:12 -05:00
commit 270e088c15
21 changed files with 6663 additions and 0 deletions

35
src/hooks/useJobSocket.js Normal file
View File

@@ -0,0 +1,35 @@
import { useEffect, useRef, useCallback } from 'react';
/**
* Connect to the server WebSocket.
* @param {(msg: object) => void} onMessage Called with parsed JSON messages.
*/
export function useJobSocket(onMessage) {
const wsRef = useRef(null);
const onMessageRef = useRef(onMessage);
onMessageRef.current = onMessage;
const connect = useCallback(() => {
const proto = location.protocol === 'https:' ? 'wss' : 'ws';
const ws = new WebSocket(`${proto}://${location.host}/ws`);
wsRef.current = ws;
ws.onmessage = (e) => {
try {
onMessageRef.current(JSON.parse(e.data));
} catch (_) {}
};
ws.onclose = () => {
// Auto-reconnect after 2 s
setTimeout(connect, 2000);
};
return ws;
}, []);
useEffect(() => {
const ws = connect();
return () => ws.close();
}, [connect]);
}