import { MutableRefObject, useEffect, useRef } from "react"; import { noop } from "../utils/misc"; interface NuiMessageData { action: string; data: T; } type NuiHandlerSignature = (data: T) => void; export const useNuiEvent = ( action: string, handler: (data: T) => void, ) => { const savedHandler: MutableRefObject> = useRef(noop); useEffect(() => { savedHandler.current = handler; }, [handler]); useEffect(() => { const eventListener = (event: MessageEvent>) => { const { action: eventAction, data } = event.data; if (savedHandler.current) { if (eventAction === action) { savedHandler.current(data); } } }; window.addEventListener("message", eventListener); return () => window.removeEventListener("message", eventListener); }, [action]); };