forked from Simnation/Main
35 lines
No EOL
902 B
TypeScript
35 lines
No EOL
902 B
TypeScript
import { MutableRefObject, useEffect, useRef } from "react";
|
|
import { noop } from "../utils/misc";
|
|
|
|
interface NuiMessageData<T = unknown> {
|
|
action: string;
|
|
data: T;
|
|
}
|
|
|
|
type NuiHandlerSignature<T> = (data: T) => void;
|
|
|
|
export const useNuiEvent = <T = unknown>(
|
|
action: string,
|
|
handler: (data: T) => void,
|
|
) => {
|
|
const savedHandler: MutableRefObject<NuiHandlerSignature<T>> = useRef(noop);
|
|
|
|
useEffect(() => {
|
|
savedHandler.current = handler;
|
|
}, [handler]);
|
|
|
|
useEffect(() => {
|
|
const eventListener = (event: MessageEvent<NuiMessageData<T>>) => {
|
|
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]);
|
|
}; |