import { useServer } from "@/stores/app"; import { useEffect, useRef, useState } from "react"; type UseWebsocketOptions = { onMessage?: (message: string) => void; }; export const useWebSocket = (url: string, opt?: UseWebsocketOptions) => { const [isConnected, setIsConnected] = useState(false); const websocketRef = useRef(null); useEffect(() => { // Create WebSocket connection const ws = new WebSocket(url); websocketRef.current = ws; // Connection opened ws.onopen = () => { setIsConnected(true); console.log("WebSocket connected"); }; // Listen for messages ws.onmessage = (event) => { opt?.onMessage?.(event.data); }; // Connection closed ws.onclose = () => { setIsConnected(false); console.log("WebSocket disconnected"); }; // Cleanup on unmount return () => { ws.close(); }; }, [url]); // Send message function const send = (msg: string) => { if (isConnected && websocketRef.current) { websocketRef.current.send(msg); } }; return { isConnected, send }; }; export const useWebsocketUrl = (initParams: any = {}) => { const server = useServer(); const baseUrl = server?.replace("http://", "ws://").replace("https://", "wss://") || ""; return (url: string, params: any = {}) => { const query = new URLSearchParams({ ...initParams, ...params }); return `${baseUrl}/ws/${url}?${query}`; }; };