import { useNuiEvent } from '../../../hooks/useNuiEvent'; import { Box, Stack, Text, Flex, Transition } from '@mantine/core'; import { useEffect, useState } from 'react'; import { ContextMenuProps } from '../../../interfaces/context'; import ContextButton from './components/ContextButton'; import { fetchNui } from '../../../utils/fetchNui'; import ReactMarkdown from 'react-markdown'; import HeaderButton from './components/HeaderButton'; import ScaleFade from '../../../transitions/ScaleFade'; const openMenu = (id: string | undefined) => { fetchNui('openContext', { id: id, back: true }); }; const ContextMenu: React.FC = () => { const [visible, setVisible] = useState(false); const [contextMenu, setContextMenu] = useState({ title: '', options: { '': { description: '', metadata: [] } }, }); const closeContext = () => { if (contextMenu.canClose === false) return; 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} {Object.entries(contextMenu.options).map((option, index) => ( ))} ); }; export default ContextMenu;