import { useEffect, useRef } from 'react'; import { RTMClient } from '../api/RTMClient'; import { RTMClientEventMap } from '../api/RTMEvents'; type Disposer = () => void; type Nullable = T | null | undefined; function listen( listenable: RTMClient, event: EventType, listener: RTMClientEventMap[EventType] ): Disposer; function listen( listenable: RTMClient, event: EventType, listener: RTMClientEventMap[EventType] ) { listenable.addEventListener(event, listener); return () => listenable.removeEventListener(event, listener); } export function useRtmEvent( client: Nullable, event: EventType, listener: Nullable<(...args: any[]) => void> ) { const listenerRef = useRef(listener); useEffect(() => { listenerRef.current = listener; }, [listener]); useEffect(() => { if (client) { return listen(client, event, (...args: any[]) => { if (listenerRef.current) { listenerRef.current(...args); } }); } else { return () => { throw new Error('client is null'); }; } }, [event, client]); }