Files
ox_lib/web/src/features/textui/TextUI.tsx
2024-03-09 11:04:18 +01:00

82 lines
2.5 KiB
TypeScript

import React from 'react';
import { useNuiEvent } from '../../hooks/useNuiEvent';
import { Box, createStyles, Group } from '@mantine/core';
import ReactMarkdown from 'react-markdown';
import ScaleFade from '../../transitions/ScaleFade';
import remarkGfm from 'remark-gfm';
import type { TextUiPosition, TextUiProps } from '../../typings';
import MarkdownComponents from '../../config/MarkdownComponents';
import LibIcon from '../../components/LibIcon';
const useStyles = createStyles((theme, params: { position?: TextUiPosition }) => ({
wrapper: {
height: '100%',
width: '100%',
position: 'absolute',
display: 'flex',
alignItems:
params.position === 'top-center' ? 'baseline' :
params.position === 'bottom-center' ? 'flex-end' : 'center',
justifyContent:
params.position === 'right-center' ? 'flex-end' :
params.position === 'left-center' ? 'flex-start' : 'center',
},
container: {
fontSize: 16,
padding: 12,
margin: 8,
backgroundColor: theme.colors.dark[6],
color: theme.colors.dark[0],
fontFamily: 'Roboto',
borderRadius: theme.radius.sm,
boxShadow: theme.shadows.sm,
},
}));
const TextUI: React.FC = () => {
const [data, setData] = React.useState<TextUiProps>({
text: '',
position: 'right-center',
});
const [visible, setVisible] = React.useState(false);
const { classes } = useStyles({ position: data.position });
useNuiEvent<TextUiProps>('textUi', (data) => {
if (!data.position) data.position = 'right-center'; // Default right position
setData(data);
setVisible(true);
});
useNuiEvent('textUiHide', () => setVisible(false));
return (
<>
<Box className={classes.wrapper}>
<ScaleFade visible={visible}>
<Box style={data.style} className={classes.container}>
<Group spacing={12}>
{data.icon && (
<LibIcon
icon={data.icon}
fixedWidth
size="lg"
animation={data.iconAnimation}
style={{
color: data.iconColor,
alignSelf: !data.alignIcon || data.alignIcon === 'center' ? 'center' : 'start',
}}
/>
)}
<ReactMarkdown components={MarkdownComponents} remarkPlugins={[remarkGfm]}>
{data.text}
</ReactMarkdown>
</Group>
</Box>
</ScaleFade>
</Box>
</>
);
};
export default TextUI;