| import { useState, useEffect, useRef, useCallback } from 'react' |
|
|
| export function useWebSocket(sessionId) { |
| const [messages, setMessages] = useState([]) |
| const [isConnected, setIsConnected] = useState(false) |
| const wsRef = useRef(null) |
| const reconnectTimeoutRef = useRef(null) |
|
|
| const connect = useCallback(() => { |
| if (!sessionId) return |
|
|
| const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:' |
| const wsUrl = `${protocol}//${window.location.host}/api/ws/${sessionId}` |
|
|
| try { |
| wsRef.current = new WebSocket(wsUrl) |
|
|
| wsRef.current.onopen = () => { |
| setIsConnected(true) |
| console.log('WebSocket connected') |
| } |
|
|
| wsRef.current.onmessage = (event) => { |
| try { |
| const data = JSON.parse(event.data) |
| setMessages(prev => [...prev, data]) |
| } catch (e) { |
| console.error('Failed to parse WebSocket message:', e) |
| } |
| } |
|
|
| wsRef.current.onclose = () => { |
| setIsConnected(false) |
| console.log('WebSocket disconnected') |
|
|
| |
| reconnectTimeoutRef.current = setTimeout(() => { |
| connect() |
| }, 3000) |
| } |
|
|
| wsRef.current.onerror = (error) => { |
| console.error('WebSocket error:', error) |
| } |
| } catch (e) { |
| console.error('Failed to create WebSocket:', e) |
| } |
| }, [sessionId]) |
|
|
| const disconnect = useCallback(() => { |
| if (reconnectTimeoutRef.current) { |
| clearTimeout(reconnectTimeoutRef.current) |
| } |
| if (wsRef.current) { |
| wsRef.current.close() |
| } |
| }, []) |
|
|
| useEffect(() => { |
| if (sessionId) { |
| connect() |
| } |
|
|
| return () => { |
| disconnect() |
| } |
| }, [sessionId, connect, disconnect]) |
|
|
| const clearMessages = useCallback(() => { |
| setMessages([]) |
| }, []) |
|
|
| return { |
| messages, |
| isConnected, |
| clearMessages |
| } |
| } |
|
|