Files
ox_lib/web/src/hooks/useNuiEvent.ts

47 lines
1.3 KiB
TypeScript
Raw Normal View History

2022-08-27 15:58:36 +02:00
import { MutableRefObject, useEffect, useRef } from 'react';
import { noop } from '../utils/misc';
2022-03-13 22:30:57 +01:00
interface NuiMessageData<T = unknown> {
action: string;
data: T;
}
type NuiHandlerSignature<T> = (data: T) => void;
/**
* A hook that manage events listeners for receiving data from the client scripts
* @param action The specific `action` that should be listened for.
* @param handler The callback function that will handle data relayed by this hook
*
* @example
* useNuiEvent<{visibility: true, wasVisible: 'something'}>('setVisible', (data) => {
* // whatever logic you want
* })
*
**/
2022-08-27 15:58:36 +02:00
export const useNuiEvent = <T = any>(action: string, handler: (data: T) => void) => {
2022-03-13 22:30:57 +01:00
const savedHandler: MutableRefObject<NuiHandlerSignature<T>> = useRef(noop);
// Make sure we handle for a reactive handler
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);
}
}
};
2022-08-27 15:58:36 +02:00
window.addEventListener('message', eventListener);
2022-03-13 22:30:57 +01:00
// Remove Event Listener on component cleanup
2022-08-27 15:58:36 +02:00
return () => window.removeEventListener('message', eventListener);
2022-03-13 22:30:57 +01:00
}, [action]);
};