mirror of
https://github.com/CommunityOx/ox_lib.git
synced 2026-08-18 23:46:03 +01:00
79 lines
2.6 KiB
TypeScript
79 lines
2.6 KiB
TypeScript
import { useNuiEvent } from '../../../hooks/useNuiEvent';
|
|
import { Box, Stack, Text, Flex } from '@mantine/core';
|
|
import { useEffect, useState } from 'react';
|
|
import { ContextMenuProps } from '../../../typings';
|
|
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<ContextMenuProps>('openContext', { id: id, back: true });
|
|
};
|
|
|
|
const ContextMenu: React.FC = () => {
|
|
const [visible, setVisible] = useState(false);
|
|
const [contextMenu, setContextMenu] = useState<ContextMenuProps>({
|
|
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<ContextMenuProps>('showContext', async (data) => {
|
|
if (visible) {
|
|
setVisible(false);
|
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
}
|
|
setContextMenu(data);
|
|
setVisible(true);
|
|
});
|
|
|
|
return (
|
|
<Box sx={{ position: 'absolute', top: '15%', right: '25%' }} w={320} h={580}>
|
|
<ScaleFade visible={visible}>
|
|
<Flex justify="center" align="center" mb={10} gap={6}>
|
|
{contextMenu.menu && (
|
|
<HeaderButton icon="chevron-left" iconSize={16} handleClick={() => openMenu(contextMenu.menu)} />
|
|
)}
|
|
<Box sx={{ borderRadius: 4, flex: '1 85%' }} bg="dark.6">
|
|
<Text color="dark.0" p={6} align="center">
|
|
<ReactMarkdown>{contextMenu.title}</ReactMarkdown>
|
|
</Text>
|
|
</Box>
|
|
<HeaderButton icon="xmark" canClose={contextMenu.canClose} iconSize={18} handleClick={closeContext} />
|
|
</Flex>
|
|
<Box sx={{ height: 560, overflowY: 'scroll' }}>
|
|
<Stack spacing={3}>
|
|
{Object.entries(contextMenu.options).map((option, index) => (
|
|
<ContextButton option={option} key={`context-item-${index}`} />
|
|
))}
|
|
</Stack>
|
|
</Box>
|
|
</ScaleFade>
|
|
</Box>
|
|
);
|
|
};
|
|
|
|
export default ContextMenu;
|