import { useNuiEvent } from "../../../hooks/useNuiEvent"; import { Box, Text, Flex, ScaleFade } from "@chakra-ui/react"; import { useEffect, useState } from "react"; import { ContextMenuProps } from "../../../interfaces/context"; import Item from "./Item"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { fetchNui } from "../../../utils/fetchNui"; const openMenu = (id: string | undefined) => { fetchNui("openContext", id); }; const ContextMenu: React.FC = () => { const [visible, setVisible] = useState(false); const [contextMenu, setContextMenu] = useState({ title: "", options: { "": { description: "", metadata: [] } }, }); const closeContext = () => { setVisible(false); fetchNui("closeContext"); }; // Hides the context menu on ESC useEffect(() => { if (!visible) return; const keyHandler = (e: KeyboardEvent) => { if (["Escape"].includes(e.code)) closeContext(); }; window.addEventListener("keydown", keyHandler); return () => window.removeEventListener("keydown", keyHandler); }, [visible]); useNuiEvent("hideContext", () => setVisible(false)); useNuiEvent("showContext", async (data) => { if (visible) { setVisible(false); await new Promise((resolve) => setTimeout(resolve, 100)); } setContextMenu(data); setVisible(true); }); return ( {contextMenu.menu && ( openMenu(contextMenu.menu)} > )} {contextMenu.title} closeContext()} > {Object.entries(contextMenu.options).map((option, index) => ( ))} ); }; export default ContextMenu;