fix(web/progress): nui callback on progress unmount

fixes an issue where activating 2 progress bars/circles one after another would cause a stuck progress bar.

resolves #227
This commit is contained in:
Luke
2023-02-18 20:29:24 +01:00
parent 3801faf976
commit 672b638ba7
3 changed files with 14 additions and 26 deletions

View File

@@ -58,17 +58,10 @@ const CircleProgressbar: React.FC = () => {
const theme = useMantineTheme(); const theme = useMantineTheme();
const { classes } = useStyles({ position, duration: progressDuration }); const { classes } = useStyles({ position, duration: progressDuration });
const progressComplete = () => { useNuiEvent('progressCancel', () => {
setValue(99);
setVisible(false); setVisible(false);
fetchNui('progressComplete'); });
};
const progressCancel = () => {
setValue(99); // Sets the final value to 100% kek
setVisible(false);
};
useNuiEvent('progressCancel', progressCancel);
useNuiEvent<CircleProgressbarProps>('circleProgress', (data) => { useNuiEvent<CircleProgressbarProps>('circleProgress', (data) => {
if (visible) return; if (visible) return;
@@ -90,13 +83,13 @@ const CircleProgressbar: React.FC = () => {
return ( return (
<> <>
<Stack spacing={0} className={classes.container}> <Stack spacing={0} className={classes.container}>
<ScaleFade visible={visible}> <ScaleFade visible={visible} onExitComplete={() => fetchNui('progressComplete')}>
<Stack spacing={0} align="center" className={classes.wrapper}> <Stack spacing={0} align="center" className={classes.wrapper}>
<RingProgress <RingProgress
size={90} size={90}
thickness={7} thickness={7}
sections={[{ value: 0, color: theme.primaryColor }]} sections={[{ value: 0, color: theme.primaryColor }]}
onAnimationEnd={progressComplete} onAnimationEnd={() => setVisible(false)}
className={classes.progress} className={classes.progress}
label={<Text className={classes.value}>{value}%</Text>} label={<Text className={classes.value}>{value}%</Text>}
/> />

View File

@@ -52,16 +52,7 @@ const Progressbar: React.FC = () => {
const [label, setLabel] = React.useState(''); const [label, setLabel] = React.useState('');
const [duration, setDuration] = React.useState(0); const [duration, setDuration] = React.useState(0);
const progressComplete = () => { useNuiEvent('progressCancel', () => setVisible(false));
setVisible(false);
fetchNui('progressComplete');
};
const progressCancel = () => {
setVisible(false);
};
useNuiEvent('progressCancel', progressCancel);
useNuiEvent<ProgressbarProps>('progress', (data) => { useNuiEvent<ProgressbarProps>('progress', (data) => {
setVisible(true); setVisible(true);
@@ -72,11 +63,11 @@ const Progressbar: React.FC = () => {
return ( return (
<> <>
<Box className={classes.wrapper}> <Box className={classes.wrapper}>
<ScaleFade visible={visible}> <ScaleFade visible={visible} onExitComplete={() => fetchNui('progressComplete')}>
<Box className={classes.container}> <Box className={classes.container}>
<Box <Box
className={classes.bar} className={classes.bar}
onAnimationEnd={progressComplete} onAnimationEnd={() => setVisible(false)}
sx={{ sx={{
animation: 'progress-bar linear', animation: 'progress-bar linear',
animationDuration: `${duration}ms`, animationDuration: `${duration}ms`,

View File

@@ -1,9 +1,13 @@
import { AnimatePresence, motion } from 'framer-motion'; import { AnimatePresence, motion } from 'framer-motion';
const ScaleFade: React.FC<{ visible: boolean; children: React.ReactNode }> = ({ visible, children }) => { const ScaleFade: React.FC<{ visible: boolean; children: React.ReactNode; onExitComplete?: () => void }> = ({
visible,
children,
onExitComplete,
}) => {
return ( return (
<> <>
<AnimatePresence> <AnimatePresence onExitComplete={onExitComplete}>
{visible && ( {visible && (
<motion.div <motion.div
initial={{ opacity: 0, scale: 0.95 }} initial={{ opacity: 0, scale: 0.95 }}