Aria / frontend /src /hooks /useWebSocket.ts
teganmosi
Deploy Aria application with fixes for database, TTS, and WebSocket (LFS tracking applied)
f6d0a88
Raw
History Blame Contribute Delete
1.44 kB
// @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