summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--desktop/packages/mullvad-vpn/src/renderer/lib/hooks/use-exclusive-task.tsx22
1 files changed, 22 insertions, 0 deletions
diff --git a/desktop/packages/mullvad-vpn/src/renderer/lib/hooks/use-exclusive-task.tsx b/desktop/packages/mullvad-vpn/src/renderer/lib/hooks/use-exclusive-task.tsx
new file mode 100644
index 0000000000..01ea6acabf
--- /dev/null
+++ b/desktop/packages/mullvad-vpn/src/renderer/lib/hooks/use-exclusive-task.tsx
@@ -0,0 +1,22 @@
+import React from 'react';
+import { useCallback, useState } from 'react';
+
+export const useExclusiveTask = (task: () => Promise<void>) => {
+ const [running, setRunning] = useState(false);
+
+ const run = useCallback(async (): Promise<void | undefined> => {
+ if (running) {
+ return;
+ }
+ setRunning(true);
+ try {
+ await task();
+ } finally {
+ setRunning(false);
+ }
+ }, [task, running]);
+
+ const result = React.useMemo(() => [run, running] as const, [run, running]);
+
+ return result;
+};