import { useState, useEffect, useRef } from 'react'; interface WebSocketMessage { type: string; data: any; timestamp?: string; } export function useWebSocket() { const [isConnected, setIsConnected] = useState(false); const [lastMessage, setLastMessage] = useState(null); const [error, setError] = useState(null); const wsRef = useRef(null); const reconnectTimeoutRef = useRef(null); const reconnectAttempts = useRef(0); const maxReconnectAttempts = 5; const connect = () => { try { const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; const wsUrl = `${protocol}//${window.location.host}/ws`; wsRef.current = new WebSocket(wsUrl); wsRef.current.onopen = () => { console.log('WebSocket connected'); setIsConnected(true); setError(null); reconnectAttempts.current = 0; }; wsRef.current.onmessage = (event) => { try { const message = JSON.parse(event.data); setLastMessage(message); } catch (err) { console.error('Failed to parse WebSocket message:', err); } }; wsRef.current.onclose = () => { console.log('WebSocket disconnected'); setIsConnected(false); // Attempt to reconnect if (reconnectAttempts.current < maxReconnectAttempts) { reconnectAttempts.current++; const delay = Math.min(1000 * Math.pow(2, reconnectAttempts.current), 30000); reconnectTimeoutRef.current = setTimeout(() => { console.log(`Attempting to reconnect... (${reconnectAttempts.current}/${maxReconnectAttempts})`); connect(); }, delay); } else { setError('Failed to connect after multiple attempts'); } }; wsRef.current.onerror = (error) => { console.error('WebSocket error:', error); setError('WebSocket connection error'); }; } catch (error) { console.error('Failed to create WebSocket connection:', error); setError('Failed to create WebSocket connection'); } }; const disconnect = () => { if (reconnectTimeoutRef.current) { clearTimeout(reconnectTimeoutRef.current); reconnectTimeoutRef.current = null; } if (wsRef.current) { wsRef.current.close(); wsRef.current = null; } setIsConnected(false); }; const sendMessage = (message: any) => { if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { wsRef.current.send(JSON.stringify(message)); } else { console.warn('WebSocket is not connected'); } }; useEffect(() => { connect(); return () => { disconnect(); }; }, []); return { isConnected, lastMessage, error, sendMessage, reconnect: connect, }; }