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

72 lines
1.9 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, Flex, ScaleFade } from '@chakra-ui/react';
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
export interface TextUiProps {
2022-03-18 16:59:18 +01:00
text: string;
2022-08-27 15:58:36 +02:00
position?: 'right-center' | 'left-center' | 'top-center';
2022-04-01 22:04:14 +02:00
icon?: IconProp;
iconColor?: string;
2022-03-18 16:59:18 +01:00
style?: React.CSSProperties;
}
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);
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 (
<Flex
w="100%"
h="100%"
p={3}
position="absolute"
2022-08-27 15:58:36 +02:00
alignItems={data.position === 'top-center' ? 'baseline' : 'center'}
2022-03-18 16:59:18 +01:00
justifyContent={
2022-08-27 15:58:36 +02:00
data.position === 'right-center' ? 'flex-end' : data.position === 'left-center' ? 'flex-start' : 'center'
2022-03-18 16:59:18 +01:00
}
>
<ScaleFade in={visible} unmountOnExit>
<Box
bg="gray.700"
2022-05-06 15:33:11 +10:00
boxShadow="md"
p={3}
2022-04-01 22:04:14 +02:00
fontFamily="Poppins"
2022-05-06 15:33:11 +10:00
fontSize="0.95em"
style={data.style}
2022-05-06 15:33:11 +10:00
borderRadius="sm"
maxW="xs"
>
2022-04-01 22:04:14 +02:00
<Flex justifyContent="center" alignItems="center">
{data.icon && (
<FontAwesomeIcon
fixedWidth
2022-04-01 22:04:14 +02:00
icon={data.icon}
color={data.iconColor}
2022-05-06 15:33:11 +10:00
fontSize="1.3em"
style={{ paddingRight: 8 }}
2022-04-01 22:04:14 +02:00
/>
)}
<ReactMarkdown>{data.text}</ReactMarkdown>
</Flex>
2022-03-18 16:59:18 +01:00
</Box>
</ScaleFade>
</Flex>
);
};
export default TextUI;