import { useCallback, useRef } from "react"; export type UseEventReturn = { on: (listener: (data: Data) => void) => () => void; emit: (data: Data) => void; off: (listener: (data: Data) => void) => void; offAll: () => void; }; export const useEventEmitter = (): UseEventReturn => { const listeners = useRef(new Set<(data: Data) => void>()); const off = useCallback((listener: (data: Data) => void) => { listeners.current.delete(listener); }, []); const offAll = useCallback(() => { listeners.current.clear(); }, []); const on = useCallback( (listener: (data: Data) => void) => { listeners.current.add(listener); return () => off(listener); }, [off], ); const emit = useCallback((data: Data) => { if (listeners.current.size) { listeners.current.forEach((listener) => listener(data)); } }, []); return { on, emit, off, offAll, }; };