diff options
Diffstat (limited to 'packages/demobank-ui/src/pages/OperationState/state.ts')
-rw-r--r-- | packages/demobank-ui/src/pages/OperationState/state.ts | 143 |
1 files changed, 76 insertions, 67 deletions
diff --git a/packages/demobank-ui/src/pages/OperationState/state.ts b/packages/demobank-ui/src/pages/OperationState/state.ts index 32a13d047..20d66bbb1 100644 --- a/packages/demobank-ui/src/pages/OperationState/state.ts +++ b/packages/demobank-ui/src/pages/OperationState/state.ts @@ -14,7 +14,16 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { Amounts, HttpStatusCode, TalerCoreBankErrorsByMethod, TalerError, parsePaytoUri, parseWithdrawUri, stringifyWithdrawUri } from "@gnu-taler/taler-util"; +import { + Amounts, + HttpStatusCode, + TalerCoreBankErrorsByMethod, + TalerError, + assertUnreachable, + parsePaytoUri, + parseWithdrawUri, + stringifyWithdrawUri, +} from "@gnu-taler/taler-util"; import { utils } from "@gnu-taler/web-util/browser"; import { useEffect, useState } from "preact/hooks"; import { mutate } from "swr"; @@ -23,73 +32,80 @@ import { useWithdrawalDetails } from "../../hooks/access.js"; import { useBackendState } from "../../hooks/backend.js"; import { useBankState } from "../../hooks/bank-state.js"; import { usePreferences } from "../../hooks/preferences.js"; -import { assertUnreachable } from "../WithdrawalOperationPage.js"; import { Props, State } from "./index.js"; -export function useComponentState({ currency, onClose, onAuthorizationRequired, }: Props): utils.RecursiveState<State> { - const [settings] = usePreferences() +export function useComponentState({ + currency, + routeClose, + onAbort, + onAuthorizationRequired, +}: Props): utils.RecursiveState<State> { + const [settings] = usePreferences(); const [bankState, updateBankState] = useBankState(); - const { state: credentials } = useBackendState() - const creds = credentials.status !== "loggedIn" ? undefined : credentials - const { api } = useBankCoreApiContext() + const { state: credentials } = useBackendState(); + const creds = credentials.status !== "loggedIn" ? undefined : credentials; + const { api } = useBankCoreApiContext(); - const [failure, setFailure] = useState<TalerCoreBankErrorsByMethod<"createWithdrawal"> | undefined>() - const amount = settings.maxWithdrawalAmount + const [failure, setFailure] = useState< + TalerCoreBankErrorsByMethod<"createWithdrawal"> | undefined + >(); + const amount = settings.maxWithdrawalAmount; async function doSilentStart() { - //FIXME: if amount is not enough use balance - const parsedAmount = Amounts.parseOrThrow(`${currency}:${amount}`) + // FIXME: if amount is not enough use balance + const parsedAmount = Amounts.parseOrThrow(`${currency}:${amount}`); if (!creds) return; const resp = await api.createWithdrawal(creds, { amount: Amounts.stringify(parsedAmount), }); if (resp.type === "fail") { - setFailure(resp) + setFailure(resp); return; } - updateBankState("currentWithdrawalOperationId", resp.body.withdrawal_id) - + updateBankState("currentWithdrawalOperationId", resp.body.withdrawal_id); } - const withdrawalOperationId = bankState.currentWithdrawalOperationId + const withdrawalOperationId = bankState.currentWithdrawalOperationId; useEffect(() => { if (withdrawalOperationId === undefined) { - doSilentStart() + doSilentStart(); } - }, [settings.fastWithdrawal, amount]) + }, [settings.fastWithdrawal, amount]); if (failure) { return { status: "failed", - error: failure - } + error: failure, + }; } if (!withdrawalOperationId) { return { status: "loading", - error: undefined - } + error: undefined, + }; } - const wid = withdrawalOperationId + const wid = withdrawalOperationId; async function doAbort() { if (!creds) return; const resp = await api.abortWithdrawalById(creds, wid); if (resp.type === "ok") { - updateBankState("currentWithdrawalOperationId", undefined) - onClose(); + // updateBankState("currentWithdrawalOperationId", undefined) + onAbort(); } else { return resp; } } - async function doConfirm(): Promise<TalerCoreBankErrorsByMethod<"confirmWithdrawalById"> | undefined> { + async function doConfirm(): Promise< + TalerCoreBankErrorsByMethod<"confirmWithdrawalById"> | undefined + > { if (!creds) return; const resp = await api.confirmWithdrawalById(creds, wid); if (resp.type === "ok") { - mutate(() => true)//clean withdrawal state + mutate(() => true); //clean withdrawal state } else { return resp; } @@ -105,30 +121,29 @@ export function useComponentState({ currency, onClose, onAuthorizationRequired, status: "invalid-withdrawal", error: undefined, uri, - onClose, - } + }; } return (): utils.RecursiveState<State> => { const result = useWithdrawalDetails(withdrawalOperationId); - const shouldCreateNewOperation = result && !(result instanceof TalerError) + const shouldCreateNewOperation = result && !(result instanceof TalerError); useEffect(() => { if (shouldCreateNewOperation) { - doSilentStart() + doSilentStart(); } - }, []) + }, []); if (!result) { return { status: "loading", - error: undefined - } + error: undefined, + }; } if (result instanceof TalerError) { return { status: "loading-error", - error: result - } + error: result, + }; } if (result.type === "fail") { @@ -138,13 +153,11 @@ export function useComponentState({ currency, onClose, onAuthorizationRequired, return { status: "aborted", error: undefined, - onClose: async () => { - updateBankState("currentWithdrawalOperationId", undefined) - onClose() - }, - } + routeClose, + }; } - default: assertUnreachable(result) + default: + assertUnreachable(result); } } @@ -153,26 +166,20 @@ export function useComponentState({ currency, onClose, onAuthorizationRequired, return { status: "aborted", error: undefined, - onClose: async () => { - updateBankState("currentWithdrawalOperationId", undefined) - onClose() - }, - } + routeClose, + }; } if (data.status === "confirmed") { if (!settings.showWithdrawalSuccess) { - updateBankState("currentWithdrawalOperationId", undefined) - onClose() + updateBankState("currentWithdrawalOperationId", undefined); + // onClose() } return { status: "confirmed", error: undefined, - onClose: async () => { - updateBankState("currentWithdrawalOperationId", undefined) - onClose() - }, - } + routeClose, + }; } if (data.status === "pending") { @@ -180,11 +187,14 @@ export function useComponentState({ currency, onClose, onAuthorizationRequired, status: "ready", error: undefined, uri: parsedUri, - onClose: !creds ? (async () => { - onClose(); - return undefined - }) : doAbort, - } + routeClose, + onAbort: !creds + ? async () => { + onAbort(); + return undefined; + } + : doAbort, + }; } if (!data.selected_reserve_pub) { @@ -192,19 +202,19 @@ export function useComponentState({ currency, onClose, onAuthorizationRequired, status: "invalid-reserve", error: undefined, reserve: data.selected_reserve_pub, - onClose, - } + }; } - const account = !data.selected_exchange_account ? undefined : parsePaytoUri(data.selected_exchange_account) + const account = !data.selected_exchange_account + ? undefined + : parsePaytoUri(data.selected_exchange_account); if (!account) { return { status: "invalid-payto", error: undefined, payto: data.selected_exchange_account, - onClose, - } + }; } return { @@ -214,8 +224,7 @@ export function useComponentState({ currency, onClose, onAuthorizationRequired, account: data.username, id: withdrawalOperationId, onAbort: !creds ? undefined : doAbort, - onConfirm: !creds ? undefined : doConfirm - } - } - + onConfirm: !creds ? undefined : doConfirm, + }; + }; } |