diff options
| author | Oskar Nyberg <oskar@mullvad.net> | 2022-03-25 14:23:04 +0100 |
|---|---|---|
| committer | Oskar Nyberg <oskar@mullvad.net> | 2022-03-29 10:24:53 +0200 |
| commit | 47fbfc266474b71dac3719608c4e830ad36adb30 (patch) | |
| tree | 5be6b85ea5830e8c58e642962c64aada6177cf25 /gui | |
| parent | 8d9d5058d973773e90f829c31bbfc70bf2c17398 (diff) | |
| download | mullvadvpn-47fbfc266474b71dac3719608c4e830ad36adb30.tar.xz mullvadvpn-47fbfc266474b71dac3719608c4e830ad36adb30.zip | |
Add fallback timer for removing list items if onTransitionEnd fails
Diffstat (limited to 'gui')
| -rw-r--r-- | gui/src/renderer/components/List.tsx | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/gui/src/renderer/components/List.tsx b/gui/src/renderer/components/List.tsx index a0d7a3ec5c..031fcdfd1d 100644 --- a/gui/src/renderer/components/List.tsx +++ b/gui/src/renderer/components/List.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react'; +import { Scheduler } from '../../shared/scheduler'; import Accordion from './Accordion'; export const stringValueAsKey = (value: string): string => value; @@ -28,6 +29,8 @@ export default function List<T>(props: ListProps<T>) { // Skip add transition on first render when initial items are added. const skipAddTransition = useRef(props.skipInitialAddTransition ?? false); + const removeFallbackSchedulers = useRef<Record<string, Scheduler>>({}); + useEffect(() => { setDisplayItems((prevItems) => { if (props.skipRemoveTransition) { @@ -46,9 +49,31 @@ export default function List<T>(props: ListProps<T>) { }, []); const onRemoved = useCallback((key: string) => { + removeFallbackSchedulers.current[key].cancel(); + delete removeFallbackSchedulers.current[key]; + setDisplayItems((items) => items.filter((item) => item.key !== key)); }, []); + useEffect(() => { + // Add scheduled item removal if `onTransitionEnd` doesn't trigger for some reason. + displayItems + .filter((item) => item.removing && removeFallbackSchedulers.current[item.key] === undefined) + .forEach((item) => { + const scheduler = new Scheduler(); + scheduler.schedule(() => onRemoved(item.key), 400); + removeFallbackSchedulers.current[item.key] = scheduler; + }); + }, [displayItems]); + + useEffect( + () => () => { + // Cancel all schedulers on unmount + Object.values(removeFallbackSchedulers).forEach((scheduler) => scheduler.cancel()); + }, + [], + ); + return ( <> {displayItems.map((displayItem) => ( |
