import { ActionIcon, Box, Stack, Text, Transition } from '@mantine/core'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { IconProp } from '@fortawesome/fontawesome-svg-core'; import { useState } from 'react'; import { useNuiEvent } from '../../../hooks/useNuiEvent'; import { debugData } from '../../../utils/debugData'; import { fetchNui } from '../../../utils/fetchNui'; const radius = 60; // https://codesandbox.io/embed/circular-menu-e94ug function getTransform(index: number, totalItems: number) { const value = index / totalItems; const x = radius * Math.cos(Math.PI * 2 * (value - 0.25)); const y = radius * Math.sin(Math.PI * 2 * (value - 0.25)); return `translate(${x}px, ${y}px)`; } interface MenuItem { icon: IconProp; label: string; } debugData<{ items: MenuItem[]; sub?: boolean }>([ { action: 'openPlanetMenu', data: { items: [ { icon: 'palette', label: 'Paint' }, { icon: 'warehouse', label: 'Garage' }, { icon: 'handcuffs', label: 'Arrest' }, ], sub: false, }, }, ]); const PlanetMenu: React.FC = () => { const [visible, setVisible] = useState(false); const [menu, setMenu] = useState<{ items: MenuItem[]; sub?: boolean }>({ items: [], sub: false, }); const [currentItem, setCurrentItem] = useState({ label: '', visible: false }); useNuiEvent('openPlanetMenu', (data: { items: MenuItem[]; sub?: boolean }) => { setMenu(data); setVisible(true); }); const handleItemClick = (index: number) => { // fetchNui('planetClick', index) // setVisible(false); }; return ( <> <> {visible && ( <> {menu.items.map((item, index) => ( setCurrentItem({ label: item.label, visible: true })} onMouseLeave={() => setCurrentItem((prevState) => ({ ...prevState, visible: false }))} onClick={() => handleItemClick(index)} sx={(theme) => ({ transform: getTransform(index, menu.items.length), position: 'absolute', width: 40, height: 40, display: 'flex', alignItems: 'center', justifyContent: 'center', borderRadius: '50%', backgroundColor: theme.colors.dark[6], color: theme.colors.dark[0], boxShadow: theme.shadows.sm, padding: 12, '&:hover': { backgroundColor: theme.colors.dark[5], cursor: 'pointer', }, })} > ))} )} {(styles) => ( ({ backgroundColor: theme.colors.dark[6], color: theme.colors.dark[2], padding: 8, borderRadius: theme.radius.sm, fontWeight: 500, fontSize: 14, boxShadow: theme.shadows.sm, textAlign: 'center', })} > {currentItem.label} )} ); }; export default PlanetMenu;