feat(core): make the synchronous animation trigger less frequently (#6412)

This commit is contained in:
CatsJuice
2024-03-30 08:11:05 +00:00
parent f41d587d65
commit 506efdf02c

View File

@@ -196,17 +196,37 @@ const useSyncEngineSyncProgress = () => {
((syncing && progress !== undefined) || isOverCapacity || !isOnline), ((syncing && progress !== undefined) || isOverCapacity || !isOnline),
}; };
}; };
const usePauseAnimation = (timeToResume = 5000) => {
const [paused, setPaused] = useState(false);
const resume = useCallback(() => {
setPaused(false);
}, []);
const pause = useCallback(() => {
setPaused(true);
if (timeToResume > 0) {
setTimeout(resume, timeToResume);
}
}, [resume, timeToResume]);
return { paused, pause };
};
const WorkspaceInfo = ({ name }: { name: string }) => { const WorkspaceInfo = ({ name }: { name: string }) => {
const { message, active } = useSyncEngineSyncProgress(); const { message, active } = useSyncEngineSyncProgress();
const currentWorkspace = useService(Workspace); const currentWorkspace = useService(Workspace);
const isCloud = currentWorkspace.flavour === WorkspaceFlavour.AFFINE_CLOUD; const isCloud = currentWorkspace.flavour === WorkspaceFlavour.AFFINE_CLOUD;
const { progress } = useDocEngineStatus(); const { progress } = useDocEngineStatus();
const { paused, pause } = usePauseAnimation();
// to make sure that animation will play first time // to make sure that animation will play first time
const [delayActive, setDelayActive] = useState(false); const [delayActive, setDelayActive] = useState(false);
useEffect(() => { useEffect(() => {
const delayOpen = 300; if (paused) {
return;
}
const delayOpen = 0;
const delayClose = 200; const delayClose = 200;
let timer: ReturnType<typeof setTimeout>; let timer: ReturnType<typeof setTimeout>;
if (active) { if (active) {
@@ -216,10 +236,11 @@ const WorkspaceInfo = ({ name }: { name: string }) => {
} else { } else {
timer = setTimeout(() => { timer = setTimeout(() => {
setDelayActive(active); setDelayActive(active);
pause();
}, delayClose); }, delayClose);
} }
return () => clearTimeout(timer); return () => clearTimeout(timer);
}, [active]); }, [active, pause, paused]);
return ( return (
<div className={styles.workspaceInfoSlider} data-active={delayActive}> <div className={styles.workspaceInfoSlider} data-active={delayActive}>