import { Box, Spacer, Flex, Stack, Text } from "@chakra-ui/react"; import { useEffect, useRef, useState } from "react"; import { useNuiEvent } from "../../../hooks/useNuiEvent"; import { debugData } from "../../../utils/debugData"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; interface MenuSettings { position?: "top-left" | "top-right" | "bottom-left" | "bottom-right"; title: string; items: Array<{ label: string; value: string | string[] }>; } debugData([ { action: "setMenu", data: { // position: "bottom-left", title: "Vehicle garage", items: [ { label: "Option 1", value: "option1" }, { label: "Option 2", value: "option2" }, { label: "Vehicle class", value: ["Nice", "Super nice", "Extra nice"] }, { label: "Option 1", value: "option1" }, { label: "Option 2", value: "option2" }, { label: "Vehicle class", value: ["Nice", "Super nice", "Extra nice"] }, { label: "Option 1", value: "option1" }, { label: "Option 2", value: "option2" }, { label: "Vehicle class", value: ["Nice", "Super nice", "Extra nice"] }, ], }, }, ]); const ListMenu: React.FC = () => { const [menu, setMenu] = useState({ position: "top-left", title: "", items: [], }); const [selected, setSelected] = useState(0); const [visible, setVisible] = useState(false); const listRefs = useRef>([]); const moveMenu = (e: KeyboardEvent) => { switch (e.code) { case "ArrowDown": setSelected((selected) => { if (selected >= menu.items.length - 1) return selected; listRefs.current[selected + 1]?.focus(); return selected + 1; }); break; case "ArrowUp": setSelected((selected) => { if (selected <= 0) return selected; listRefs.current[selected - 1]?.focus(); return selected - 1; }); break; } }; useEffect(() => { if (!visible) return document.removeEventListener("keyup", moveMenu); document.addEventListener("keyup", moveMenu); }, [visible]); useNuiEvent("setMenu", (data: MenuSettings) => { if (!data.position) data.position = "top-left"; setMenu(data); setVisible(true); }); return ( <> {menu.title} {menu.items.map((item, index) => ( (listRefs.current = [...listRefs.current, element])} > {Array.isArray(item.value) ? ( {item.label} Nice cool ) : ( item.label )} ))} ); }; export default ListMenu;