2022-12-18 12:07:37 +01:00
|
|
|
import { Modal, Button, Stack, Group, useMantineTheme } from '@mantine/core';
|
2022-12-16 12:27:15 +01:00
|
|
|
import { useState } from 'react';
|
2022-08-27 15:58:36 +02:00
|
|
|
import ReactMarkdown from 'react-markdown';
|
|
|
|
|
import { useNuiEvent } from '../../hooks/useNuiEvent';
|
|
|
|
|
import { fetchNui } from '../../utils/fetchNui';
|
|
|
|
|
import { useLocales } from '../../providers/LocaleProvider';
|
2023-01-29 13:29:06 +01:00
|
|
|
import remarkGfm from 'remark-gfm';
|
2023-02-15 13:00:09 +01:00
|
|
|
import type { AlertProps } from '../../typings';
|
2023-08-07 03:05:15 -07:00
|
|
|
import MarkdownComponents from '../../config/MarkdownComponents';
|
2022-06-11 11:33:15 +02:00
|
|
|
|
|
|
|
|
const AlertDialog: React.FC = () => {
|
2022-06-12 12:29:48 +02:00
|
|
|
const { locale } = useLocales();
|
2022-12-18 12:07:37 +01:00
|
|
|
const theme = useMantineTheme();
|
2022-12-16 12:27:15 +01:00
|
|
|
const [opened, setOpened] = useState(false);
|
2022-08-27 15:40:41 +02:00
|
|
|
const [dialogData, setDialogData] = useState<AlertProps>({
|
2022-08-27 15:58:36 +02:00
|
|
|
header: '',
|
|
|
|
|
content: '',
|
2022-06-11 11:33:15 +02:00
|
|
|
});
|
|
|
|
|
|
2022-06-17 20:29:40 +02:00
|
|
|
const closeAlert = (button: string) => {
|
2022-12-16 12:27:15 +01:00
|
|
|
setOpened(false);
|
2022-08-27 15:58:36 +02:00
|
|
|
fetchNui('closeAlert', button);
|
2022-06-11 11:33:15 +02:00
|
|
|
};
|
|
|
|
|
|
2022-08-27 15:58:36 +02:00
|
|
|
useNuiEvent('sendAlert', (data: AlertProps) => {
|
2022-06-11 11:33:15 +02:00
|
|
|
setDialogData(data);
|
2022-12-16 12:27:15 +01:00
|
|
|
setOpened(true);
|
2022-06-11 11:33:15 +02:00
|
|
|
});
|
|
|
|
|
|
2022-09-29 11:39:30 +02:00
|
|
|
useNuiEvent('closeAlertDialog', () => {
|
2022-12-16 12:27:15 +01:00
|
|
|
setOpened(false);
|
2022-09-29 11:39:30 +02:00
|
|
|
});
|
|
|
|
|
|
2022-06-11 11:33:15 +02:00
|
|
|
return (
|
|
|
|
|
<>
|
2022-12-16 12:27:15 +01:00
|
|
|
<Modal
|
|
|
|
|
opened={opened}
|
|
|
|
|
centered={dialogData.centered}
|
2023-02-01 10:19:08 -05:00
|
|
|
size={dialogData.size || 'md'}
|
|
|
|
|
overflow={dialogData.overflow ? 'inside' : 'outside'}
|
2022-12-16 12:27:15 +01:00
|
|
|
closeOnClickOutside={false}
|
|
|
|
|
onClose={() => {
|
|
|
|
|
setOpened(false);
|
|
|
|
|
closeAlert('cancel');
|
|
|
|
|
}}
|
|
|
|
|
withCloseButton={false}
|
|
|
|
|
overlayOpacity={0.5}
|
|
|
|
|
exitTransitionDuration={150}
|
2022-12-31 15:05:01 +01:00
|
|
|
transition="fade"
|
2023-08-07 03:05:15 -07:00
|
|
|
title={<ReactMarkdown components={MarkdownComponents}>{dialogData.header}</ReactMarkdown>}
|
2022-06-11 11:33:15 +02:00
|
|
|
>
|
2022-12-16 12:27:15 +01:00
|
|
|
<Stack>
|
2023-03-10 19:39:30 +01:00
|
|
|
<ReactMarkdown
|
|
|
|
|
remarkPlugins={[remarkGfm]}
|
|
|
|
|
components={{
|
2023-08-07 03:05:15 -07:00
|
|
|
...MarkdownComponents,
|
2023-03-10 19:39:30 +01:00
|
|
|
img: ({ ...props }) => <img style={{ maxWidth: '100%', maxHeight: '100%' }} {...props} />,
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{dialogData.content}
|
|
|
|
|
</ReactMarkdown>
|
2022-12-16 12:27:15 +01:00
|
|
|
<Group position="right" spacing={10}>
|
2022-06-17 20:29:40 +02:00
|
|
|
{dialogData.cancel && (
|
2022-12-16 15:00:01 +01:00
|
|
|
<Button uppercase variant="default" onClick={() => closeAlert('cancel')} mr={3}>
|
2022-12-08 11:46:21 +01:00
|
|
|
{dialogData.labels?.cancel || locale.ui.cancel}
|
2022-06-17 20:29:40 +02:00
|
|
|
</Button>
|
|
|
|
|
)}
|
2022-12-16 12:27:15 +01:00
|
|
|
<Button
|
|
|
|
|
uppercase
|
2022-12-18 12:07:37 +01:00
|
|
|
variant={dialogData.cancel ? 'light' : 'default'}
|
|
|
|
|
color={dialogData.cancel ? theme.primaryColor : undefined}
|
2022-12-16 12:27:15 +01:00
|
|
|
onClick={() => closeAlert('confirm')}
|
|
|
|
|
>
|
2022-12-08 11:46:21 +01:00
|
|
|
{dialogData.labels?.confirm || locale.ui.confirm}
|
2022-06-17 20:29:40 +02:00
|
|
|
</Button>
|
2022-12-16 12:27:15 +01:00
|
|
|
</Group>
|
|
|
|
|
</Stack>
|
|
|
|
|
</Modal>
|
2022-06-11 11:33:15 +02:00
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default AlertDialog;
|