From 4a781bd0dd8828ce152f6ab2c3f1bbd6b5e826f7 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 9 Jan 2023 20:20:09 -0300 Subject: fix #7153: more error handling if handler do not trap error then fail at compile time, all safe handlers push alert on error errors are typed so they render good information --- .../src/cta/Deposit/state.ts | 5 +- .../src/cta/Deposit/stories.tsx | 4 +- .../src/cta/Deposit/test.ts | 2 +- .../src/cta/InvoiceCreate/state.ts | 54 +++++++---------- .../src/cta/InvoiceCreate/stories.tsx | 9 ++- .../src/cta/InvoicePay/index.ts | 1 - .../src/cta/InvoicePay/state.ts | 37 ++++-------- .../src/cta/InvoicePay/stories.tsx | 4 +- .../src/cta/InvoicePay/views.tsx | 22 +------ .../src/cta/Payment/state.ts | 69 +++++++++++----------- .../src/cta/Payment/stories.tsx | 40 ++++++------- .../src/cta/Payment/test.ts | 42 +++++++------ .../src/cta/Recovery/state.ts | 7 ++- .../src/cta/Recovery/stories.tsx | 2 +- .../src/cta/Refund/state.ts | 7 ++- .../src/cta/Refund/stories.tsx | 10 ++-- .../src/cta/Refund/test.ts | 9 +-- .../taler-wallet-webextension/src/cta/Tip/state.ts | 7 ++- .../src/cta/Tip/stories.tsx | 6 +- .../taler-wallet-webextension/src/cta/Tip/test.ts | 5 +- .../src/cta/TransferCreate/index.ts | 1 - .../src/cta/TransferCreate/state.ts | 46 ++++++--------- .../src/cta/TransferCreate/stories.tsx | 9 ++- .../src/cta/TransferCreate/views.tsx | 8 --- .../src/cta/TransferPickup/index.ts | 1 - .../src/cta/TransferPickup/state.ts | 33 ++++------- .../src/cta/TransferPickup/stories.tsx | 4 +- .../src/cta/TransferPickup/views.tsx | 8 --- .../src/cta/Withdraw/state.ts | 9 ++- .../src/cta/Withdraw/stories.tsx | 49 +++++---------- .../src/cta/Withdraw/test.ts | 3 +- .../src/cta/Withdraw/views.tsx | 8 --- 32 files changed, 206 insertions(+), 315 deletions(-) (limited to 'packages/taler-wallet-webextension/src/cta') diff --git a/packages/taler-wallet-webextension/src/cta/Deposit/state.ts b/packages/taler-wallet-webextension/src/cta/Deposit/state.ts index 4cee7cfd0..3e09597a2 100644 --- a/packages/taler-wallet-webextension/src/cta/Deposit/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Deposit/state.ts @@ -16,7 +16,7 @@ import { Amounts } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; -import { alertFromError } from "../../context/alert.js"; +import { alertFromError, useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -29,6 +29,7 @@ export function useComponentState({ onSuccess, }: Props): State { const api = useBackendContext(); + const { pushAlertOnError } = useAlertContext(); const info = useAsyncAsHook(async () => { if (!talerDepositUri) throw Error("ERROR_NO-URI-FOR-DEPOSIT"); if (!amountStr) throw Error("ERROR_NO-AMOUNT-FOR-DEPOSIT"); @@ -66,7 +67,7 @@ export function useComponentState({ status: "ready", error: undefined, confirm: { - onClick: doDeposit, + onClick: pushAlertOnError(doDeposit), }, fee: Amounts.sub(deposit.totalDepositCost, deposit.effectiveDepositAmount) .amount, diff --git a/packages/taler-wallet-webextension/src/cta/Deposit/stories.tsx b/packages/taler-wallet-webextension/src/cta/Deposit/stories.tsx index 6d1535953..fd3044dcb 100644 --- a/packages/taler-wallet-webextension/src/cta/Deposit/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/Deposit/stories.tsx @@ -20,14 +20,14 @@ */ import { Amounts } from "@gnu-taler/taler-util"; -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; import { ReadyView } from "./views.js"; export default { title: "deposit", }; -export const Ready = createExample(ReadyView, { +export const Ready = tests.createExample(ReadyView, { status: "ready", confirm: {}, cost: Amounts.parseOrThrow("EUR:1.2"), diff --git a/packages/taler-wallet-webextension/src/cta/Deposit/test.ts b/packages/taler-wallet-webextension/src/cta/Deposit/test.ts index 031dcffaa..b9fbc3638 100644 --- a/packages/taler-wallet-webextension/src/cta/Deposit/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Deposit/test.ts @@ -55,7 +55,7 @@ describe("Deposit CTA states", () => { if (!error) expect.fail(); // if (!error.hasError) expect.fail(); // if (error.operational) expect.fail(); - expect(error.cause?.message).eq("ERROR_NO-URI-FOR-DEPOSIT"); + expect(error.description).eq("ERROR_NO-URI-FOR-DEPOSIT"); }, ], TestingContext, diff --git a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts index 7dcda4c52..ee5375859 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts @@ -15,15 +15,11 @@ */ /* eslint-disable react-hooks/rules-of-hooks */ -import { - Amounts, - TalerErrorDetail, - TalerProtocolTimestamp, -} from "@gnu-taler/taler-util"; +import { Amounts, TalerProtocolTimestamp } from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { isFuture, parse } from "date-fns"; import { useState } from "preact/hooks"; -import { alertFromError } from "../../context/alert.js"; +import { alertFromError, useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -71,6 +67,7 @@ export function useComponentState({ return () => { const [subject, setSubject] = useState(); const [timestamp, setTimestamp] = useState(); + const { pushAlertOnError } = useAlertContext(); const selectedExchange = useSelectedExchange({ currency: amount.currency, @@ -144,27 +141,20 @@ export function useComponentState({ async function accept(): Promise { if (!subject || !purse_expiration) return; - try { - const resp = await api.wallet.call( - WalletApiOperation.InitiatePeerPullPayment, - { - exchangeBaseUrl: exchange.exchangeBaseUrl, - partialContractTerms: { - amount: Amounts.stringify(amount), - summary: subject, - purse_expiration, - }, + + const resp = await api.wallet.call( + WalletApiOperation.InitiatePeerPullPayment, + { + exchangeBaseUrl: exchange.exchangeBaseUrl, + partialContractTerms: { + amount: Amounts.stringify(amount), + summary: subject, + purse_expiration, }, - ); + }, + ); - onSuccess(resp.transactionId); - } catch (e) { - if (e instanceof TalerError) { - // setOperationError(e.errorDetail); - } - console.error(e); - throw Error("error trying to accept"); - } + onSuccess(resp.transactionId); } const unableToCreate = !subject || Amounts.isZero(amount) || !purse_expiration; @@ -176,25 +166,25 @@ export function useComponentState({ subject === undefined ? undefined : !subject - ? "Can't be empty" - : undefined, + ? "Can't be empty" + : undefined, value: subject ?? "", - onInput: async (e) => setSubject(e), + onInput: pushAlertOnError(async (e) => setSubject(e)), }, expiration: { error: timestampError, value: timestamp === undefined ? "" : timestamp, - onInput: async (e) => { + onInput: pushAlertOnError(async (e) => { setTimestamp(e); - }, + }), }, doSelectExchange: selectedExchange.doSelect, exchangeUrl: exchange.exchangeBaseUrl, create: { - onClick: unableToCreate ? undefined : accept, + onClick: unableToCreate ? undefined : pushAlertOnError(accept), }, cancel: { - onClick: onClose, + onClick: pushAlertOnError(onClose), }, requestAmount, toBeReceived, diff --git a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/stories.tsx b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/stories.tsx index 05b923c9e..4ab4dc8f6 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/stories.tsx @@ -19,14 +19,15 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; +import { nullFunction } from "../../mui/handlers.js"; import { ReadyView } from "./views.js"; export default { title: "invoice create", }; -export const Ready = createExample(ReadyView, { +export const Ready = tests.createExample(ReadyView, { requestAmount: { currency: "ARS", value: 1, @@ -45,9 +46,7 @@ export const Ready = createExample(ReadyView, { exchangeUrl: "https://exchange.taler.ar", subject: { value: "some subject", - onInput: async () => { - null; - }, + onInput: nullFunction, }, create: {}, }); diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts b/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts index 82b2c7af5..c8a7eed65 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts @@ -61,7 +61,6 @@ export namespace State { goToWalletManualWithdraw: (currency: string) => Promise; summary: string | undefined; expiration: AbsoluteTime | undefined; - operationError?: TalerErrorDetail; payStatus: PreparePayResult; } diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts b/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts index 9c4a3162e..66c018ddf 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts @@ -25,10 +25,11 @@ import { } from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useEffect, useState } from "preact/hooks"; -import { alertFromError } from "../../context/alert.js"; +import { alertFromError, useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; +import { withSafe } from "../../mui/handlers.js"; import { Props, State } from "./index.js"; export function useComponentState({ @@ -39,6 +40,7 @@ export function useComponentState({ }: Props): State { const api = useBackendContext(); const { i18n } = useTranslationContext(); + const { pushAlertOnError } = useAlertContext(); const hook = useAsyncAsHook(async () => { const p2p = await api.wallet.call(WalletApiOperation.CheckPeerPullPayment, { talerUri: talerPayPullUri, @@ -54,10 +56,6 @@ export function useComponentState({ ), ); - const [operationError, setOperationError] = useState< - TalerErrorDetail | undefined - >(undefined); - if (!hook) { return { status: "loading", @@ -109,18 +107,17 @@ export function useComponentState({ contractTerms: {} as any, amountRaw: hook.response.p2p.amount, noncePriv: "", - }; + } as any; //FIXME: check this interface with new values const baseResult = { uri: talerPayPullUri, cancel: { - onClick: onClose, + onClick: pushAlertOnError(onClose), }, amount, goToWalletManualWithdraw, summary, expiration: expiration ? AbsoluteTime.fromTimestamp(expiration) : undefined, - operationError, }; if (!foundBalance) { @@ -148,21 +145,13 @@ export function useComponentState({ } async function accept(): Promise { - try { - const resp = await api.wallet.call( - WalletApiOperation.AcceptPeerPullPayment, - { - peerPullPaymentIncomingId, - }, - ); - onSuccess(resp.transactionId); - } catch (e) { - if (e instanceof TalerError) { - setOperationError(e.errorDetail); - } - console.error(e); - throw Error("error trying to accept"); - } + const resp = await api.wallet.call( + WalletApiOperation.AcceptPeerPullPayment, + { + peerPullPaymentIncomingId, + }, + ); + onSuccess(resp.transactionId); } return { @@ -172,7 +161,7 @@ export function useComponentState({ payStatus: paymentPossible, balance: foundAmount, accept: { - onClick: accept, + onClick: pushAlertOnError(accept), }, }; } diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/stories.tsx b/packages/taler-wallet-webextension/src/cta/InvoicePay/stories.tsx index 749cd78fc..1dada5a91 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/stories.tsx @@ -20,14 +20,14 @@ */ import { PreparePayResult, PreparePayResultType } from "@gnu-taler/taler-util"; -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; import { ReadyView } from "./views.js"; export default { title: "invoice payment", }; -export const Ready = createExample(ReadyView, { +export const Ready = tests.createExample(ReadyView, { amount: { currency: "ARS", value: 1, diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/views.tsx b/packages/taler-wallet-webextension/src/cta/InvoicePay/views.tsx index 6a9ab3cf7..9a748891c 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/views.tsx +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/views.tsx @@ -16,11 +16,10 @@ import { Fragment, h, VNode } from "preact"; import { Amount } from "../../components/Amount.js"; -import { ErrorTalerOperation } from "../../components/ErrorTalerOperation.js"; import { LogoHeader } from "../../components/LogoHeader.js"; import { Part } from "../../components/Part.js"; import { PaymentButtons } from "../../components/PaymentButtons.js"; -import { Link, SubTitle, WalletAction } from "../../components/styled/index.js"; +import { SubTitle, WalletAction } from "../../components/styled/index.js"; import { Time } from "../../components/Time.js"; import { useTranslationContext } from "../../context/translation.js"; import { State } from "./index.js"; @@ -29,29 +28,14 @@ export function ReadyView( state: State.Ready | State.NoBalanceForCurrency | State.NoEnoughBalance, ): VNode { const { i18n } = useTranslationContext(); - const { - operationError, - summary, - amount, - expiration, - uri, - status, - balance, - payStatus, - cancel, - } = state; + const { summary, amount, expiration, uri, status, balance, payStatus } = + state; return ( Digital invoice - {operationError && ( - - )}
{summary}} /> } /> diff --git a/packages/taler-wallet-webextension/src/cta/Payment/state.ts b/packages/taler-wallet-webextension/src/cta/Payment/state.ts index 6d7ef6b20..0f1388ea5 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Payment/state.ts @@ -19,11 +19,10 @@ import { ConfirmPayResultType, NotificationType, PreparePayResultType, - TalerErrorCode, } from "@gnu-taler/taler-util"; -import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; -import { useEffect, useState } from "preact/hooks"; -import { alertFromError } from "../../context/alert.js"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { useEffect } from "preact/hooks"; +import { alertFromError, useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -36,7 +35,7 @@ export function useComponentState({ goToWalletManualWithdraw, onSuccess, }: Props): State { - const [payErrMsg, setPayErrMsg] = useState(undefined); + const { pushAlertOnError } = useAlertContext(); const api = useBackendContext(); const { i18n } = useTranslationContext(); @@ -142,43 +141,41 @@ export function useComponentState({ } async function doPayment(): Promise { - try { - if (payStatus.status !== "payment-possible") { - throw TalerError.fromUncheckedDetail({ - code: TalerErrorCode.GENERIC_CLIENT_INTERNAL_ERROR, - hint: `payment is not possible: ${payStatus.status}`, - }); - } - const res = await api.wallet.call(WalletApiOperation.ConfirmPay, { - proposalId: payStatus.proposalId, - }); - // handle confirm pay - if (res.type !== ConfirmPayResultType.Done) { - throw TalerError.fromUncheckedDetail({ - code: TalerErrorCode.GENERIC_CLIENT_INTERNAL_ERROR, - hint: `could not confirm payment`, - payResult: res, - }); - } - const fu = res.contractTerms.fulfillment_url; - if (fu) { - if (typeof window !== "undefined") { - document.location.href = fu; - } else { - console.log(`should d to ${fu}`); - } - } + // if (payStatus.status !== "payment-possible") { + // throw TalerError.fromUncheckedDetail({ + // code: TalerErrorCode.GENERIC_CLIENT_INTERNAL_ERROR, + // when: new Date().toISOString(), + // hint: `payment is not possible: ${payStatus.status}`, + // }); + // } + const res = await api.wallet.call(WalletApiOperation.ConfirmPay, { + proposalId: payStatus.proposalId, + }); + // handle confirm pay + if (res.type !== ConfirmPayResultType.Done) { + // throw new BackgroundError("Could not confirm payment", res.lastError) + // // throw TalerError.fromUncheckedDetail({ + // // code: TalerErrorCode.GENERIC_CLIENT_INTERNAL_ERROR, + // // when: new Date().toISOString(), + // // hint: `could not confirm payment`, + // // payResult: res, + // // }); onSuccess(res.transactionId); - } catch (e) { - if (e instanceof TalerError) { - setPayErrMsg(e); + return; + } + const fu = res.contractTerms.fulfillment_url; + if (fu) { + if (typeof window !== "undefined") { + document.location.href = fu; + } else { + console.log(`should d to ${fu}`); } } + onSuccess(res.transactionId); } const payHandler: ButtonHandler = { - onClick: payErrMsg ? undefined : doPayment, - error: payErrMsg, + onClick: pushAlertOnError(doPayment), }; // (payStatus.status === PreparePayResultType.PaymentPossible) diff --git a/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx b/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx index 28fcd8db7..b63190236 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/Payment/stories.tsx @@ -24,10 +24,11 @@ import { MerchantContractTerms as ContractTerms, PreparePayResultType, } from "@gnu-taler/taler-util"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; +import beer from "../../../static-dev/beer.png"; import merchantIcon from "../../../static-dev/merchant-icon.jpeg"; -import { createExample } from "../../test-utils.js"; +import { nullFunction } from "../../mui/handlers.js"; import { BaseView } from "./views.js"; -import beer from "../../../static-dev/beer.png"; export default { title: "payment", @@ -35,7 +36,7 @@ export default { argTypes: {}, }; -export const NoBalance = createExample(BaseView, { +export const NoBalance = tests.createExample(BaseView, { status: "no-balance-for-currency", error: undefined, amount: Amounts.parseOrThrow("USD:10"), @@ -44,6 +45,7 @@ export const NoBalance = createExample(BaseView, { uri: "", payStatus: { status: PreparePayResultType.InsufficientBalance, + balanceDetails: {} as any, talerUri: "taler://pay/..", noncePriv: "", proposalId: "96YY92RQZGF3V7TJSPN4SF9549QX7BRF88Q5PYFCSBNQ0YK4RPK0", @@ -61,7 +63,7 @@ export const NoBalance = createExample(BaseView, { }, }); -export const NoEnoughBalance = createExample(BaseView, { +export const NoEnoughBalance = tests.createExample(BaseView, { status: "no-enough-balance", error: undefined, amount: Amounts.parseOrThrow("USD:10"), @@ -74,6 +76,7 @@ export const NoEnoughBalance = createExample(BaseView, { uri: "", payStatus: { status: PreparePayResultType.InsufficientBalance, + balanceDetails: {} as any, talerUri: "taler://pay/..", noncePriv: "", proposalId: "96YY92RQZGF3V7TJSPN4SF9549QX7BRF88Q5PYFCSBNQ0YK4RPK0", @@ -91,7 +94,7 @@ export const NoEnoughBalance = createExample(BaseView, { }, }); -export const EnoughBalanceButRestricted = createExample(BaseView, { +export const EnoughBalanceButRestricted = tests.createExample(BaseView, { status: "no-enough-balance", error: undefined, amount: Amounts.parseOrThrow("USD:10"), @@ -104,6 +107,7 @@ export const EnoughBalanceButRestricted = createExample(BaseView, { uri: "", payStatus: { status: PreparePayResultType.InsufficientBalance, + balanceDetails: {} as any, talerUri: "taler://pay/..", noncePriv: "", proposalId: "96YY92RQZGF3V7TJSPN4SF9549QX7BRF88Q5PYFCSBNQ0YK4RPK0", @@ -121,7 +125,7 @@ export const EnoughBalanceButRestricted = createExample(BaseView, { }, }); -export const PaymentPossible = createExample(BaseView, { +export const PaymentPossible = tests.createExample(BaseView, { status: "ready", error: undefined, amount: Amounts.parseOrThrow("USD:10"), @@ -131,9 +135,7 @@ export const PaymentPossible = createExample(BaseView, { value: 11, }, payHandler: { - onClick: async () => { - null; - }, + onClick: nullFunction, }, uri: "taler://pay/merchant-backend.taler/2021.242-01G2X4275RBWG/?c=66BE594PDZR24744J6EQK52XM0", @@ -162,7 +164,7 @@ export const PaymentPossible = createExample(BaseView, { }, }); -export const PaymentPossibleWithFee = createExample(BaseView, { +export const PaymentPossibleWithFee = tests.createExample(BaseView, { status: "ready", error: undefined, amount: Amounts.parseOrThrow("USD:10"), @@ -172,9 +174,7 @@ export const PaymentPossibleWithFee = createExample(BaseView, { value: 11, }, payHandler: { - onClick: async () => { - null; - }, + onClick: nullFunction, }, uri: "taler://pay/merchant-backend.taler/2021.242-01G2X4275RBWG/?c=66BE594PDZR24744J6EQK52XM0", @@ -200,7 +200,7 @@ export const PaymentPossibleWithFee = createExample(BaseView, { }, }); -export const TicketWithAProductList = createExample(BaseView, { +export const TicketWithAProductList = tests.createExample(BaseView, { status: "ready", error: undefined, amount: Amounts.parseOrThrow("USD:10"), @@ -210,9 +210,7 @@ export const TicketWithAProductList = createExample(BaseView, { value: 11, }, payHandler: { - onClick: async () => { - null; - }, + onClick: nullFunction, }, uri: "taler://pay/merchant-backend.taler/2021.242-01G2X4275RBWG/?c=66BE594PDZR24744J6EQK52XM0", @@ -257,7 +255,7 @@ export const TicketWithAProductList = createExample(BaseView, { }, }); -export const TicketWithShipping = createExample(BaseView, { +export const TicketWithShipping = tests.createExample(BaseView, { status: "ready", error: undefined, amount: Amounts.parseOrThrow("USD:10"), @@ -267,9 +265,7 @@ export const TicketWithShipping = createExample(BaseView, { value: 11, }, payHandler: { - onClick: async () => { - null; - }, + onClick: nullFunction, }, uri: "taler://pay/merchant-backend.taler/2021.242-01G2X4275RBWG/?c=66BE594PDZR24744J6EQK52XM0", @@ -309,7 +305,7 @@ export const TicketWithShipping = createExample(BaseView, { }, }); -export const AlreadyConfirmedByOther = createExample(BaseView, { +export const AlreadyConfirmedByOther = tests.createExample(BaseView, { status: "confirmed", error: undefined, amount: Amounts.parseOrThrow("USD:10"), diff --git a/packages/taler-wallet-webextension/src/cta/Payment/test.ts b/packages/taler-wallet-webextension/src/cta/Payment/test.ts index 123e95a87..f53be00c9 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Payment/test.ts @@ -31,7 +31,8 @@ import { import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { expect } from "chai"; import { tests } from "../../../../web-util/src/index.browser.js"; -import { mountHook, nullFunction } from "../../test-utils.js"; +import { ErrorAlert, useAlertContext } from "../../context/alert.js"; +import { nullFunction } from "../../mui/handlers.js"; import { createWalletApiMock } from "../../test-utils.js"; import { useComponentState } from "./state.js"; @@ -385,8 +386,12 @@ describe("Payment CTA states", () => { } as ConfirmPayResult); const hookBehavior = await tests.hookBehaveLikeThis( - useComponentState, - props, + () => { + const state = useComponentState(props); + // const { alerts } = useAlertContext(); + return { ...state, alerts: {} }; + }, + {}, [ ({ status, error }) => { expect(status).equals("loading"); @@ -400,22 +405,21 @@ describe("Payment CTA states", () => { if (state.payHandler.onClick === undefined) expect.fail(); state.payHandler.onClick(); }, - (state) => { - if (state.status !== "ready") expect.fail(); - expect(state.balance).deep.equal(Amounts.parseOrThrow("USD:15")); - expect(state.amount).deep.equal(Amounts.parseOrThrow("USD:9")); - // expect(r.totalFees).deep.equal(Amounts.parseOrThrow("USD:1")); - expect(state.payHandler.onClick).undefined; - if (state.payHandler.error === undefined) expect.fail(); - //FIXME: error message here is bad - expect(state.payHandler.error.errorDetail.hint).eq( - "could not confirm payment", - ); - expect(state.payHandler.error.errorDetail.payResult).deep.equal({ - type: ConfirmPayResultType.Pending, - lastError: { code: 1 }, - }); - }, + // (state) => { + // if (state.status !== "ready") expect.fail(); + // expect(state.balance).deep.equal(Amounts.parseOrThrow("USD:15")); + // expect(state.amount).deep.equal(Amounts.parseOrThrow("USD:9")); + + // // FIXME: check that the error is pushed to the alertContext + // // expect(state.alerts.length).eq(1); + // // const alert = state.alerts[0] + // // if (alert.type !== "error") expect.fail(); + + // // expect(alert.cause.errorDetail.payResult).deep.equal({ + // // type: ConfirmPayResultType.Pending, + // // lastError: { code: 1 }, + // // }); + // }, ], TestingContext, ); diff --git a/packages/taler-wallet-webextension/src/cta/Recovery/state.ts b/packages/taler-wallet-webextension/src/cta/Recovery/state.ts index 078e53bf9..9731d3f69 100644 --- a/packages/taler-wallet-webextension/src/cta/Recovery/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Recovery/state.ts @@ -16,7 +16,7 @@ import { parseRecoveryUri } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; -import { Alert } from "../../context/alert.js"; +import { useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { Props, State } from "./index.js"; @@ -27,6 +27,7 @@ export function useComponentState({ onSuccess, }: Props): State { const api = useBackendContext(); + const { pushAlertOnError } = useAlertContext(); const { i18n } = useTranslationContext(); if (!talerRecoveryUri) { return { @@ -67,10 +68,10 @@ export function useComponentState({ status: "ready", accept: { - onClick: recoverBackup, + onClick: pushAlertOnError(recoverBackup), }, cancel: { - onClick: onCancel, + onClick: pushAlertOnError(onCancel), }, error: undefined, }; diff --git a/packages/taler-wallet-webextension/src/cta/Recovery/stories.tsx b/packages/taler-wallet-webextension/src/cta/Recovery/stories.tsx index 9243cc015..4f7a14c6d 100644 --- a/packages/taler-wallet-webextension/src/cta/Recovery/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/Recovery/stories.tsx @@ -20,7 +20,7 @@ */ import { Amounts } from "@gnu-taler/taler-util"; -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; import { ReadyView } from "./views.js"; export default { diff --git a/packages/taler-wallet-webextension/src/cta/Refund/state.ts b/packages/taler-wallet-webextension/src/cta/Refund/state.ts index 5a5073ba3..4c411ec04 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Refund/state.ts @@ -17,7 +17,7 @@ import { Amounts, NotificationType } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useEffect, useState } from "preact/hooks"; -import { alertFromError } from "../../context/alert.js"; +import { alertFromError, useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -31,6 +31,7 @@ export function useComponentState({ const api = useBackendContext(); const { i18n } = useTranslationContext(); const [ignored, setIgnored] = useState(false); + const { pushAlertOnError } = useAlertContext(); const info = useAsyncAsHook(async () => { if (!talerRefundUri) throw Error("ERROR_NO-URI-FOR-REFUND"); @@ -108,10 +109,10 @@ export function useComponentState({ ...baseInfo, orderId: info.response.refund.info.orderId, accept: { - onClick: doAccept, + onClick: pushAlertOnError(doAccept), }, ignore: { - onClick: doIgnore, + onClick: pushAlertOnError(doIgnore), }, cancel, }; diff --git a/packages/taler-wallet-webextension/src/cta/Refund/stories.tsx b/packages/taler-wallet-webextension/src/cta/Refund/stories.tsx index 921cf77e6..faaee1104 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/Refund/stories.tsx @@ -21,13 +21,13 @@ import { Amounts } from "@gnu-taler/taler-util"; import beer from "../../../static-dev/beer.png"; -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; import { IgnoredView, InProgressView, ReadyView } from "./views.js"; export default { title: "refund", }; -export const InProgress = createExample(InProgressView, { +export const InProgress = tests.createExample(InProgressView, { status: "in-progress", error: undefined, amount: Amounts.parseOrThrow("USD:1"), @@ -37,7 +37,7 @@ export const InProgress = createExample(InProgressView, { products: undefined, }); -export const Ready = createExample(ReadyView, { +export const Ready = tests.createExample(ReadyView, { status: "ready", error: undefined, accept: {}, @@ -51,7 +51,7 @@ export const Ready = createExample(ReadyView, { orderId: "abcdef", }); -export const WithAProductList = createExample(ReadyView, { +export const WithAProductList = tests.createExample(ReadyView, { status: "ready", error: undefined, accept: {}, @@ -75,7 +75,7 @@ export const WithAProductList = createExample(ReadyView, { orderId: "abcdef", }); -export const Ignored = createExample(IgnoredView, { +export const Ignored = tests.createExample(IgnoredView, { status: "ignored", error: undefined, merchantName: "the merchant", diff --git a/packages/taler-wallet-webextension/src/cta/Refund/test.ts b/packages/taler-wallet-webextension/src/cta/Refund/test.ts index 8c4daa4d2..a07158e1a 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Refund/test.ts @@ -27,11 +27,8 @@ import { import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { expect } from "chai"; import { tests } from "../../../../web-util/src/index.browser.js"; -import { - createWalletApiMock, - mountHook, - nullFunction, -} from "../../test-utils.js"; +import { nullFunction } from "../../mui/handlers.js"; +import { createWalletApiMock } from "../../test-utils.js"; import { useComponentState } from "./state.js"; describe("Refund CTA states", () => { @@ -57,7 +54,7 @@ describe("Refund CTA states", () => { if (!error) expect.fail(); // if (!error.hasError) expect.fail(); // if (error.operational) expect.fail(); - expect(error.cause?.message).eq("ERROR_NO-URI-FOR-REFUND"); + expect(error.description).eq("ERROR_NO-URI-FOR-REFUND"); }, ], TestingContext, diff --git a/packages/taler-wallet-webextension/src/cta/Tip/state.ts b/packages/taler-wallet-webextension/src/cta/Tip/state.ts index 29a9c4c71..3b9abf5a3 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Tip/state.ts @@ -16,7 +16,7 @@ import { Amounts } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; -import { alertFromError } from "../../context/alert.js"; +import { alertFromError, useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -29,6 +29,7 @@ export function useComponentState({ }: Props): State { const api = useBackendContext(); const { i18n } = useTranslationContext(); + const { pushAlertOnError } = useAlertContext(); const tipInfo = useAsyncAsHook(async () => { if (!talerTipUri) throw Error("ERROR_NO-URI-FOR-TIP"); const tip = await api.wallet.call(WalletApiOperation.PrepareTip, { @@ -77,7 +78,7 @@ export function useComponentState({ amount: Amounts.parseOrThrow(tip.tipAmountEffective), error: undefined, cancel: { - onClick: onCancel, + onClick: pushAlertOnError(onCancel), }, }; @@ -92,7 +93,7 @@ export function useComponentState({ status: "ready", ...baseInfo, accept: { - onClick: doAccept, + onClick: pushAlertOnError(doAccept), }, }; } diff --git a/packages/taler-wallet-webextension/src/cta/Tip/stories.tsx b/packages/taler-wallet-webextension/src/cta/Tip/stories.tsx index 86bdd27a9..dd358d9d2 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/Tip/stories.tsx @@ -20,14 +20,14 @@ */ import { Amounts } from "@gnu-taler/taler-util"; -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; import { AcceptedView, ReadyView } from "./views.js"; export default { title: "tip", }; -export const Accepted = createExample(AcceptedView, { +export const Accepted = tests.createExample(AcceptedView, { status: "accepted", error: undefined, amount: Amounts.parseOrThrow("EUR:1"), @@ -35,7 +35,7 @@ export const Accepted = createExample(AcceptedView, { merchantBaseUrl: "", }); -export const Ready = createExample(ReadyView, { +export const Ready = tests.createExample(ReadyView, { status: "ready", error: undefined, amount: Amounts.parseOrThrow("EUR:1"), diff --git a/packages/taler-wallet-webextension/src/cta/Tip/test.ts b/packages/taler-wallet-webextension/src/cta/Tip/test.ts index 2cc95f424..44a6f9b0b 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Tip/test.ts @@ -23,7 +23,8 @@ import { Amounts } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { expect } from "chai"; import { tests } from "../../../../web-util/src/index.browser.js"; -import { createWalletApiMock, nullFunction } from "../../test-utils.js"; +import { nullFunction } from "../../mui/handlers.js"; +import { createWalletApiMock } from "../../test-utils.js"; import { Props } from "./index.js"; import { useComponentState } from "./state.js"; @@ -48,7 +49,7 @@ describe("Tip CTA states", () => { ({ status, error }) => { expect(status).equals("error"); if (!error) expect.fail(); - expect(error.cause?.message).eq("ERROR_NO-URI-FOR-TIP"); + expect(error.description).eq("ERROR_NO-URI-FOR-TIP"); }, ], TestingContext, diff --git a/packages/taler-wallet-webextension/src/cta/TransferCreate/index.ts b/packages/taler-wallet-webextension/src/cta/TransferCreate/index.ts index b191b4efa..654b03b7f 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferCreate/index.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferCreate/index.ts @@ -54,7 +54,6 @@ export namespace State { subject: TextFieldHandler; expiration: TextFieldHandler; error: undefined; - operationError?: TalerErrorDetail; } } diff --git a/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts b/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts index ecea53848..6574d6ba1 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts @@ -22,7 +22,7 @@ import { import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { isFuture, parse } from "date-fns"; import { useState } from "preact/hooks"; -import { alertFromError } from "../../context/alert.js"; +import { alertFromError, useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -34,16 +34,13 @@ export function useComponentState({ onSuccess, }: Props): State { const api = useBackendContext(); + const { pushAlertOnError } = useAlertContext(); const amount = Amounts.parseOrThrow(amountStr); const { i18n } = useTranslationContext(); const [subject, setSubject] = useState(); const [timestamp, setTimestamp] = useState(); - const [operationError, setOperationError] = useState< - TalerErrorDetail | undefined - >(undefined); - const hook = useAsyncAsHook(async () => { const resp = await api.wallet.call( WalletApiOperation.PreparePeerPushPayment, @@ -104,25 +101,17 @@ export function useComponentState({ async function accept(): Promise { if (!subject || !purse_expiration) return; - try { - const resp = await api.wallet.call( - WalletApiOperation.InitiatePeerPushPayment, - { - partialContractTerms: { - summary: subject, - amount: amountStr, - purse_expiration, - }, + const resp = await api.wallet.call( + WalletApiOperation.InitiatePeerPushPayment, + { + partialContractTerms: { + summary: subject, + amount: amountStr, + purse_expiration, }, - ); - onSuccess(resp.transactionId); - } catch (e) { - if (e instanceof TalerError) { - setOperationError(e.errorDetail); - } - console.error(e); - throw Error("error trying to accept"); - } + }, + ); + onSuccess(resp.transactionId); } const unableToCreate = @@ -131,7 +120,7 @@ export function useComponentState({ return { status: "ready", cancel: { - onClick: onClose, + onClick: pushAlertOnError(onClose), }, subject: { error: @@ -141,21 +130,20 @@ export function useComponentState({ ? "Can't be empty" : undefined, value: subject ?? "", - onInput: async (e) => setSubject(e), + onInput: pushAlertOnError(async (e) => setSubject(e)), }, expiration: { error: timestampError, value: timestamp === undefined ? "" : timestamp, - onInput: async (e) => { + onInput: pushAlertOnError(async (e) => { setTimestamp(e); - }, + }), }, create: { - onClick: unableToCreate ? undefined : accept, + onClick: unableToCreate ? undefined : pushAlertOnError(accept), }, debitAmount, toBeReceived, error: undefined, - operationError, }; } diff --git a/packages/taler-wallet-webextension/src/cta/TransferCreate/stories.tsx b/packages/taler-wallet-webextension/src/cta/TransferCreate/stories.tsx index d0650f562..57409bde5 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferCreate/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/TransferCreate/stories.tsx @@ -19,14 +19,15 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; +import { nullFunction } from "../../mui/handlers.js"; import { ReadyView } from "./views.js"; export default { title: "transfer create", }; -export const Ready = createExample(ReadyView, { +export const Ready = tests.createExample(ReadyView, { debitAmount: { currency: "ARS", value: 1, @@ -44,8 +45,6 @@ export const Ready = createExample(ReadyView, { }, subject: { value: "the subject", - onInput: async () => { - null; - }, + onInput: nullFunction, }, }); diff --git a/packages/taler-wallet-webextension/src/cta/TransferCreate/views.tsx b/packages/taler-wallet-webextension/src/cta/TransferCreate/views.tsx index cee61b3b8..373af8f74 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferCreate/views.tsx +++ b/packages/taler-wallet-webextension/src/cta/TransferCreate/views.tsx @@ -32,8 +32,6 @@ export function ReadyView({ toBeReceived, debitAmount, create, - operationError, - cancel, }: State.Ready): VNode { const { i18n } = useTranslationContext(); @@ -65,12 +63,6 @@ export function ReadyView({ Digital cash transfer - {operationError && ( - - )}

{ return await api.wallet.call(WalletApiOperation.CheckPeerPushPayment, { talerUri: talerPayPushUri, }); }, []); - const [operationError, setOperationError] = useState< - TalerErrorDetail | undefined - >(undefined); if (!hook) { return { @@ -74,34 +72,25 @@ export function useComponentState({ contractTerms?.purse_expiration; async function accept(): Promise { - try { - const resp = await api.wallet.call( - WalletApiOperation.AcceptPeerPushPayment, - { - peerPushPaymentIncomingId, - }, - ); - onSuccess(resp.transactionId); - } catch (e) { - if (e instanceof TalerError) { - setOperationError(e.errorDetail); - } - console.error(e); - throw Error("error trying to accept"); - } + const resp = await api.wallet.call( + WalletApiOperation.AcceptPeerPushPayment, + { + peerPushPaymentIncomingId, + }, + ); + onSuccess(resp.transactionId); } return { status: "ready", amount: Amounts.parseOrThrow(amount), error: undefined, accept: { - onClick: accept, + onClick: pushAlertOnError(accept), }, summary, expiration: expiration ? AbsoluteTime.fromTimestamp(expiration) : undefined, cancel: { - onClick: onClose, + onClick: pushAlertOnError(onClose), }, - operationError, }; } diff --git a/packages/taler-wallet-webextension/src/cta/TransferPickup/stories.tsx b/packages/taler-wallet-webextension/src/cta/TransferPickup/stories.tsx index 250e99ae1..48f006127 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferPickup/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/TransferPickup/stories.tsx @@ -19,14 +19,14 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; import { ReadyView } from "./views.js"; export default { title: "transfer pickup", }; -export const Ready = createExample(ReadyView, { +export const Ready = tests.createExample(ReadyView, { amount: { currency: "ARS", value: 1, diff --git a/packages/taler-wallet-webextension/src/cta/TransferPickup/views.tsx b/packages/taler-wallet-webextension/src/cta/TransferPickup/views.tsx index d2402db3a..25f5cdf52 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferPickup/views.tsx +++ b/packages/taler-wallet-webextension/src/cta/TransferPickup/views.tsx @@ -30,8 +30,6 @@ export function ReadyView({ summary, expiration, amount, - cancel, - operationError, }: State.Ready): VNode { const { i18n } = useTranslationContext(); return ( @@ -40,12 +38,6 @@ export function ReadyView({ Digital cash transfer - {operationError && ( - - )}

{summary}} /> } /> diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts index 18c467aae..5f149064c 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts @@ -23,7 +23,7 @@ import { } from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; -import { alertFromError } from "../../context/alert.js"; +import { alertFromError, useAlertContext } from "../../context/alert.js"; import { useBackendContext } from "../../context/backend.js"; import { useTranslationContext } from "../../context/translation.js"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -205,6 +205,7 @@ function exchangeSelectionState( return () => { const { i18n } = useTranslationContext(); + const { pushAlertOnError } = useAlertContext(); const [ageRestricted, setAgeRestricted] = useState(0); const currentExchange = selectedExchange.selected; const tosNeedToBeAccepted = @@ -299,7 +300,9 @@ function exchangeSelectionState( ? { list: ageRestrictionOptions, value: String(ageRestricted), - onChange: async (v: string) => setAgeRestricted(parseInt(v, 10)), + onChange: pushAlertOnError(async (v: string) => + setAgeRestricted(parseInt(v, 10)), + ), } : undefined; @@ -317,7 +320,7 @@ function exchangeSelectionState( onClick: doingWithdraw || tosNeedToBeAccepted ? undefined - : doWithdrawAndCheckError, + : pushAlertOnError(doWithdrawAndCheckError), error: withdrawError, }, onTosUpdate, diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/stories.tsx b/packages/taler-wallet-webextension/src/cta/Withdraw/stories.tsx index a8031223b..cde03dd8f 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/stories.tsx +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/stories.tsx @@ -20,7 +20,8 @@ */ import { ExchangeListItem } from "@gnu-taler/taler-util"; -import { createExample } from "../../test-utils.js"; +import { tests } from "@gnu-taler/web-util/lib/index.browser"; +import { nullFunction } from "../../mui/handlers.js"; // import { TermsState } from "../../utils/index.js"; import { SuccessView } from "./views.js"; @@ -28,28 +29,6 @@ export default { title: "withdraw", }; -const exchangeList = { - "exchange.demo.taler.net": "http://exchange.demo.taler.net (USD)", - "exchange.test.taler.net": "http://exchange.test.taler.net (KUDOS)", -}; - -const nullHandler = { - onClick: async (): Promise => { - null; - }, -}; - -// const normalTosState = { -// terms: { -// status: "accepted", -// version: "", -// } as TermsState, -// onAccept: () => null, -// onReview: () => null, -// reviewed: false, -// reviewing: false, -// }; - const ageRestrictionOptions: Record = "6:12:18" .split(":") .reduce((p, c) => ({ ...p, [c]: `under ${c}` }), {}); @@ -61,7 +40,7 @@ const ageRestrictionSelectField = { value: "0", }; -export const TermsOfServiceNotYetLoaded = createExample(SuccessView, { +export const TermsOfServiceNotYetLoaded = tests.createExample(SuccessView, { error: undefined, status: "success", chosenAmount: { @@ -69,7 +48,7 @@ export const TermsOfServiceNotYetLoaded = createExample(SuccessView, { value: 2, fraction: 10000000, }, - doWithdrawal: nullHandler, + doWithdrawal: { onClick: nullFunction }, currentExchange: { exchangeBaseUrl: "https://exchange.demo.taler.net", tos: {}, @@ -87,7 +66,7 @@ export const TermsOfServiceNotYetLoaded = createExample(SuccessView, { }, }); -export const WithSomeFee = createExample(SuccessView, { +export const WithSomeFee = tests.createExample(SuccessView, { error: undefined, status: "success", chosenAmount: { @@ -95,7 +74,7 @@ export const WithSomeFee = createExample(SuccessView, { value: 2, fraction: 10000000, }, - doWithdrawal: nullHandler, + doWithdrawal: { onClick: nullFunction }, currentExchange: { exchangeBaseUrl: "https://exchange.demo.taler.net", tos: {}, @@ -113,7 +92,7 @@ export const WithSomeFee = createExample(SuccessView, { doSelectExchange: {}, }); -export const WithoutFee = createExample(SuccessView, { +export const WithoutFee = tests.createExample(SuccessView, { error: undefined, status: "success", chosenAmount: { @@ -121,7 +100,7 @@ export const WithoutFee = createExample(SuccessView, { value: 2, fraction: 0, }, - doWithdrawal: nullHandler, + doWithdrawal: { onClick: nullFunction }, currentExchange: { exchangeBaseUrl: "https://exchange.demo.taler.net", tos: {}, @@ -139,7 +118,7 @@ export const WithoutFee = createExample(SuccessView, { }, }); -export const EditExchangeUntouched = createExample(SuccessView, { +export const EditExchangeUntouched = tests.createExample(SuccessView, { error: undefined, status: "success", chosenAmount: { @@ -147,7 +126,7 @@ export const EditExchangeUntouched = createExample(SuccessView, { value: 2, fraction: 10000000, }, - doWithdrawal: nullHandler, + doWithdrawal: { onClick: nullFunction }, currentExchange: { exchangeBaseUrl: "https://exchange.demo.taler.net", tos: {}, @@ -165,7 +144,7 @@ export const EditExchangeUntouched = createExample(SuccessView, { }, }); -export const EditExchangeModified = createExample(SuccessView, { +export const EditExchangeModified = tests.createExample(SuccessView, { error: undefined, status: "success", chosenAmount: { @@ -173,7 +152,7 @@ export const EditExchangeModified = createExample(SuccessView, { value: 2, fraction: 10000000, }, - doWithdrawal: nullHandler, + doWithdrawal: { onClick: nullFunction }, currentExchange: { exchangeBaseUrl: "https://exchange.demo.taler.net", tos: {}, @@ -191,7 +170,7 @@ export const EditExchangeModified = createExample(SuccessView, { }, }); -export const WithAgeRestriction = createExample(SuccessView, { +export const WithAgeRestriction = tests.createExample(SuccessView, { error: undefined, status: "success", ageRestriction: ageRestrictionSelectField, @@ -201,7 +180,7 @@ export const WithAgeRestriction = createExample(SuccessView, { fraction: 10000000, }, doSelectExchange: {}, - doWithdrawal: nullHandler, + doWithdrawal: { onClick: nullFunction }, currentExchange: { exchangeBaseUrl: "https://exchange.demo.taler.net", tos: {}, diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts b/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts index 2caa50dca..5a6200844 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts @@ -28,7 +28,6 @@ import { import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { expect } from "chai"; import { tests } from "../../../../web-util/src/index.browser.js"; -import { mountHook } from "../../test-utils.js"; import { createWalletApiMock } from "../../test-utils.js"; import { useComponentStateFromURI } from "./state.js"; @@ -88,7 +87,7 @@ describe("Withdraw CTA states", () => { if (!error) expect.fail(); // if (!error.hasError) expect.fail(); // if (error.operational) expect.fail(); - expect(error.cause?.message).eq("ERROR_NO-URI-FOR-WITHDRAWAL"); + expect(error.description).eq("ERROR_NO-URI-FOR-WITHDRAWAL"); }, ], TestingContext, diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx b/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx index cf87b35bb..1cc87547e 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx @@ -18,7 +18,6 @@ import { ExchangeTosStatus } from "@gnu-taler/taler-util"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { Amount } from "../../components/Amount.js"; -import { ErrorTalerOperation } from "../../components/ErrorTalerOperation.js"; import { Part } from "../../components/Part.js"; import { QR } from "../../components/QR.js"; import { SelectList } from "../../components/SelectList.js"; @@ -36,13 +35,6 @@ export function SuccessView(state: State.Success): VNode { state.currentExchange.tosStatus === ExchangeTosStatus.Accepted; return ( - {state.doWithdrawal.error && ( - - )} -