File size: 924 Bytes
00a912e | 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 | import type { ServerToClientEvents } from '@music-together/shared'
import { useSocketContext } from '@/providers/socket-context'
import { useEffect, useEffectEvent } from 'react'
/**
* Generic hook to subscribe to a typed Socket.IO event.
* Automatically handles on/off lifecycle and keeps the handler reference stable.
*
* @example
* useSocketEvent(EVENTS.ROOM_STATE, useCallback((room) => { ... }, []))
*/
export function useSocketEvent<E extends keyof ServerToClientEvents>(event: E, handler: ServerToClientEvents[E]) {
const { socket } = useSocketContext()
const onEvent = useEffectEvent((...args: unknown[]) => {
;(handler as unknown as (...eventArgs: unknown[]) => void)(...args)
})
useEffect(() => {
const wrapper = onEvent as unknown as ServerToClientEvents[E]
socket.on(event, wrapper as never)
return () => {
socket.off(event, wrapper as never)
}
}, [socket, event])
}
|