Main/resources/[Developer]/[Mark]/av_weather/ui/src/hooks/useNuiEvents.ts
2025-06-07 08:51:21 +02:00

65 lines
1.7 KiB
TypeScript

import { MutableRefObject, useEffect, useRef } from "react";
export const isEnvBrowser = (): boolean => !(window as any).invokeNative;
type NuiHandlerSignature<T> = (data: T) => void;
export const useNuiEvent = <T = any>(
action: string,
handler: (data: T) => void
) => {
const savedHandler: MutableRefObject<NuiHandlerSignature<T>> = useRef(
() => {}
);
useEffect(() => {
savedHandler.current = handler;
}, [handler]);
useEffect(() => {
const eventListener = (event: MessageEvent) => {
const { action: eventAction, data } = event.data;
if (eventAction && eventAction === action && savedHandler.current) {
try {
savedHandler.current(data);
} catch (error) {
console.error(
`Error in useNuiEvent handler for action ${action}:`,
error
);
}
}
};
window.addEventListener("message", eventListener);
return () => {
window.removeEventListener("message", eventListener);
};
}, [action]);
};
export async function fetchNui<T = any>(
resourceName: string,
eventName: string,
data?: any
): Promise<T> {
const options = {
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
body: JSON.stringify(data),
};
if (isEnvBrowser()) return undefined as any;
try {
const resp = await fetch(`https://${resourceName}/${eventName}`, options);
const respFormatted = await resp.json();
return respFormatted;
} catch (error) {
console.log(`Error in fetchNui for ${resourceName}/${eventName}`);
return undefined as any;
}
}