commit f68162c79380570888a1f6a5046034806466759d
parent 01fae82f119913f59ccb154417400defa1ddd30f
Author: Sebastian <sebasjm@taler-systems.com>
Date: Wed, 22 Jul 2026 16:54:31 -0300
prevent setting state after the hook has been unloaded
Diffstat:
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/packages/taler-wallet-webextension/src/hooks/useAsyncAsHook.ts b/packages/taler-wallet-webextension/src/hooks/useAsyncAsHook.ts
@@ -14,7 +14,7 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
import { TalerErrorDetail, TalerError } from "@gnu-taler/taler-util";
-import { useEffect, useMemo, useState } from "preact/hooks";
+import { useEffect, useMemo, useRef, useState } from "preact/hooks";
import { BackgroundError } from "../wxApi.js";
export interface HookOk<T> {
@@ -51,20 +51,15 @@ export function useAsyncAsHook<T>(
deps?: unknown[],
): HookResponseWithRetry<T> {
const [result, setHookResponse] = useState<HookResponse<T>>(undefined);
-
- const args = useMemo(
- () => ({
- fn,
- }),
- deps || [],
- );
-
+ const unload = useRef(false);
async function doAsync(): Promise<void> {
try {
- const response = await args.fn();
- if (response === false) return;
+ const response = await fn();
+ if (response === false || unload.current) return;
setHookResponse({ hasError: false, response });
} catch (e) {
+ console.log(e)
+ if (unload.current) return
if (e instanceof TalerError) {
setHookResponse({
hasError: true,
@@ -91,7 +86,10 @@ export function useAsyncAsHook<T>(
useEffect(() => {
doAsync();
- }, [args]);
+ return () => {
+ unload.current = true
+ }
+ }, deps ?? []);
if (!result) return undefined;
return { ...result, retry: doAsync };