diff --git a/web/src/features/menu/list/Header.tsx b/web/src/features/menu/list/Header.tsx new file mode 100644 index 0000000..40c8d83 --- /dev/null +++ b/web/src/features/menu/list/Header.tsx @@ -0,0 +1,13 @@ +import { Box, Text } from "@chakra-ui/react"; + +const Header: React.FC<{ title: string }> = ({ title }) => { + return ( + + + {title} + + + ); +}; + +export default Header; diff --git a/web/src/features/menu/list/ListItem.tsx b/web/src/features/menu/list/ListItem.tsx new file mode 100644 index 0000000..324258d --- /dev/null +++ b/web/src/features/menu/list/ListItem.tsx @@ -0,0 +1,50 @@ +import { Box, Flex, Stack, Spacer, Text } from "@chakra-ui/react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { forwardRef } from "react"; + +interface Item { + label: string; + value: string | string[]; +} + +interface Props { + item: Item; + index: number; +} + +const ListItem = forwardRef, Props>(({ item, index }, ref) => { + return ( + { + if (ref) + // @ts-ignore i cba + return (ref.current = [...ref.current, element]); + }} + > + {Array.isArray(item.value) ? ( + + + + {item.label} + + Nice cool + + + + + ) : ( + item.label + )} + + ); +}); + +export default ListItem; diff --git a/web/src/features/menu/list/index.tsx b/web/src/features/menu/list/index.tsx index b36a3a8..6b714ef 100644 --- a/web/src/features/menu/list/index.tsx +++ b/web/src/features/menu/list/index.tsx @@ -1,8 +1,9 @@ -import { Box, Spacer, Flex, Stack, Text } from "@chakra-ui/react"; +import { Box, Stack } 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"; +import ListItem from "./ListItem"; +import Header from "./Header"; interface MenuSettings { position?: "top-left" | "top-right" | "bottom-left" | "bottom-right"; @@ -46,20 +47,22 @@ const ListMenu: React.FC = () => { 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(() => { + listRefs.current[selected]?.focus(); + }, [selected]); + useEffect(() => { if (!visible) return document.removeEventListener("keyup", moveMenu); @@ -91,39 +94,10 @@ const ListMenu: React.FC = () => { left={menu.position === "bottom-left" ? 1 : undefined} bottom={menu.position === "bottom-left" || menu.position === "bottom-right" ? 1 : undefined} > - - - {menu.title} - - +
{menu.items.map((item, index) => ( - (listRefs.current = [...listRefs.current, element])} - > - {Array.isArray(item.value) ? ( - - - - {item.label} - - Nice cool - - - - - ) : ( - item.label - )} - + ))}