File size: 1,443 Bytes
f6d0a88 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | // @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
|