Files
ox_lib/web/src/features/textui/TextUI.tsx

73 lines
2.1 KiB
TypeScript
Raw Normal View History

2022-08-27 15:58:36 +02:00
import React from 'react';
import { useNuiEvent } from '../../hooks/useNuiEvent';
import { Box, createStyles, Group } from '@mantine/core';
2022-08-27 15:58:36 +02:00
import ReactMarkdown from 'react-markdown';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { IconProp } from '@fortawesome/fontawesome-svg-core';
2022-03-18 16:59:18 +01:00
type Position = 'right-center' | 'left-center' | 'top-center';
export interface TextUiProps {
2022-03-18 16:59:18 +01:00
text: string;
position?: Position;
2022-04-01 22:04:14 +02:00
icon?: IconProp;
iconColor?: string;
2022-03-18 16:59:18 +01:00
style?: React.CSSProperties;
}
const useStyles = createStyles((theme, params: { position?: Position }) => ({
wrapper: {
height: '100%',
width: '100%',
position: 'absolute',
display: 'flex',
alignItems: params.position === 'top-center' ? 'baseline' : '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,
},
}));
2022-03-18 16:59:18 +01:00
const TextUI: React.FC = () => {
const [data, setData] = React.useState<TextUiProps>({
2022-08-27 15:58:36 +02:00
text: '',
position: 'right-center',
2022-03-18 16:59:18 +01:00
});
const [visible, setVisible] = React.useState(false);
const { classes } = useStyles({ position: data.position });
2022-03-18 16:59:18 +01:00
2022-08-27 15:58:36 +02:00
useNuiEvent<TextUiProps>('textUi', (data) => {
if (!data.position) data.position = 'right-center'; // Default right position
2022-03-18 16:59:18 +01:00
setData(data);
setVisible(true);
});
2022-08-27 15:58:36 +02:00
useNuiEvent('textUiHide', () => setVisible(false));
2022-03-18 16:59:18 +01:00
return (
<>
{visible && (
<Box className={classes.wrapper}>
<Box style={data.style} className={classes.container}>
<Group spacing={12}>
{data.icon && <FontAwesomeIcon icon={data.icon} fixedWidth size="lg" style={{ color: data.iconColor }} />}
<ReactMarkdown>{data.text}</ReactMarkdown>
</Group>
</Box>
2022-03-18 16:59:18 +01:00
</Box>
)}
</>
2022-03-18 16:59:18 +01:00
);
};
export default TextUI;