teganmosi
Deploy Aria application with fixes for database, TTS, and WebSocket (LFS tracking applied)
f6d0a88 | // @ts-nocheck | |
| import { useEffect, useRef, useState, useCallback } from 'react' | |
| export const useWebSocket = (url, onMessage) => { | |
| const ws = useRef(null) | |
| const [isConnected, setIsConnected] = useState(false) | |
| const [error, setError] = useState(null) | |
| const connect = useCallback(() => { | |
| if (ws.current?.readyState === WebSocket.OPEN) return | |
| try { | |
| ws.current = new WebSocket(url) | |
| ws.current.onopen = () => { | |
| setIsConnected(true) | |
| setError(null) | |
| } | |
| ws.current.onmessage = (event) => { | |
| const data = JSON.parse(event.data) | |
| onMessage?.(data) | |
| } | |
| ws.current.onerror = () => { | |
| setError('Connection error') | |
| setIsConnected(false) | |
| } | |
| ws.current.onclose = () => { | |
| setIsConnected(false) | |
| } | |
| } catch { | |
| setError('Failed to connect') | |
| } | |
| }, [url, onMessage]) | |
| const disconnect = useCallback(() => { | |
| if (ws.current) { | |
| ws.current.close() | |
| ws.current = null | |
| setIsConnected(false) | |
| } | |
| }, []) | |
| const sendMessage = useCallback((message) => { | |
| if (ws.current?.readyState === WebSocket.OPEN) { | |
| ws.current.send(JSON.stringify(message)) | |
| return true | |
| } | |
| return false | |
| }, []) | |
| useEffect(() => { | |
| return () => { | |
| disconnect() | |
| } | |
| }, [disconnect]) | |
| return { | |
| connect, | |
| disconnect, | |
| sendMessage, | |
| isConnected, | |
| error, | |
| } | |
| } | |
| export default useWebSocket | |