Basic web loop works

This commit is contained in:
Niels Geens
2024-11-07 15:10:17 +01:00
parent 6e78a0f0bd
commit 970414e56d
9 changed files with 218 additions and 132 deletions

View File

@@ -4,7 +4,7 @@ import { WebSocketState, MessageType } from '../constants';
export const useWebSocket = (url) => {
const [wsState, setWsState] = useState(WebSocketState.DISCONNECTED);
const wsRef = useRef(null);
const messageHandlersRef = useRef({});
const handlersRef = useRef([]);
const connect = useCallback(() => {
setWsState(WebSocketState.CONNECTING);
@@ -27,12 +27,7 @@ export const useWebSocket = (url) => {
ws.onmessage = (event) => {
try {
const message = JSON.parse(event.data);
const handler = messageHandlersRef.current[message.type];
if (handler) {
handler(message);
} else {
console.warn('No handler for message type:', message.type);
}
handlersRef.current.forEach(handler => handler(message));
} catch (error) {
console.error('Error handling WebSocket message:', error);
}
@@ -48,25 +43,21 @@ export const useWebSocket = (url) => {
};
}, [connect]);
const sendMessage = useCallback((type, data = null) => {
const sendMessage = useCallback((data) => {
if (wsRef.current?.readyState === WebSocket.OPEN) {
const message = {
type,
data: data || undefined
};
wsRef.current.send(JSON.stringify(message));
wsRef.current.send(JSON.stringify(data));
} else {
console.error('WebSocket not connected, state:', wsRef.current?.readyState);
}
}, []);
const setMessageHandler = useCallback((type, handler) => {
messageHandlersRef.current[type] = handler;
const addMessageHandler = useCallback((handler) => {
handlersRef.current.push(handler);
}, []);
return {
wsState,
sendMessage,
setMessageHandler
addMessageHandler
};
};