import { useEffect, useMemo, useState, type ReactNode } from "react"; import { WebsocketContext, type WebSocketConextValue } from "../context/WebSocketContext"; import useWebSocket from "react-use-websocket"; import { wsConfig } from "../config/wsconfig"; import type { InfoBarData } from "../../types/types"; type WebSocketProviderProps = { children: ReactNode; }; export const WebSocketProvider = ({ children }: WebSocketProviderProps) => { const [systemData, setSystemData] = useState(null); const infoSocket = useWebSocket(wsConfig.infoBar, { share: true, shouldReconnect: () => true }); const cameraFeedASocket = useWebSocket(wsConfig.cameraFeedA, { share: true, shouldReconnect: () => true }); const cameraFeedBSocket = useWebSocket(wsConfig.cameraFeedB, { share: true, shouldReconnect: () => true }); const cameraFeedCSocket = useWebSocket(wsConfig.cameraFeedC, { share: true, shouldReconnect: () => true }); useEffect(() => { async function parseData() { if (infoSocket.lastMessage) { const text = await infoSocket.lastMessage.data.text(); const data = JSON.parse(text); setSystemData(data); } } parseData(); }, [infoSocket.lastMessage]); const value = useMemo( () => ({ info: { data: systemData, readyState: infoSocket.readyState, sendJson: infoSocket.sendJsonMessage, }, cameraFeedA: { data: null, readyState: cameraFeedASocket.readyState, send: cameraFeedASocket.sendMessage, }, cameraFeedB: { data: null, readyState: cameraFeedBSocket.readyState, send: cameraFeedBSocket.sendMessage, }, cameraFeedC: { data: null, readyState: cameraFeedCSocket.readyState, send: cameraFeedCSocket.sendMessage, }, }), [ cameraFeedASocket.readyState, cameraFeedASocket.sendMessage, cameraFeedBSocket.readyState, cameraFeedBSocket.sendMessage, cameraFeedCSocket.readyState, cameraFeedCSocket.sendMessage, infoSocket.readyState, infoSocket.sendJsonMessage, systemData, ], ); return {children}; };