diff options
Diffstat (limited to 'packages/bank-ui/src/pages/PaytoWireTransferForm.tsx')
-rw-r--r-- | packages/bank-ui/src/pages/PaytoWireTransferForm.tsx | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx b/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx index 41956b84b..a3bb091c1 100644 --- a/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx +++ b/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx @@ -24,28 +24,30 @@ import { HttpStatusCode, PaytoString, PaytoUri, + TalerCorebankApi, TalerErrorCode, TranslatedString, assertUnreachable, buildPayto, parsePaytoUri, - stringifyPaytoUri, + stringifyPaytoUri } from "@gnu-taler/taler-util"; import { InternationalizationAPI, LocalNotificationBanner, + RouteDefinition, ShowInputErrorLabel, notifyInfo, + useBankCoreApiContext, useLocalNotification, useTranslationContext, } from "@gnu-taler/web-util/browser"; import { ComponentChildren, Fragment, Ref, VNode, h } from "preact"; import { useState } from "preact/hooks"; import { mutate } from "swr"; -import { useBankCoreApiContext } from "@gnu-taler/web-util/browser"; +import { IdempotencyRetry } from "../../../taler-util/lib/http-client/utils.js"; import { useBankState } from "../hooks/bank-state.js"; import { useSessionState } from "../hooks/session.js"; -import { RouteDefinition } from "@gnu-taler/web-util/browser"; import { undefinedIfEmpty, validateIBAN, validateTalerBank } from "../utils.js"; interface Props { @@ -182,12 +184,17 @@ export function PaytoWireTransferForm({ const puri = payto_uri; const sAmount = sendingAmount; - await handleError(async () => { - const request = { + await handleError(async function createTransactionHandleError() { + const request: TalerCorebankApi.CreateTransactionRequest = { payto_uri: puri, amount: sAmount, }; - const resp = await api.createTransaction(credentials, request); + const check = IdempotencyRetry.tryFiveTimes(); + const resp = await api.createTransaction( + credentials, + request, + check, + ); mutate(() => true); if (resp.type === "fail") { switch (resp.case) { @@ -249,6 +256,15 @@ export function PaytoWireTransferForm({ debug: resp.detail, when: AbsoluteTime.now(), }); + case TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED: { + return notify({ + type: "error", + title: i18n.str`Tried to create the transaction ${check.maxTries} times with different UID but failed.`, + description: resp.detail.hint as TranslatedString, + debug: resp.detail, + when: AbsoluteTime.now(), + }); + } case HttpStatusCode.Accepted: { updateBankState("currentChallenge", { operation: "create-transaction", |