taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

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:
Mpackages/taler-wallet-webextension/src/hooks/useAsyncAsHook.ts | 22++++++++++------------
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 };