From 64acf8e2b1083de6f78b7d21dd2701af2fee1911 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 21 Apr 2022 14:23:53 -0300 Subject: payments test case --- .../src/hooks/useAsyncAsHook.ts | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'packages/taler-wallet-webextension/src/hooks/useAsyncAsHook.ts') diff --git a/packages/taler-wallet-webextension/src/hooks/useAsyncAsHook.ts b/packages/taler-wallet-webextension/src/hooks/useAsyncAsHook.ts index e592073dd..d03455ff7 100644 --- a/packages/taler-wallet-webextension/src/hooks/useAsyncAsHook.ts +++ b/packages/taler-wallet-webextension/src/hooks/useAsyncAsHook.ts @@ -39,7 +39,12 @@ export interface HookOperationalError { details: TalerErrorDetail; } +interface WithRetry { + retry: () => void; +} + export type HookResponse = HookOk | HookError | undefined; +export type HookResponseWithRetry = ((HookOk | HookError) & WithRetry) | undefined; export function useAsyncAsHook( fn: () => Promise, @@ -84,3 +89,45 @@ export function useAsyncAsHook( }, [args]); return result; } + +export function useAsyncAsHook2( + fn: () => Promise, + deps?: any[], +): HookResponseWithRetry { + + const [result, setHookResponse] = useState>(undefined); + + const args = useMemo(() => ({ + fn + // eslint-disable-next-line react-hooks/exhaustive-deps + }), deps || []) + + async function doAsync(): Promise { + try { + const response = await args.fn(); + if (response === false) return; + setHookResponse({ hasError: false, response }); + } catch (e) { + if (e instanceof TalerError) { + setHookResponse({ + hasError: true, + operational: true, + details: e.errorDetail, + }); + } else if (e instanceof Error) { + setHookResponse({ + hasError: true, + operational: false, + message: e.message, + }); + } + } + } + + useEffect(() => { + doAsync(); + }, [args]); + + if (!result) return undefined; + return { ...result, retry: doAsync }; +} -- cgit v1.2.3