import { useNuiEvent } from "../../hooks/useNuiEvent"; import { Box, Text, Flex, ScaleFade } from "@chakra-ui/react"; import { debugData } from "../../utils/debugData"; 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"; debugData([ { action: "showContext", data: { title: "Vehicle garage", options: [ { title: "Empty button" }, { title: "Example button", description: "Example button description", icon: "inbox", image: "https://i.imgur.com/YAe7k17.jpeg", metadata: [{ label: "Value 1", value: 300 }], }, { title: "Menu button", icon: "bars", menu: "other_example_menu", description: "Takes you to another menu", metadata: ["It also has metadata support"], }, { title: "Event button", description: "Open a menu and send event data", icon: "check", arrow: true, event: "some_event", args: { value1: 300, value2: "Other value" }, }, ], }, }, ]); 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: [] } }, }); // Hides the context menu on ESC useEffect(() => { if (!visible) return; const keyHandler = (e: KeyboardEvent) => { if (["Escape"].includes(e.code)) { setVisible(false); fetchNui("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} {Object.entries(contextMenu.options).map((option, index) => ( ))} ); }; export default ContextMenu;