Files
ox_lib/web/src/features/progress/Progressbar.tsx

101 lines
2.4 KiB
TypeScript
Raw Normal View History

2022-08-27 15:58:36 +02:00
import React from 'react';
2023-01-02 14:02:07 +01:00
import { Box, Text, createStyles } from '@mantine/core';
2022-08-27 15:58:36 +02:00
import { useNuiEvent } from '../../hooks/useNuiEvent';
import { fetchNui } from '../../utils/fetchNui';
import ScaleFade from '../../transitions/ScaleFade';
2022-03-15 20:35:02 +01:00
export interface ProgressbarProps {
2022-03-15 20:35:02 +01:00
label: string;
duration: number;
}
const useStyles = createStyles((theme) => ({
container: {
width: 350,
height: 45,
borderRadius: theme.radius.sm,
backgroundColor: theme.colors.dark[5],
overflow: 'hidden',
},
wrapper: {
width: '100%',
height: '20%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
bottom: 0,
position: 'absolute',
},
bar: {
height: '100%',
backgroundColor: theme.colors[theme.primaryColor][theme.fn.primaryShade()],
},
labelWrapper: {
position: 'absolute',
display: 'flex',
width: 350,
height: 45,
alignItems: 'center',
justifyContent: 'center',
},
label: {
maxWidth: 350,
padding: 8,
textOverflow: 'ellipsis',
overflow: 'hidden',
whiteSpace: 'nowrap',
fontSize: 20,
2023-01-02 14:02:07 +01:00
color: theme.colors.gray[3],
textShadow: theme.shadows.sm,
},
}));
2022-03-15 20:35:02 +01:00
const Progressbar: React.FC = () => {
const { classes } = useStyles();
2022-03-15 20:35:02 +01:00
const [visible, setVisible] = React.useState(false);
2022-08-27 15:58:36 +02:00
const [label, setLabel] = React.useState('');
2022-03-15 20:35:02 +01:00
const [duration, setDuration] = React.useState(0);
const progressComplete = () => {
setVisible(false);
2022-08-27 15:58:36 +02:00
fetchNui('progressComplete');
2022-03-15 20:35:02 +01:00
};
2022-03-15 21:08:08 +01:00
const progressCancel = () => {
setVisible(false);
2022-03-15 21:08:08 +01:00
};
2022-08-27 15:58:36 +02:00
useNuiEvent('progressCancel', progressCancel);
2022-03-15 21:08:08 +01:00
2022-08-27 15:58:36 +02:00
useNuiEvent<ProgressbarProps>('progress', (data) => {
2022-03-15 20:35:02 +01:00
setVisible(true);
setLabel(data.label);
setDuration(data.duration);
});
return (
<>
<Box className={classes.wrapper}>
<ScaleFade visible={visible}>
<Box className={classes.container}>
<Box
className={classes.bar}
onAnimationEnd={progressComplete}
sx={{
animation: 'progress-bar linear',
animationDuration: `${duration}ms`,
}}
>
<Box className={classes.labelWrapper}>
<Text className={classes.label}>{label}</Text>
</Box>
</Box>
</Box>
</ScaleFade>
</Box>
</>
2022-03-15 20:35:02 +01:00
);
};
export default Progressbar;