summaryrefslogtreecommitdiffhomepage
path: root/gui
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2022-03-25 14:23:04 +0100
committerOskar Nyberg <oskar@mullvad.net>2022-03-29 10:24:53 +0200
commit47fbfc266474b71dac3719608c4e830ad36adb30 (patch)
tree5be6b85ea5830e8c58e642962c64aada6177cf25 /gui
parent8d9d5058d973773e90f829c31bbfc70bf2c17398 (diff)
downloadmullvadvpn-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.tsx25
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) => (