From 880961034c81e85e191c6c4b845d96506bbd4ea7 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 12 Dec 2022 10:57:14 -0300 Subject: compose, testing and async into web-util --- packages/web-util/src/hooks/index.ts | 3 +- packages/web-util/src/hooks/useAsyncAsHook.ts | 91 +++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 packages/web-util/src/hooks/useAsyncAsHook.ts (limited to 'packages/web-util/src/hooks') diff --git a/packages/web-util/src/hooks/index.ts b/packages/web-util/src/hooks/index.ts index f18d61b9c..9ac56c4ac 100644 --- a/packages/web-util/src/hooks/index.ts +++ b/packages/web-util/src/hooks/index.ts @@ -1,3 +1,4 @@ export { useLang } from "./useLang.js"; -export { useLocalStorage, useNotNullLocalStorage } from "./useLocalStorage.js" \ No newline at end of file +export { useLocalStorage, useNotNullLocalStorage } from "./useLocalStorage.js" +export { useAsyncAsHook, HookError, HookOk, HookResponse, HookResponseWithRetry, HookGenericError, HookOperationalError } from "./useAsyncAsHook.js" \ No newline at end of file diff --git a/packages/web-util/src/hooks/useAsyncAsHook.ts b/packages/web-util/src/hooks/useAsyncAsHook.ts new file mode 100644 index 000000000..48d29aa45 --- /dev/null +++ b/packages/web-util/src/hooks/useAsyncAsHook.ts @@ -0,0 +1,91 @@ +/* + This file is part of GNU Taler + (C) 2022 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ +import { TalerErrorDetail } from "@gnu-taler/taler-util"; +// import { TalerError } from "@gnu-taler/taler-wallet-core"; +import { useEffect, useMemo, useState } from "preact/hooks"; + +export interface HookOk { + hasError: false; + response: T; +} + +export type HookError = HookGenericError | HookOperationalError; + +export interface HookGenericError { + hasError: true; + operational: false; + message: string; +} + +export interface HookOperationalError { + hasError: true; + operational: true; + details: TalerErrorDetail; +} + +interface WithRetry { + retry: () => void; +} + +export type HookResponse = HookOk | HookError | undefined; +export type HookResponseWithRetry = + | ((HookOk | HookError) & WithRetry) + | undefined; + +export function useAsyncAsHook( + 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