From 6ddb2de84245ae3914c92b2b2eb7399e7f04500e Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 16 Sep 2022 14:29:35 -0300 Subject: pretty --- .../src/cta/Deposit/index.ts | 15 +- .../src/cta/Deposit/state.ts | 5 +- .../src/cta/Deposit/test.ts | 48 ++-- .../src/cta/InvoiceCreate/index.ts | 17 +- .../src/cta/InvoiceCreate/state.ts | 56 ++-- .../src/cta/InvoiceCreate/test.ts | 7 +- .../src/cta/InvoicePay/index.ts | 28 +- .../src/cta/InvoicePay/state.ts | 81 +++--- .../src/cta/InvoicePay/test.ts | 7 +- .../src/cta/Payment/index.ts | 22 +- .../src/cta/Payment/state.ts | 27 +- .../src/cta/Payment/test.ts | 308 ++++++++++++--------- .../src/cta/Refund/index.ts | 19 +- .../src/cta/Refund/state.ts | 5 +- .../src/cta/Refund/test.ts | 167 ++++++----- .../taler-wallet-webextension/src/cta/Tip/index.ts | 26 +- .../taler-wallet-webextension/src/cta/Tip/state.ts | 10 +- .../taler-wallet-webextension/src/cta/Tip/test.ts | 110 +++++--- .../src/cta/TransferCreate/index.ts | 19 +- .../src/cta/TransferCreate/state.ts | 38 +-- .../src/cta/TransferCreate/test.ts | 7 +- .../src/cta/TransferPickup/index.ts | 24 +- .../src/cta/TransferPickup/state.ts | 50 ++-- .../src/cta/TransferPickup/test.ts | 7 +- .../src/cta/Withdraw/index.ts | 29 +- .../src/cta/Withdraw/state.ts | 124 +++++---- .../src/cta/Withdraw/test.ts | 142 ++++++---- .../src/hooks/useClipboardPermissions.ts | 4 +- .../src/hooks/useTalerActionURL.test.ts | 3 +- .../src/hooks/useTalerActionURL.ts | 6 +- .../src/mui/ModalManager.ts | 12 +- .../taler-wallet-webextension/src/platform/api.ts | 14 +- .../src/platform/chrome.ts | 93 ++++--- .../taler-wallet-webextension/src/utils/index.ts | 11 +- .../src/wallet/DepositPage.test.ts | 50 ++-- .../src/wallet/EmptyComponentExample/index.ts | 17 +- .../src/wallet/EmptyComponentExample/state.ts | 7 +- .../src/wallet/EmptyComponentExample/test.ts | 7 +- .../src/wallet/ExchangeSelection/index.ts | 29 +- .../src/wallet/ExchangeSelection/state.ts | 86 +++--- .../src/wallet/ExchangeSelection/test.ts | 5 +- packages/taler-wallet-webextension/src/wxApi.ts | 12 +- .../taler-wallet-webextension/src/wxBackend.ts | 1 - 43 files changed, 1017 insertions(+), 738 deletions(-) (limited to 'packages/taler-wallet-webextension') diff --git a/packages/taler-wallet-webextension/src/cta/Deposit/index.ts b/packages/taler-wallet-webextension/src/cta/Deposit/index.ts index 796fad97c..0f6c4743e 100644 --- a/packages/taler-wallet-webextension/src/cta/Deposit/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Deposit/index.ts @@ -23,11 +23,9 @@ import * as wxApi from "../../wxApi.js"; import { useComponentState } from "./state.js"; import { CompletedView, LoadingUriView, ReadyView } from "./views.js"; - - export interface Props { - talerDepositUri: string | undefined, - amountStr: AmountString | undefined, + talerDepositUri: string | undefined; + amountStr: AmountString | undefined; cancel: () => Promise; } @@ -38,7 +36,6 @@ export type State = | State.Completed; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -63,10 +60,14 @@ export namespace State { } const viewMapping: StateViewMap = { - "loading": Loading, + loading: Loading, "loading-uri": LoadingUriView, completed: CompletedView, ready: ReadyView, }; -export const DepositPage = compose("Deposit", (p: Props) => useComponentState(p, wxApi), viewMapping) +export const DepositPage = compose( + "Deposit", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/Deposit/state.ts b/packages/taler-wallet-webextension/src/cta/Deposit/state.ts index 3939c7ba2..0ae8bff18 100644 --- a/packages/taler-wallet-webextension/src/cta/Deposit/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Deposit/state.ts @@ -14,7 +14,6 @@ GNU Taler; see the file COPYING. If not, see */ - import { Amounts, CreateDepositGroupResponse } from "@gnu-taler/taler-util"; import { useState } from "preact/hooks"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -41,7 +40,7 @@ export function useComponentState( return { deposit, uri: talerDepositUri, amount }; }); - if (!info) return { status: "loading", error: undefined } + if (!info) return { status: "loading", error: undefined }; if (info.hasError) { return { status: "loading-uri", @@ -74,4 +73,4 @@ export function useComponentState( effective: deposit.effectiveDepositAmount, cancel, }; -} \ No newline at end of file +} diff --git a/packages/taler-wallet-webextension/src/cta/Deposit/test.ts b/packages/taler-wallet-webextension/src/cta/Deposit/test.ts index 4e7f5cfb4..67f9ca8bd 100644 --- a/packages/taler-wallet-webextension/src/cta/Deposit/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Deposit/test.ts @@ -19,9 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { - Amounts, PrepareDepositResponse -} from "@gnu-taler/taler-util"; +import { Amounts, PrepareDepositResponse } from "@gnu-taler/taler-util"; import { expect } from "chai"; import { mountHook } from "../../test-utils.js"; import { useComponentState } from "./state.js"; @@ -30,11 +28,20 @@ describe("Deposit CTA states", () => { it("should tell the user that the URI is missing", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerDepositUri: undefined, amountStr: undefined, cancel: async () => { null } }, { - prepareRefund: async () => ({}), - applyRefund: async () => ({}), - onUpdateNotification: async () => ({}), - } as any), + useComponentState( + { + talerDepositUri: undefined, + amountStr: undefined, + cancel: async () => { + null; + }, + }, + { + prepareRefund: async () => ({}), + applyRefund: async () => ({}), + onUpdateNotification: async () => ({}), + } as any, + ), ); { @@ -61,14 +68,23 @@ describe("Deposit CTA states", () => { it("should be ready after loading", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerDepositUri: "payto://refund/asdasdas", amountStr: "EUR:1", cancel: async () => { null } }, { - prepareDeposit: async () => - ({ - effectiveDepositAmount: Amounts.parseOrThrow("EUR:1"), - totalDepositCost: Amounts.parseOrThrow("EUR:1.2"), - } as PrepareDepositResponse as any), - createDepositGroup: async () => ({}), - } as any), + useComponentState( + { + talerDepositUri: "payto://refund/asdasdas", + amountStr: "EUR:1", + cancel: async () => { + null; + }, + }, + { + prepareDeposit: async () => + ({ + effectiveDepositAmount: Amounts.parseOrThrow("EUR:1"), + totalDepositCost: Amounts.parseOrThrow("EUR:1.2"), + } as PrepareDepositResponse as any), + createDepositGroup: async () => ({}), + } as any, + ), ); { diff --git a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/index.ts b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/index.ts index 0eefb2092..fe0b0f5f7 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/index.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/index.ts @@ -35,7 +35,6 @@ export type State = | State.Ready; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -59,8 +58,8 @@ export namespace State { status: "ready"; create: ButtonHandler; subject: TextFieldHandler; - toBeReceived: AmountJson, - chosenAmount: AmountJson, + toBeReceived: AmountJson; + chosenAmount: AmountJson; exchangeUrl: string; invalid: boolean; error: undefined; @@ -71,10 +70,12 @@ export namespace State { const viewMapping: StateViewMap = { loading: Loading, "loading-uri": LoadingUriView, - "created": CreatedView, - "ready": ReadyView, + created: CreatedView, + ready: ReadyView, }; - -export const InvoiceCreatePage = compose("InvoiceCreatePage", (p: Props) => useComponentState(p, wxApi), viewMapping) - +export const InvoiceCreatePage = compose( + "InvoiceCreatePage", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts index 804d216eb..8f57582d6 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts @@ -25,21 +25,22 @@ export function useComponentState( { amount: amountStr, onClose }: Props, api: typeof wxApi, ): State { - const amount = Amounts.parseOrThrow(amountStr) + const amount = Amounts.parseOrThrow(amountStr); const [subject, setSubject] = useState(""); - const [talerUri, setTalerUri] = useState("") + const [talerUri, setTalerUri] = useState(""); const hook = useAsyncAsHook(api.listExchanges); - const [exchangeIdx, setExchangeIdx] = useState("0") - const [operationError, setOperationError] = useState(undefined) - + const [exchangeIdx, setExchangeIdx] = useState("0"); + const [operationError, setOperationError] = useState< + TalerErrorDetail | undefined + >(undefined); if (!hook) { return { status: "loading", error: undefined, - } + }; } if (hook.hasError) { return { @@ -54,62 +55,65 @@ export function useComponentState( talerUri, error: undefined, cancel: { - onClick: onClose + onClick: onClose, }, copyToClipboard: { onClick: async () => { navigator.clipboard.writeText(talerUri); - } + }, }, - } + }; } - const exchanges = hook.response.exchanges.filter(e => e.currency === amount.currency); - const exchangeMap = exchanges.reduce((prev, cur, idx) => ({ ...prev, [String(idx)]: cur.exchangeBaseUrl }), {} as Record) + const exchanges = hook.response.exchanges.filter( + (e) => e.currency === amount.currency, + ); + const exchangeMap = exchanges.reduce( + (prev, cur, idx) => ({ ...prev, [String(idx)]: cur.exchangeBaseUrl }), + {} as Record, + ); const selected = exchanges[Number(exchangeIdx)]; async function accept(): Promise { try { - const resp = await api.initiatePeerPullPayment({ amount: Amounts.stringify(amount), exchangeBaseUrl: selected.exchangeBaseUrl, partialContractTerms: { - summary: subject - } - }) - return resp.talerUri + summary: subject, + }, + }); + return resp.talerUri; } catch (e) { if (e instanceof TalerError) { - setOperationError(e.errorDetail) + setOperationError(e.errorDetail); } - console.error(e) - throw Error("error trying to accept") + console.error(e); + throw Error("error trying to accept"); } } - return { status: "ready", subject: { error: !subject ? "cant be empty" : undefined, value: subject, - onInput: async (e) => setSubject(e) + onInput: async (e) => setSubject(e), }, invalid: !subject || Amounts.isZero(amount), exchangeUrl: selected.exchangeBaseUrl, create: { onClick: async () => { const uri = await accept(); - setTalerUri(uri) - } + setTalerUri(uri); + }, }, cancel: { - onClick: onClose + onClick: onClose, }, chosenAmount: amount, toBeReceived: amount, error: undefined, - operationError - } + operationError, + }; } diff --git a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/test.ts b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/test.ts index 631e76d01..eae4d4ca2 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/test.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/test.ts @@ -22,10 +22,7 @@ import { expect } from "chai"; describe("test description", () => { - it("should assert", () => { - - expect([]).deep.equals([]) + expect([]).deep.equals([]); }); -}) - +}); diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts b/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts index 71aedc638..731064661 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts @@ -14,7 +14,12 @@ GNU Taler; see the file COPYING. If not, see */ -import { AbsoluteTime, AmountJson, PreparePayResult, TalerErrorDetail } from "@gnu-taler/taler-util"; +import { + AbsoluteTime, + AmountJson, + PreparePayResult, + TalerErrorDetail, +} from "@gnu-taler/taler-util"; import { Loading } from "../../components/Loading.js"; import { HookError } from "../../hooks/useAsyncAsHook.js"; import { ButtonHandler } from "../../mui/handlers.js"; @@ -37,7 +42,6 @@ export type State = | State.Ready; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -52,20 +56,20 @@ export namespace State { error: undefined; uri: string; cancel: ButtonHandler; - amount: AmountJson, + amount: AmountJson; goToWalletManualWithdraw: (currency: string) => Promise; - summary: string | undefined, - expiration: AbsoluteTime | undefined, + summary: string | undefined; + expiration: AbsoluteTime | undefined; operationError?: TalerErrorDetail; payStatus: PreparePayResult; } export interface NoBalanceForCurrency extends BaseInfo { - status: "no-balance-for-currency" + status: "no-balance-for-currency"; balance: undefined; } export interface NoEnoughBalance extends BaseInfo { - status: "no-enough-balance" + status: "no-enough-balance"; balance: AmountJson; } @@ -82,9 +86,11 @@ const viewMapping: StateViewMap = { "loading-uri": LoadingUriView, "no-balance-for-currency": ReadyView, "no-enough-balance": ReadyView, - "ready": ReadyView, + ready: ReadyView, }; - -export const InvoicePayPage = compose("InvoicePayPage", (p: Props) => useComponentState(p, wxApi), viewMapping) - +export const InvoicePayPage = compose( + "InvoicePayPage", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts b/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts index f87cdf8e1..e69bb4627 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts @@ -14,7 +14,15 @@ GNU Taler; see the file COPYING. If not, see */ -import { AbsoluteTime, Amounts, NotificationType, PreparePayResult, PreparePayResultType, TalerErrorDetail, TalerProtocolTimestamp } from "@gnu-taler/taler-util"; +import { + AbsoluteTime, + Amounts, + NotificationType, + PreparePayResult, + PreparePayResultType, + TalerErrorDetail, + TalerProtocolTimestamp, +} from "@gnu-taler/taler-util"; import { TalerError } from "@gnu-taler/taler-wallet-core"; import { useEffect, useState } from "preact/hooks"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -27,11 +35,11 @@ export function useComponentState( ): State { const hook = useAsyncAsHook(async () => { const p2p = await api.checkPeerPullPayment({ - talerUri: talerPayPullUri - }) + talerUri: talerPayPullUri, + }); const balance = await api.getBalance(); - return { p2p, balance } - }) + return { p2p, balance }; + }); useEffect(() => { api.onUpdateNotification([NotificationType.CoinWithdrawn], () => { @@ -39,13 +47,15 @@ export function useComponentState( }); }); - const [operationError, setOperationError] = useState(undefined) + const [operationError, setOperationError] = useState< + TalerErrorDetail | undefined + >(undefined); if (!hook) { return { status: "loading", error: undefined, - } + }; } if (hook.hasError) { return { @@ -56,13 +66,17 @@ export function useComponentState( // const { payStatus } = hook.response.p2p; - const { amount: purseAmount, contractTerms, peerPullPaymentIncomingId } = hook.response.p2p + const { + amount: purseAmount, + contractTerms, + peerPullPaymentIncomingId, + } = hook.response.p2p; - - const amountStr: string = contractTerms?.amount - const amount = Amounts.parseOrThrow(amountStr) - const summary: string | undefined = contractTerms?.summary - const expiration: TalerProtocolTimestamp | undefined = contractTerms?.purse_expiration + const amountStr: string = contractTerms?.amount; + const amount = Amounts.parseOrThrow(amountStr); + const summary: string | undefined = contractTerms?.summary; + const expiration: TalerProtocolTimestamp | undefined = + contractTerms?.purse_expiration; const foundBalance = hook.response.balance.balances.find( (b) => Amounts.parseOrThrow(b.available).currency === amount.currency, @@ -71,35 +85,32 @@ export function useComponentState( const paymentPossible: PreparePayResult = { status: PreparePayResultType.PaymentPossible, proposalId: "fakeID", - contractTerms: { - } as any, + contractTerms: {} as any, contractTermsHash: "asd", amountRaw: hook.response.p2p.amount, amountEffective: hook.response.p2p.amount, noncePriv: "", - } as PreparePayResult + } as PreparePayResult; const insufficientBalance: PreparePayResult = { status: PreparePayResultType.InsufficientBalance, proposalId: "fakeID", - contractTerms: { - } as any, + contractTerms: {} as any, amountRaw: hook.response.p2p.amount, noncePriv: "", - } - + }; const baseResult = { uri: talerPayPullUri, cancel: { - onClick: onClose + onClick: onClose, }, amount, goToWalletManualWithdraw, summary, expiration: expiration ? AbsoluteTime.fromTimestamp(expiration) : undefined, operationError, - } + }; if (!foundBalance) { return { @@ -108,20 +119,21 @@ export function useComponentState( balance: undefined, ...baseResult, payStatus: insufficientBalance, - } + }; } const foundAmount = Amounts.parseOrThrow(foundBalance.available); //FIXME: should use pay result type since it check for coins exceptions - if (Amounts.cmp(foundAmount, amount) < 0) { //payStatus.status === PreparePayResultType.InsufficientBalance) { + if (Amounts.cmp(foundAmount, amount) < 0) { + //payStatus.status === PreparePayResultType.InsufficientBalance) { return { - status: 'no-enough-balance', + status: "no-enough-balance", error: undefined, balance: foundAmount, ...baseResult, payStatus: insufficientBalance, - } + }; } // if (payStatus.status === PreparePayResultType.AlreadyConfirmed) { @@ -135,19 +147,18 @@ export function useComponentState( async function accept(): Promise { try { const resp = await api.acceptPeerPullPayment({ - peerPullPaymentIncomingId - }) - await onClose() + peerPullPaymentIncomingId, + }); + await onClose(); } catch (e) { if (e instanceof TalerError) { - setOperationError(e.errorDetail) + setOperationError(e.errorDetail); } - console.error(e) - throw Error("error trying to accept") + console.error(e); + throw Error("error trying to accept"); } } - return { status: "ready", error: undefined, @@ -155,7 +166,7 @@ export function useComponentState( payStatus: paymentPossible, balance: foundAmount, accept: { - onClick: accept + onClick: accept, }, - } + }; } diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/test.ts b/packages/taler-wallet-webextension/src/cta/InvoicePay/test.ts index 631e76d01..eae4d4ca2 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/test.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/test.ts @@ -22,10 +22,7 @@ import { expect } from "chai"; describe("test description", () => { - it("should assert", () => { - - expect([]).deep.equals([]) + expect([]).deep.equals([]); }); -}) - +}); diff --git a/packages/taler-wallet-webextension/src/cta/Payment/index.ts b/packages/taler-wallet-webextension/src/cta/Payment/index.ts index 6e401f7d2..b20f91b0c 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Payment/index.ts @@ -14,7 +14,14 @@ GNU Taler; see the file COPYING. If not, see */ -import { AmountJson, ConfirmPayResult, PreparePayResult, PreparePayResultAlreadyConfirmed, PreparePayResultInsufficientBalance, PreparePayResultPaymentPossible } from "@gnu-taler/taler-util"; +import { + AmountJson, + ConfirmPayResult, + PreparePayResult, + PreparePayResultAlreadyConfirmed, + PreparePayResultInsufficientBalance, + PreparePayResultPaymentPossible, +} from "@gnu-taler/taler-util"; import { TalerError } from "@gnu-taler/taler-wallet-core"; import { Loading } from "../../components/Loading.js"; import { HookError } from "../../hooks/useAsyncAsHook.js"; @@ -24,8 +31,6 @@ import * as wxApi from "../../wxApi.js"; import { useComponentState } from "./state.js"; import { LoadingUriView, BaseView } from "./views.js"; - - export interface Props { talerPayUri?: string; goToWalletManualWithdraw: (amount?: string) => Promise; @@ -42,7 +47,6 @@ export type State = | State.Confirmed; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -60,12 +64,12 @@ export namespace State { cancel: () => Promise; } export interface NoBalanceForCurrency extends BaseInfo { - status: "no-balance-for-currency" + status: "no-balance-for-currency"; payStatus: PreparePayResult; balance: undefined; } export interface NoEnoughBalance extends BaseInfo { - status: "no-enough-balance" + status: "no-enough-balance"; payStatus: PreparePayResult; balance: AmountJson; } @@ -101,4 +105,8 @@ const viewMapping: StateViewMap = { ready: BaseView, }; -export const PaymentPage = compose("Payment", (p: Props) => useComponentState(p, wxApi), viewMapping) +export const PaymentPage = compose( + "Payment", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/Payment/state.ts b/packages/taler-wallet-webextension/src/cta/Payment/state.ts index ad4bb7004..488263bb8 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Payment/state.ts @@ -14,8 +14,15 @@ GNU Taler; see the file COPYING. If not, see */ - -import { AmountJson, Amounts, ConfirmPayResult, ConfirmPayResultType, NotificationType, PreparePayResultType, TalerErrorCode } from "@gnu-taler/taler-util"; +import { + AmountJson, + Amounts, + ConfirmPayResult, + ConfirmPayResultType, + NotificationType, + PreparePayResultType, + TalerErrorCode, +} from "@gnu-taler/taler-util"; import { TalerError } from "@gnu-taler/taler-wallet-core"; import { useEffect, useState } from "preact/hooks"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -82,8 +89,9 @@ export function useComponentState( uri: hook.response.uri, amount, error: undefined, - cancel, goToWalletManualWithdraw - } + cancel, + goToWalletManualWithdraw, + }; if (!foundBalance) { return { @@ -91,7 +99,7 @@ export function useComponentState( balance: undefined, payStatus, ...baseResult, - } + }; } const foundAmount = Amounts.parseOrThrow(foundBalance.available); @@ -109,11 +117,11 @@ export function useComponentState( if (payStatus.status === PreparePayResultType.InsufficientBalance) { return { - status: 'no-enough-balance', + status: "no-enough-balance", balance: foundAmount, payStatus, ...baseResult, - } + }; } if (payStatus.status === PreparePayResultType.AlreadyConfirmed) { @@ -125,7 +133,6 @@ export function useComponentState( }; } - async function doPayment(): Promise { try { if (payStatus.status !== "payment-possible") { @@ -169,8 +176,6 @@ export function useComponentState( payHandler, payStatus, ...baseResult, - balance: foundAmount + balance: foundAmount, }; - } - diff --git a/packages/taler-wallet-webextension/src/cta/Payment/test.ts b/packages/taler-wallet-webextension/src/cta/Payment/test.ts index 2052927b1..235b22c22 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Payment/test.ts @@ -70,9 +70,16 @@ describe("Payment CTA states", () => { it("should tell the user that the URI is missing", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerPayUri: undefined, cancel: nullFunction, goToWalletManualWithdraw: nullFunction }, { - onUpdateNotification: nullFunction, - } as Partial as any), + useComponentState( + { + talerPayUri: undefined, + cancel: nullFunction, + goToWalletManualWithdraw: nullFunction, + }, + { + onUpdateNotification: nullFunction, + } as Partial as any, + ), ); { @@ -98,18 +105,25 @@ describe("Payment CTA states", () => { it("should response with no balance", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerPayUri: "taller://pay", cancel: nullFunction, goToWalletManualWithdraw: nullFunction }, { - onUpdateNotification: nullFunction, - preparePay: async () => - ({ - amountRaw: "USD:10", - status: PreparePayResultType.InsufficientBalance, - } as Partial), - getBalance: async () => - ({ - balances: [], - } as Partial), - } as Partial as any), + useComponentState( + { + talerPayUri: "taller://pay", + cancel: nullFunction, + goToWalletManualWithdraw: nullFunction, + }, + { + onUpdateNotification: nullFunction, + preparePay: async () => + ({ + amountRaw: "USD:10", + status: PreparePayResultType.InsufficientBalance, + } as Partial), + getBalance: async () => + ({ + balances: [], + } as Partial), + } as Partial as any, + ), ); { @@ -133,22 +147,29 @@ describe("Payment CTA states", () => { it("should not be able to pay if there is no enough balance", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerPayUri: "taller://pay", cancel: nullFunction, goToWalletManualWithdraw: nullFunction }, { - onUpdateNotification: nullFunction, - preparePay: async () => - ({ - amountRaw: "USD:10", - status: PreparePayResultType.InsufficientBalance, - } as Partial), - getBalance: async () => - ({ - balances: [ - { - available: "USD:5", - }, - ], - } as Partial), - } as Partial as any), + useComponentState( + { + talerPayUri: "taller://pay", + cancel: nullFunction, + goToWalletManualWithdraw: nullFunction, + }, + { + onUpdateNotification: nullFunction, + preparePay: async () => + ({ + amountRaw: "USD:10", + status: PreparePayResultType.InsufficientBalance, + } as Partial), + getBalance: async () => + ({ + balances: [ + { + available: "USD:5", + }, + ], + } as Partial), + } as Partial as any, + ), ); { @@ -172,23 +193,30 @@ describe("Payment CTA states", () => { it("should be able to pay (without fee)", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerPayUri: "taller://pay", cancel: nullFunction, goToWalletManualWithdraw: nullFunction }, { - onUpdateNotification: nullFunction, - preparePay: async () => - ({ - amountRaw: "USD:10", - amountEffective: "USD:10", - status: PreparePayResultType.PaymentPossible, - } as Partial), - getBalance: async () => - ({ - balances: [ - { - available: "USD:15", - }, - ], - } as Partial), - } as Partial as any), + useComponentState( + { + talerPayUri: "taller://pay", + cancel: nullFunction, + goToWalletManualWithdraw: nullFunction, + }, + { + onUpdateNotification: nullFunction, + preparePay: async () => + ({ + amountRaw: "USD:10", + amountEffective: "USD:10", + status: PreparePayResultType.PaymentPossible, + } as Partial), + getBalance: async () => + ({ + balances: [ + { + available: "USD:15", + }, + ], + } as Partial), + } as Partial as any, + ), ); { @@ -214,23 +242,30 @@ describe("Payment CTA states", () => { it("should be able to pay (with fee)", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerPayUri: "taller://pay", cancel: nullFunction, goToWalletManualWithdraw: nullFunction }, { - onUpdateNotification: nullFunction, - preparePay: async () => - ({ - amountRaw: "USD:9", - amountEffective: "USD:10", - status: PreparePayResultType.PaymentPossible, - } as Partial), - getBalance: async () => - ({ - balances: [ - { - available: "USD:15", - }, - ], - } as Partial), - } as Partial as any), + useComponentState( + { + talerPayUri: "taller://pay", + cancel: nullFunction, + goToWalletManualWithdraw: nullFunction, + }, + { + onUpdateNotification: nullFunction, + preparePay: async () => + ({ + amountRaw: "USD:9", + amountEffective: "USD:10", + status: PreparePayResultType.PaymentPossible, + } as Partial), + getBalance: async () => + ({ + balances: [ + { + available: "USD:15", + }, + ], + } as Partial), + } as Partial as any, + ), ); { @@ -256,28 +291,35 @@ describe("Payment CTA states", () => { it("should get confirmation done after pay successfully", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerPayUri: "taller://pay", cancel: nullFunction, goToWalletManualWithdraw: nullFunction }, { - onUpdateNotification: nullFunction, - preparePay: async () => - ({ - amountRaw: "USD:9", - amountEffective: "USD:10", - status: PreparePayResultType.PaymentPossible, - } as Partial), - getBalance: async () => - ({ - balances: [ - { - available: "USD:15", - }, - ], - } as Partial), - confirmPay: async () => - ({ - type: ConfirmPayResultType.Done, - contractTerms: {}, - } as Partial), - } as Partial as any), + useComponentState( + { + talerPayUri: "taller://pay", + cancel: nullFunction, + goToWalletManualWithdraw: nullFunction, + }, + { + onUpdateNotification: nullFunction, + preparePay: async () => + ({ + amountRaw: "USD:9", + amountEffective: "USD:10", + status: PreparePayResultType.PaymentPossible, + } as Partial), + getBalance: async () => + ({ + balances: [ + { + available: "USD:15", + }, + ], + } as Partial), + confirmPay: async () => + ({ + type: ConfirmPayResultType.Done, + contractTerms: {}, + } as Partial), + } as Partial as any, + ), ); { @@ -317,28 +359,35 @@ describe("Payment CTA states", () => { it("should not stay in ready state after pay with error", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerPayUri: "taller://pay", cancel: nullFunction, goToWalletManualWithdraw: nullFunction }, { - onUpdateNotification: nullFunction, - preparePay: async () => - ({ - amountRaw: "USD:9", - amountEffective: "USD:10", - status: PreparePayResultType.PaymentPossible, - } as Partial), - getBalance: async () => - ({ - balances: [ - { - available: "USD:15", - }, - ], - } as Partial), - confirmPay: async () => - ({ - type: ConfirmPayResultType.Pending, - lastError: { code: 1 }, - } as Partial), - } as Partial as any), + useComponentState( + { + talerPayUri: "taller://pay", + cancel: nullFunction, + goToWalletManualWithdraw: nullFunction, + }, + { + onUpdateNotification: nullFunction, + preparePay: async () => + ({ + amountRaw: "USD:9", + amountEffective: "USD:10", + status: PreparePayResultType.PaymentPossible, + } as Partial), + getBalance: async () => + ({ + balances: [ + { + available: "USD:15", + }, + ], + } as Partial), + confirmPay: async () => + ({ + type: ConfirmPayResultType.Pending, + lastError: { code: 1 }, + } as Partial), + } as Partial as any, + ), ); { @@ -393,23 +442,30 @@ describe("Payment CTA states", () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerPayUri: "taller://pay", cancel: nullFunction, goToWalletManualWithdraw: nullFunction }, { - onUpdateNotification: subscriptions.saveSubscription, - preparePay: async () => - ({ - amountRaw: "USD:9", - amountEffective: "USD:10", - status: PreparePayResultType.PaymentPossible, - } as Partial), - getBalance: async () => - ({ - balances: [ - { - available: Amounts.stringify(availableBalance), - }, - ], - } as Partial), - } as Partial as any), + useComponentState( + { + talerPayUri: "taller://pay", + cancel: nullFunction, + goToWalletManualWithdraw: nullFunction, + }, + { + onUpdateNotification: subscriptions.saveSubscription, + preparePay: async () => + ({ + amountRaw: "USD:9", + amountEffective: "USD:10", + status: PreparePayResultType.PaymentPossible, + } as Partial), + getBalance: async () => + ({ + balances: [ + { + available: Amounts.stringify(availableBalance), + }, + ], + } as Partial), + } as Partial as any, + ), ); { diff --git a/packages/taler-wallet-webextension/src/cta/Refund/index.ts b/packages/taler-wallet-webextension/src/cta/Refund/index.ts index d1f808f00..f513ee3b7 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Refund/index.ts @@ -21,9 +21,13 @@ import { ButtonHandler } from "../../mui/handlers.js"; import { compose, StateViewMap } from "../../utils/index.js"; import * as wxApi from "../../wxApi.js"; import { useComponentState } from "./state.js"; -import { CompletedView, IgnoredView, InProgressView, LoadingUriView, ReadyView } from "./views.js"; - - +import { + CompletedView, + IgnoredView, + InProgressView, + LoadingUriView, + ReadyView, +} from "./views.js"; export interface Props { talerRefundUri?: string; @@ -39,7 +43,6 @@ export type State = | State.Completed; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -75,13 +78,11 @@ export namespace State { export interface InProgress extends BaseInfo { status: "in-progress"; error: undefined; - } export interface Completed extends BaseInfo { status: "completed"; error: undefined; } - } const viewMapping: StateViewMap = { @@ -93,4 +94,8 @@ const viewMapping: StateViewMap = { ready: ReadyView, }; -export const RefundPage = compose("Refund", (p: Props) => useComponentState(p, wxApi), viewMapping) +export const RefundPage = compose( + "Refund", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/Refund/state.ts b/packages/taler-wallet-webextension/src/cta/Refund/state.ts index e520be8e5..8d36b61ea 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Refund/state.ts @@ -14,7 +14,6 @@ GNU Taler; see the file COPYING. If not, see */ - import { Amounts, NotificationType } from "@gnu-taler/taler-util"; import { useEffect, useState } from "preact/hooks"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -40,7 +39,7 @@ export function useComponentState( }); if (!info) { - return { status: "loading", error: undefined } + return { status: "loading", error: undefined }; } if (info.hasError) { return { @@ -67,7 +66,7 @@ export function useComponentState( products: info.response.refund.info.products, awaitingAmount: Amounts.parseOrThrow(refund.awaiting), error: undefined, - } + }; if (ignored) { return { diff --git a/packages/taler-wallet-webextension/src/cta/Refund/test.ts b/packages/taler-wallet-webextension/src/cta/Refund/test.ts index e238078db..04d3e0d5f 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Refund/test.ts @@ -21,8 +21,9 @@ import { AmountJson, - Amounts, NotificationType, - PrepareRefundResult + Amounts, + NotificationType, + PrepareRefundResult, } from "@gnu-taler/taler-util"; import { expect } from "chai"; import { mountHook } from "../../test-utils.js"; @@ -33,11 +34,19 @@ describe("Refund CTA states", () => { it("should tell the user that the URI is missing", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerRefundUri: undefined, cancel: async () => { null } }, { - prepareRefund: async () => ({}), - applyRefund: async () => ({}), - onUpdateNotification: async () => ({}), - } as any), + useComponentState( + { + talerRefundUri: undefined, + cancel: async () => { + null; + }, + }, + { + prepareRefund: async () => ({}), + applyRefund: async () => ({}), + onUpdateNotification: async () => ({}), + } as any, + ), ); { @@ -64,27 +73,35 @@ describe("Refund CTA states", () => { it("should be ready after loading", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerRefundUri: "taler://refund/asdasdas", cancel: async () => { null } }, { - prepareRefund: async () => - ({ - effectivePaid: "EUR:2", - awaiting: "EUR:2", - gone: "EUR:0", - granted: "EUR:0", - pending: false, - proposalId: "1", - info: { - contractTermsHash: "123", - merchant: { - name: "the merchant name", - }, - orderId: "orderId1", - summary: "the summary", + useComponentState( + { + talerRefundUri: "taler://refund/asdasdas", + cancel: async () => { + null; }, - } as PrepareRefundResult as any), - applyRefund: async () => ({}), - onUpdateNotification: async () => ({}), - } as any), + }, + { + prepareRefund: async () => + ({ + effectivePaid: "EUR:2", + awaiting: "EUR:2", + gone: "EUR:0", + granted: "EUR:0", + pending: false, + proposalId: "1", + info: { + contractTermsHash: "123", + merchant: { + name: "the merchant name", + }, + orderId: "orderId1", + summary: "the summary", + }, + } as PrepareRefundResult as any), + applyRefund: async () => ({}), + onUpdateNotification: async () => ({}), + } as any, + ), ); { @@ -113,27 +130,35 @@ describe("Refund CTA states", () => { it("should be ignored after clicking the ignore button", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerRefundUri: "taler://refund/asdasdas", cancel: async () => { null } }, { - prepareRefund: async () => - ({ - effectivePaid: "EUR:2", - awaiting: "EUR:2", - gone: "EUR:0", - granted: "EUR:0", - pending: false, - proposalId: "1", - info: { - contractTermsHash: "123", - merchant: { - name: "the merchant name", - }, - orderId: "orderId1", - summary: "the summary", + useComponentState( + { + talerRefundUri: "taler://refund/asdasdas", + cancel: async () => { + null; }, - } as PrepareRefundResult as any), - applyRefund: async () => ({}), - onUpdateNotification: async () => ({}), - } as any), + }, + { + prepareRefund: async () => + ({ + effectivePaid: "EUR:2", + awaiting: "EUR:2", + gone: "EUR:0", + granted: "EUR:0", + pending: false, + proposalId: "1", + info: { + contractTermsHash: "123", + merchant: { + name: "the merchant name", + }, + orderId: "orderId1", + summary: "the summary", + }, + } as PrepareRefundResult as any), + applyRefund: async () => ({}), + onUpdateNotification: async () => ({}), + } as any, + ), ); { @@ -189,27 +214,35 @@ describe("Refund CTA states", () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerRefundUri: "taler://refund/asdasdas", cancel: async () => { null } }, { - prepareRefund: async () => - ({ - awaiting: Amounts.stringify(awaiting), - effectivePaid: "EUR:2", - gone: "EUR:0", - granted: Amounts.stringify(granted), - pending, - proposalId: "1", - info: { - contractTermsHash: "123", - merchant: { - name: "the merchant name", - }, - orderId: "orderId1", - summary: "the summary", + useComponentState( + { + talerRefundUri: "taler://refund/asdasdas", + cancel: async () => { + null; }, - } as PrepareRefundResult as any), - applyRefund: async () => ({}), - onUpdateNotification: subscriptions.saveSubscription, - } as any), + }, + { + prepareRefund: async () => + ({ + awaiting: Amounts.stringify(awaiting), + effectivePaid: "EUR:2", + gone: "EUR:0", + granted: Amounts.stringify(granted), + pending, + proposalId: "1", + info: { + contractTermsHash: "123", + merchant: { + name: "the merchant name", + }, + orderId: "orderId1", + summary: "the summary", + }, + } as PrepareRefundResult as any), + applyRefund: async () => ({}), + onUpdateNotification: subscriptions.saveSubscription, + } as any, + ), ); { diff --git a/packages/taler-wallet-webextension/src/cta/Tip/index.ts b/packages/taler-wallet-webextension/src/cta/Tip/index.ts index 53c890b2c..4bdad0808 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Tip/index.ts @@ -20,13 +20,14 @@ import { HookError } from "../../hooks/useAsyncAsHook.js"; import { ButtonHandler, SelectFieldHandler } from "../../mui/handlers.js"; import { compose, StateViewMap } from "../../utils/index.js"; import * as wxApi from "../../wxApi.js"; -import { - Props as TermsOfServiceSectionProps -} from "../TermsOfServiceSection.js"; +import { Props as TermsOfServiceSectionProps } from "../TermsOfServiceSection.js"; import { useComponentState } from "./state.js"; -import { AcceptedView, IgnoredView, LoadingUriView, ReadyView } from "./views.js"; - - +import { + AcceptedView, + IgnoredView, + LoadingUriView, + ReadyView, +} from "./views.js"; export interface Props { talerTipUri?: string; @@ -42,7 +43,6 @@ export type State = | State.Ignored; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -77,9 +77,13 @@ export namespace State { const viewMapping: StateViewMap = { loading: Loading, "loading-uri": LoadingUriView, - "accepted": AcceptedView, - "ignored": IgnoredView, - "ready": ReadyView, + accepted: AcceptedView, + ignored: IgnoredView, + ready: ReadyView, }; -export const TipPage = compose("Tip", (p: Props) => useComponentState(p, wxApi), viewMapping) +export const TipPage = compose( + "Tip", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/Tip/state.ts b/packages/taler-wallet-webextension/src/cta/Tip/state.ts index aa62bd5e3..333337e78 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Tip/state.ts @@ -14,7 +14,6 @@ GNU Taler; see the file COPYING. If not, see */ - import { Amounts } from "@gnu-taler/taler-util"; import { useState } from "preact/hooks"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -37,7 +36,7 @@ export function useComponentState( return { status: "loading", error: undefined, - } + }; } if (tipInfo.hasError) { return { @@ -59,9 +58,9 @@ export function useComponentState( amount: Amounts.parseOrThrow(tip.tipAmountEffective), error: undefined, cancel: { - onClick: onCancel - } - } + onClick: onCancel, + }, + }; if (tipIgnored) { return { @@ -85,4 +84,3 @@ export function useComponentState( }, }; } - diff --git a/packages/taler-wallet-webextension/src/cta/Tip/test.ts b/packages/taler-wallet-webextension/src/cta/Tip/test.ts index ccb36572e..4895fcc7f 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Tip/test.ts @@ -19,9 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { - Amounts, PrepareTipResult -} from "@gnu-taler/taler-util"; +import { Amounts, PrepareTipResult } from "@gnu-taler/taler-util"; import { expect } from "chai"; import { mountHook } from "../../test-utils.js"; import { useComponentState } from "./state.js"; @@ -30,10 +28,18 @@ describe("Tip CTA states", () => { it("should tell the user that the URI is missing", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerTipUri: undefined, onCancel: async () => { null } }, { - prepareTip: async () => ({}), - acceptTip: async () => ({}), - } as any), + useComponentState( + { + talerTipUri: undefined, + onCancel: async () => { + null; + }, + }, + { + prepareTip: async () => ({}), + acceptTip: async () => ({}), + } as any, + ), ); { @@ -62,19 +68,27 @@ describe("Tip CTA states", () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerTipUri: "taler://tip/asd", onCancel: async () => { null } }, { - prepareTip: async () => - ({ - accepted: tipAccepted, - exchangeBaseUrl: "exchange url", - merchantBaseUrl: "merchant url", - tipAmountEffective: "EUR:1", - walletTipId: "tip_id", - } as PrepareTipResult as any), - acceptTip: async () => { - tipAccepted = true; + useComponentState( + { + talerTipUri: "taler://tip/asd", + onCancel: async () => { + null; + }, }, - } as any), + { + prepareTip: async () => + ({ + accepted: tipAccepted, + exchangeBaseUrl: "exchange url", + merchantBaseUrl: "merchant url", + tipAmountEffective: "EUR:1", + walletTipId: "tip_id", + } as PrepareTipResult as any), + acceptTip: async () => { + tipAccepted = true; + }, + } as any, + ), ); { @@ -114,16 +128,24 @@ describe("Tip CTA states", () => { it("should be ignored after clicking the ignore button", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerTipUri: "taler://tip/asd", onCancel: async () => { null } }, { - prepareTip: async () => - ({ - exchangeBaseUrl: "exchange url", - merchantBaseUrl: "merchant url", - tipAmountEffective: "EUR:1", - walletTipId: "tip_id", - } as PrepareTipResult as any), - acceptTip: async () => ({}), - } as any), + useComponentState( + { + talerTipUri: "taler://tip/asd", + onCancel: async () => { + null; + }, + }, + { + prepareTip: async () => + ({ + exchangeBaseUrl: "exchange url", + merchantBaseUrl: "merchant url", + tipAmountEffective: "EUR:1", + walletTipId: "tip_id", + } as PrepareTipResult as any), + acceptTip: async () => ({}), + } as any, + ), ); { @@ -160,17 +182,25 @@ describe("Tip CTA states", () => { it("should render accepted if the tip has been used previously", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentState({ talerTipUri: "taler://tip/asd", onCancel: async () => { null } }, { - prepareTip: async () => - ({ - accepted: true, - exchangeBaseUrl: "exchange url", - merchantBaseUrl: "merchant url", - tipAmountEffective: "EUR:1", - walletTipId: "tip_id", - } as PrepareTipResult as any), - acceptTip: async () => ({}), - } as any), + useComponentState( + { + talerTipUri: "taler://tip/asd", + onCancel: async () => { + null; + }, + }, + { + prepareTip: async () => + ({ + accepted: true, + exchangeBaseUrl: "exchange url", + merchantBaseUrl: "merchant url", + tipAmountEffective: "EUR:1", + walletTipId: "tip_id", + } as PrepareTipResult as any), + acceptTip: async () => ({}), + } as any, + ), ); { diff --git a/packages/taler-wallet-webextension/src/cta/TransferCreate/index.ts b/packages/taler-wallet-webextension/src/cta/TransferCreate/index.ts index c23d42e11..1794b837b 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferCreate/index.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferCreate/index.ts @@ -35,7 +35,6 @@ export type State = | State.Ready; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -59,9 +58,9 @@ export namespace State { status: "ready"; invalid: boolean; create: ButtonHandler; - toBeReceived: AmountJson, - chosenAmount: AmountJson, - subject: TextFieldHandler, + toBeReceived: AmountJson; + chosenAmount: AmountJson; + subject: TextFieldHandler; error: undefined; operationError?: TalerErrorDetail; } @@ -70,10 +69,12 @@ export namespace State { const viewMapping: StateViewMap = { loading: Loading, "loading-uri": LoadingUriView, - "created": CreatedView, - "ready": ReadyView, + created: CreatedView, + ready: ReadyView, }; - -export const TransferCreatePage = compose("TransferCreatePage", (p: Props) => useComponentState(p, wxApi), viewMapping) - +export const TransferCreatePage = compose( + "TransferCreatePage", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts b/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts index f11526c0e..e6397f2e9 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts @@ -24,11 +24,13 @@ export function useComponentState( { amount: amountStr, onClose }: Props, api: typeof wxApi, ): State { - const amount = Amounts.parseOrThrow(amountStr) + const amount = Amounts.parseOrThrow(amountStr); const [subject, setSubject] = useState(""); - const [talerUri, setTalerUri] = useState("") - const [operationError, setOperationError] = useState(undefined) + const [talerUri, setTalerUri] = useState(""); + const [operationError, setOperationError] = useState< + TalerErrorDetail | undefined + >(undefined); if (talerUri) { return { @@ -41,28 +43,26 @@ export function useComponentState( copyToClipboard: { onClick: async () => { navigator.clipboard.writeText(talerUri); - } + }, }, - } + }; } - async function accept(): Promise { try { - const resp = await api.initiatePeerPushPayment({ amount: Amounts.stringify(amount), partialContractTerms: { - summary: subject - } - }) - return resp.talerUri + summary: subject, + }, + }); + return resp.talerUri; } catch (e) { if (e instanceof TalerError) { - setOperationError(e.errorDetail) + setOperationError(e.errorDetail); } - console.error(e) - throw Error("error trying to accept") + console.error(e); + throw Error("error trying to accept"); } } return { @@ -74,17 +74,17 @@ export function useComponentState( subject: { error: !subject ? "cant be empty" : undefined, value: subject, - onInput: async (e) => setSubject(e) + onInput: async (e) => setSubject(e), }, create: { onClick: async () => { const uri = await accept(); - setTalerUri(uri) - } + setTalerUri(uri); + }, }, chosenAmount: amount, toBeReceived: amount, error: undefined, - operationError - } + operationError, + }; } diff --git a/packages/taler-wallet-webextension/src/cta/TransferCreate/test.ts b/packages/taler-wallet-webextension/src/cta/TransferCreate/test.ts index 631e76d01..eae4d4ca2 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferCreate/test.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferCreate/test.ts @@ -22,10 +22,7 @@ import { expect } from "chai"; describe("test description", () => { - it("should assert", () => { - - expect([]).deep.equals([]) + expect([]).deep.equals([]); }); -}) - +}); diff --git a/packages/taler-wallet-webextension/src/cta/TransferPickup/index.ts b/packages/taler-wallet-webextension/src/cta/TransferPickup/index.ts index 08428851e..914296062 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferPickup/index.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferPickup/index.ts @@ -14,7 +14,11 @@ GNU Taler; see the file COPYING. If not, see */ -import { AbsoluteTime, AmountJson, TalerErrorDetail } from "@gnu-taler/taler-util"; +import { + AbsoluteTime, + AmountJson, + TalerErrorDetail, +} from "@gnu-taler/taler-util"; import { Loading } from "../../components/Loading.js"; import { HookError } from "../../hooks/useAsyncAsHook.js"; import { ButtonHandler } from "../../mui/handlers.js"; @@ -28,13 +32,9 @@ export interface Props { onClose: () => Promise; } -export type State = - | State.Loading - | State.LoadingUriError - | State.Ready; +export type State = State.Loading | State.LoadingUriError | State.Ready; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -51,7 +51,7 @@ export namespace State { } export interface Ready extends BaseInfo { status: "ready"; - amount: AmountJson, + amount: AmountJson; summary: string | undefined; expiration: AbsoluteTime | undefined; error: undefined; @@ -63,9 +63,11 @@ export namespace State { const viewMapping: StateViewMap = { loading: Loading, "loading-uri": LoadingUriView, - "ready": ReadyView, + ready: ReadyView, }; - -export const TransferPickupPage = compose("TransferPickupPage", (p: Props) => useComponentState(p, wxApi), viewMapping) - +export const TransferPickupPage = compose( + "TransferPickupPage", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/TransferPickup/state.ts b/packages/taler-wallet-webextension/src/cta/TransferPickup/state.ts index ce4c7236d..d4c863608 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferPickup/state.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferPickup/state.ts @@ -14,7 +14,12 @@ GNU Taler; see the file COPYING. If not, see */ -import { AbsoluteTime, Amounts, TalerErrorDetail, TalerProtocolTimestamp } from "@gnu-taler/taler-util"; +import { + AbsoluteTime, + Amounts, + TalerErrorDetail, + TalerProtocolTimestamp, +} from "@gnu-taler/taler-util"; import { TalerError } from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -28,15 +33,17 @@ export function useComponentState( const hook = useAsyncAsHook(async () => { return await api.checkPeerPushPayment({ talerUri: talerPayPushUri, - }) - }, []) - const [operationError, setOperationError] = useState(undefined) + }); + }, []); + const [operationError, setOperationError] = useState< + TalerErrorDetail | undefined + >(undefined); if (!hook) { return { status: "loading", error: undefined, - } + }; } if (hook.hasError) { return { @@ -45,24 +52,29 @@ export function useComponentState( }; } - const { amount: purseAmount, contractTerms, peerPushPaymentIncomingId } = hook.response + const { + amount: purseAmount, + contractTerms, + peerPushPaymentIncomingId, + } = hook.response; - const amount: string = contractTerms?.amount - const summary: string | undefined = contractTerms?.summary - const expiration: TalerProtocolTimestamp | undefined = contractTerms?.purse_expiration + const amount: string = contractTerms?.amount; + const summary: string | undefined = contractTerms?.summary; + const expiration: TalerProtocolTimestamp | undefined = + contractTerms?.purse_expiration; async function accept(): Promise { try { const resp = await api.acceptPeerPushPayment({ - peerPushPaymentIncomingId - }) - await onClose() + peerPushPaymentIncomingId, + }); + await onClose(); } catch (e) { if (e instanceof TalerError) { - setOperationError(e.errorDetail) + setOperationError(e.errorDetail); } - console.error(e) - throw Error("error trying to accept") + console.error(e); + throw Error("error trying to accept"); } } return { @@ -70,13 +82,13 @@ export function useComponentState( amount: Amounts.parseOrThrow(amount), error: undefined, accept: { - onClick: accept + onClick: accept, }, summary, expiration: expiration ? AbsoluteTime.fromTimestamp(expiration) : undefined, cancel: { - onClick: onClose + onClick: onClose, }, - operationError - } + operationError, + }; } diff --git a/packages/taler-wallet-webextension/src/cta/TransferPickup/test.ts b/packages/taler-wallet-webextension/src/cta/TransferPickup/test.ts index 631e76d01..eae4d4ca2 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferPickup/test.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferPickup/test.ts @@ -22,10 +22,7 @@ import { expect } from "chai"; describe("test description", () => { - it("should assert", () => { - - expect([]).deep.equals([]) + expect([]).deep.equals([]); }); -}) - +}); diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/index.ts b/packages/taler-wallet-webextension/src/cta/Withdraw/index.ts index 7bd667268..d777489ab 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/index.ts @@ -20,12 +20,18 @@ import { HookError } from "../../hooks/useAsyncAsHook.js"; import { ButtonHandler, SelectFieldHandler } from "../../mui/handlers.js"; import { compose, StateViewMap } from "../../utils/index.js"; import * as wxApi from "../../wxApi.js"; +import { Props as TermsOfServiceSectionProps } from "../TermsOfServiceSection.js"; import { - Props as TermsOfServiceSectionProps -} from "../TermsOfServiceSection.js"; -import { useComponentStateFromParams, useComponentStateFromURI } from "./state.js"; -import { CompletedView, LoadingExchangeView, LoadingInfoView, LoadingUriView, SuccessView } from "./views.js"; - + useComponentStateFromParams, + useComponentStateFromURI, +} from "./state.js"; +import { + CompletedView, + LoadingExchangeView, + LoadingInfoView, + LoadingUriView, + SuccessView, +} from "./views.js"; export interface PropsFromURI { talerWithdrawUri: string | undefined; @@ -46,7 +52,6 @@ export type State = | State.Completed; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -99,5 +104,13 @@ const viewMapping: StateViewMap = { success: SuccessView, }; -export const WithdrawPageFromURI = compose("WithdrawPageFromURI", (p: PropsFromURI) => useComponentStateFromURI(p, wxApi), viewMapping) -export const WithdrawPageFromParams = compose("WithdrawPageFromParams", (p: PropsFromParams) => useComponentStateFromParams(p, wxApi), viewMapping) +export const WithdrawPageFromURI = compose( + "WithdrawPageFromURI", + (p: PropsFromURI) => useComponentStateFromURI(p, wxApi), + viewMapping, +); +export const WithdrawPageFromParams = compose( + "WithdrawPageFromParams", + (p: PropsFromParams) => useComponentStateFromParams(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts index 0d2e150e7..0b174d34c 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts @@ -14,7 +14,6 @@ GNU Taler; see the file COPYING. If not, see */ - import { Amounts, parsePaytoUri } from "@gnu-taler/taler-util"; import { TalerError } from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; @@ -27,7 +26,6 @@ export function useComponentStateFromParams( { amount, cancel }: PropsFromParams, api: typeof wxApi, ): State { - const [ageRestricted, setAgeRestricted] = useState(0); const exchangeHook = useAsyncAsHook(api.listExchanges); @@ -40,14 +38,20 @@ export function useComponentStateFromParams( const chosenAmount = Amounts.parseOrThrow(amount); // get the first exchange with the currency as the default one - const exchange = exchangeHookDep ? exchangeHookDep.exchanges.find(e => e.currency === chosenAmount.currency) : undefined + const exchange = exchangeHookDep + ? exchangeHookDep.exchanges.find( + (e) => e.currency === chosenAmount.currency, + ) + : undefined; /** * For the exchange selected, bring the status of the terms of service */ const terms = useAsyncAsHook(async () => { - if (!exchange) return undefined + if (!exchange) return undefined; - const exchangeTos = await api.getExchangeTos(exchange.exchangeBaseUrl, ["text/xml"]); + const exchangeTos = await api.getExchangeTos(exchange.exchangeBaseUrl, [ + "text/xml", + ]); const state = buildTermsOfServiceState(exchangeTos); @@ -59,7 +63,7 @@ export function useComponentStateFromParams( * about the withdrawal */ const amountHook = useAsyncAsHook(async () => { - if (!exchange) return undefined + if (!exchange) return undefined; const info = await api.getExchangeWithdrawalInfo({ exchangeBaseUrl: exchange.exchangeBaseUrl, @@ -71,9 +75,12 @@ export function useComponentStateFromParams( const withdrawAmount = { raw: Amounts.parseOrThrow(info.withdrawalAmountRaw), effective: Amounts.parseOrThrow(info.withdrawalAmountEffective), - } + }; - return { amount: withdrawAmount, ageRestrictionOptions: info.ageRestrictionOptions }; + return { + amount: withdrawAmount, + ageRestrictionOptions: info.ageRestrictionOptions, + }; }, [exchangeHookDep]); const [reviewing, setReviewing] = useState(false); @@ -85,7 +92,7 @@ export function useComponentStateFromParams( const [doingWithdraw, setDoingWithdraw] = useState(false); const [withdrawCompleted, setWithdrawCompleted] = useState(false); - if (!exchangeHook) return { status: "loading", error: undefined } + if (!exchangeHook) return { status: "loading", error: undefined }; if (exchangeHook.hasError) { return { status: "loading-uri", @@ -125,7 +132,7 @@ export function useComponentStateFromParams( } if (!amountHook) { - return { status: "loading", error: undefined } + return { status: "loading", error: undefined }; } if (amountHook.hasError) { return { @@ -149,8 +156,8 @@ export function useComponentStateFromParams( const { state: termsState } = (!terms ? undefined : terms.hasError - ? undefined - : terms.response) || { state: undefined }; + ? undefined + : terms.response) || { state: undefined }; async function onAccept(accepted: boolean): Promise { if (!termsState || !exchange) return; @@ -173,21 +180,25 @@ export function useComponentStateFromParams( termsState !== undefined && (termsState.status === "changed" || termsState.status === "new"); - const ageRestrictionOptions = amountHook.response. - ageRestrictionOptions?. - reduce((p, c) => ({ ...p, [c]: `under ${c}` }), {} as Record) + const ageRestrictionOptions = + amountHook.response.ageRestrictionOptions?.reduce( + (p, c) => ({ ...p, [c]: `under ${c}` }), + {} as Record, + ); - const ageRestrictionEnabled = ageRestrictionOptions !== undefined + const ageRestrictionEnabled = ageRestrictionOptions !== undefined; if (ageRestrictionEnabled) { ageRestrictionOptions["0"] = "Not restricted"; } //TODO: calculate based on exchange info - const ageRestriction = ageRestrictionEnabled ? { - list: ageRestrictionOptions, - value: String(ageRestricted), - onChange: async (v: string) => setAgeRestricted(parseInt(v, 10)), - } : undefined; + const ageRestriction = ageRestrictionEnabled + ? { + list: ageRestrictionOptions, + value: String(ageRestricted), + onChange: async (v: string) => setAgeRestricted(parseInt(v, 10)), + } + : undefined; return { status: "success", @@ -207,12 +218,12 @@ export function useComponentStateFromParams( tosProps: !termsState ? undefined : { - onAccept, - onReview: setReviewing, - reviewed: reviewed, - reviewing: reviewing, - terms: termsState, - }, + onAccept, + onReview: setReviewing, + reviewed: reviewed, + reviewing: reviewing, + terms: termsState, + }, mustAcceptFirst, cancel, }; @@ -233,7 +244,7 @@ export function useComponentStateFromURI( const uriInfo = await api.getWithdrawalDetailsForUri({ talerWithdrawUri, }); - const { amount, defaultExchangeBaseUrl } = uriInfo + const { amount, defaultExchangeBaseUrl } = uriInfo; return { amount, thisExchange: defaultExchangeBaseUrl }; }); @@ -245,14 +256,15 @@ export function useComponentStateFromURI( ? undefined : uriInfoHook.response; - /** * For the exchange selected, bring the status of the terms of service */ const terms = useAsyncAsHook(async () => { if (!uriHookDep?.thisExchange) return false; - const exchangeTos = await api.getExchangeTos(uriHookDep.thisExchange, ["text/xml"]); + const exchangeTos = await api.getExchangeTos(uriHookDep.thisExchange, [ + "text/xml", + ]); const state = buildTermsOfServiceState(exchangeTos); @@ -276,9 +288,12 @@ export function useComponentStateFromURI( const withdrawAmount = { raw: Amounts.parseOrThrow(info.withdrawalAmountRaw), effective: Amounts.parseOrThrow(info.withdrawalAmountEffective), - } + }; - return { amount: withdrawAmount, ageRestrictionOptions: info.ageRestrictionOptions }; + return { + amount: withdrawAmount, + ageRestrictionOptions: info.ageRestrictionOptions, + }; }, [uriHookDep]); const [reviewing, setReviewing] = useState(false); @@ -290,7 +305,7 @@ export function useComponentStateFromURI( const [doingWithdraw, setDoingWithdraw] = useState(false); const [withdrawCompleted, setWithdrawCompleted] = useState(false); - if (!uriInfoHook) return { status: "loading", error: undefined } + if (!uriInfoHook) return { status: "loading", error: undefined }; if (uriInfoHook.hasError) { return { status: "loading-uri", @@ -298,7 +313,7 @@ export function useComponentStateFromURI( }; } - const { amount, thisExchange } = uriInfoHook.response + const { amount, thisExchange } = uriInfoHook.response; const chosenAmount = Amounts.parseOrThrow(amount); @@ -339,7 +354,7 @@ export function useComponentStateFromURI( } if (!amountHook) { - return { status: "loading", error: undefined } + return { status: "loading", error: undefined }; } if (amountHook.hasError) { return { @@ -363,8 +378,8 @@ export function useComponentStateFromURI( const { state: termsState } = (!terms ? undefined : terms.hasError - ? undefined - : terms.response) || { state: undefined }; + ? undefined + : terms.response) || { state: undefined }; async function onAccept(accepted: boolean): Promise { if (!termsState || !thisExchange) return; @@ -387,21 +402,25 @@ export function useComponentStateFromURI( termsState !== undefined && (termsState.status === "changed" || termsState.status === "new"); - const ageRestrictionOptions = amountHook.response. - ageRestrictionOptions?. - reduce((p, c) => ({ ...p, [c]: `under ${c}` }), {} as Record) + const ageRestrictionOptions = + amountHook.response.ageRestrictionOptions?.reduce( + (p, c) => ({ ...p, [c]: `under ${c}` }), + {} as Record, + ); - const ageRestrictionEnabled = ageRestrictionOptions !== undefined + const ageRestrictionEnabled = ageRestrictionOptions !== undefined; if (ageRestrictionEnabled) { ageRestrictionOptions["0"] = "Not restricted"; } //TODO: calculate based on exchange info - const ageRestriction = ageRestrictionEnabled ? { - list: ageRestrictionOptions, - value: String(ageRestricted), - onChange: async (v: string) => setAgeRestricted(parseInt(v, 10)), - } : undefined; + const ageRestriction = ageRestrictionEnabled + ? { + list: ageRestrictionOptions, + value: String(ageRestricted), + onChange: async (v: string) => setAgeRestricted(parseInt(v, 10)), + } + : undefined; return { status: "success", @@ -422,14 +441,13 @@ export function useComponentStateFromURI( tosProps: !termsState ? undefined : { - onAccept, - onReview: setReviewing, - reviewed: reviewed, - reviewing: reviewing, - terms: termsState, - }, + onAccept, + onReview: setReviewing, + reviewed: reviewed, + reviewing: reviewing, + terms: termsState, + }, mustAcceptFirst, cancel, }; } - diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts b/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts index be580f6d0..3a49f2a71 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts @@ -62,13 +62,21 @@ describe("Withdraw CTA states", () => { it("should tell the user that the URI is missing", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentStateFromURI({ talerWithdrawUri: undefined, cancel: async () => { null } }, { - listExchanges: async () => ({ exchanges }), - getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({ - amount: "ARS:2", - possibleExchanges: exchanges, - }), - } as any), + useComponentStateFromURI( + { + talerWithdrawUri: undefined, + cancel: async () => { + null; + }, + }, + { + listExchanges: async () => ({ exchanges }), + getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({ + amount: "ARS:2", + possibleExchanges: exchanges, + }), + } as any, + ), ); { @@ -94,13 +102,21 @@ describe("Withdraw CTA states", () => { it("should tell the user that there is not known exchange", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentStateFromURI({ talerWithdrawUri: "taler-withdraw://", cancel: async () => { null } }, { - listExchanges: async () => ({ exchanges }), - getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({ - amount: "EUR:2", - possibleExchanges: [], - }), - } as any), + useComponentStateFromURI( + { + talerWithdrawUri: "taler-withdraw://", + cancel: async () => { + null; + }, + }, + { + listExchanges: async () => ({ exchanges }), + getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({ + amount: "EUR:2", + possibleExchanges: [], + }), + } as any, + ), ); { @@ -128,26 +144,34 @@ describe("Withdraw CTA states", () => { it("should be able to withdraw if tos are ok", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentStateFromURI({ talerWithdrawUri: "taler-withdraw://", cancel: async () => { null } }, { - listExchanges: async () => ({ exchanges }), - getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({ - amount: "ARS:2", - possibleExchanges: exchanges, - defaultExchangeBaseUrl: exchanges[0].exchangeBaseUrl - }), - getExchangeWithdrawalInfo: - async (): Promise => - ({ - withdrawalAmountRaw: "ARS:2", - withdrawalAmountEffective: "ARS:2", - } as any), - getExchangeTos: async (): Promise => ({ - contentType: "text", - content: "just accept", - acceptedEtag: "v1", - currentEtag: "v1", - }), - } as any), + useComponentStateFromURI( + { + talerWithdrawUri: "taler-withdraw://", + cancel: async () => { + null; + }, + }, + { + listExchanges: async () => ({ exchanges }), + getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({ + amount: "ARS:2", + possibleExchanges: exchanges, + defaultExchangeBaseUrl: exchanges[0].exchangeBaseUrl, + }), + getExchangeWithdrawalInfo: + async (): Promise => + ({ + withdrawalAmountRaw: "ARS:2", + withdrawalAmountEffective: "ARS:2", + } as any), + getExchangeTos: async (): Promise => ({ + contentType: "text", + content: "just accept", + acceptedEtag: "v1", + currentEtag: "v1", + }), + } as any, + ), ); { @@ -194,27 +218,35 @@ describe("Withdraw CTA states", () => { it("should be accept the tos before withdraw", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => - useComponentStateFromURI({ talerWithdrawUri: "taler-withdraw://", cancel: async () => { null } }, { - listExchanges: async () => ({ exchanges }), - getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({ - amount: "ARS:2", - possibleExchanges: exchanges, - defaultExchangeBaseUrl: exchanges[0].exchangeBaseUrl - }), - getExchangeWithdrawalInfo: - async (): Promise => - ({ - withdrawalAmountRaw: "ARS:2", - withdrawalAmountEffective: "ARS:2", - } as any), - getExchangeTos: async (): Promise => ({ - contentType: "text", - content: "just accept", - acceptedEtag: "v1", - currentEtag: "v2", - }), - setExchangeTosAccepted: async () => ({}), - } as any), + useComponentStateFromURI( + { + talerWithdrawUri: "taler-withdraw://", + cancel: async () => { + null; + }, + }, + { + listExchanges: async () => ({ exchanges }), + getWithdrawalDetailsForUri: async ({ talerWithdrawUri }: any) => ({ + amount: "ARS:2", + possibleExchanges: exchanges, + defaultExchangeBaseUrl: exchanges[0].exchangeBaseUrl, + }), + getExchangeWithdrawalInfo: + async (): Promise => + ({ + withdrawalAmountRaw: "ARS:2", + withdrawalAmountEffective: "ARS:2", + } as any), + getExchangeTos: async (): Promise => ({ + contentType: "text", + content: "just accept", + acceptedEtag: "v1", + currentEtag: "v2", + }), + setExchangeTosAccepted: async () => ({}), + } as any, + ), ); { diff --git a/packages/taler-wallet-webextension/src/hooks/useClipboardPermissions.ts b/packages/taler-wallet-webextension/src/hooks/useClipboardPermissions.ts index c69b116b7..3e9629dcb 100644 --- a/packages/taler-wallet-webextension/src/hooks/useClipboardPermissions.ts +++ b/packages/taler-wallet-webextension/src/hooks/useClipboardPermissions.ts @@ -55,7 +55,9 @@ async function handleClipboardPerm( // as the result of an input event ... let granted: boolean; try { - granted = await platform.getPermissionsApi().requestClipboardPermissions(); + granted = await platform + .getPermissionsApi() + .requestClipboardPermissions(); } catch (lastError) { onChange(false); throw lastError; diff --git a/packages/taler-wallet-webextension/src/hooks/useTalerActionURL.test.ts b/packages/taler-wallet-webextension/src/hooks/useTalerActionURL.test.ts index 61fe86e3a..a7ad3e81b 100644 --- a/packages/taler-wallet-webextension/src/hooks/useTalerActionURL.test.ts +++ b/packages/taler-wallet-webextension/src/hooks/useTalerActionURL.test.ts @@ -20,7 +20,6 @@ import { h, VNode } from "preact"; import { expect } from "chai"; describe("useTalerActionURL hook", () => { - it("should be set url to undefined when dismiss", async () => { const ctx = ({ children }: { children: any }): VNode => { return h(IoCProviderForTesting, { @@ -46,7 +45,7 @@ describe("useTalerActionURL hook", () => { const [url, setDismissed] = getLastResultOrThrow(); expect(url).deep.equals({ location: "clipboard", - uri: "qwe" + uri: "qwe", }); setDismissed(true); } diff --git a/packages/taler-wallet-webextension/src/hooks/useTalerActionURL.ts b/packages/taler-wallet-webextension/src/hooks/useTalerActionURL.ts index 75a92fd3c..39b76c341 100644 --- a/packages/taler-wallet-webextension/src/hooks/useTalerActionURL.ts +++ b/packages/taler-wallet-webextension/src/hooks/useTalerActionURL.ts @@ -19,7 +19,7 @@ import { useIocContext } from "../context/iocContext.js"; export interface UriLocation { uri: string; - location: "clipboard" | "activeTab" + location: "clipboard" | "activeTab"; } export function useTalerActionURL(): [ @@ -37,7 +37,7 @@ export function useTalerActionURL(): [ if (clipUri) { setTalerActionUrl({ location: "clipboard", - uri: clipUri + uri: clipUri, }); return; } @@ -45,7 +45,7 @@ export function useTalerActionURL(): [ if (tabUri) { setTalerActionUrl({ location: "activeTab", - uri: tabUri + uri: tabUri, }); return; } diff --git a/packages/taler-wallet-webextension/src/mui/ModalManager.ts b/packages/taler-wallet-webextension/src/mui/ModalManager.ts index b4a3ee597..eee037467 100644 --- a/packages/taler-wallet-webextension/src/mui/ModalManager.ts +++ b/packages/taler-wallet-webextension/src/mui/ModalManager.ts @@ -119,8 +119,9 @@ function handleContainer(containerInfo: Container, props: ManagedModalProps) { el: container, }); // Use computed style, here to get the real padding to add our scrollbar width. - container.style.paddingRight = `${getPaddingRight(container) + scrollbarSize - }px`; + container.style.paddingRight = `${ + getPaddingRight(container) + scrollbarSize + }px`; // .mui-fixed is a global helper. const fixedElements = @@ -131,8 +132,9 @@ function handleContainer(containerInfo: Container, props: ManagedModalProps) { property: "padding-right", el: element, }); - element.style.paddingRight = `${getPaddingRight(element) + scrollbarSize - }px`; + element.style.paddingRight = `${ + getPaddingRight(element) + scrollbarSize + }px`; }); } @@ -142,7 +144,7 @@ function handleContainer(containerInfo: Container, props: ManagedModalProps) { const containerWindow = ownerWindow(container); const scrollContainer = parent?.nodeName === "HTML" && - containerWindow.getComputedStyle(parent).overflowY === "scroll" + containerWindow.getComputedStyle(parent).overflowY === "scroll" ? parent : container; diff --git a/packages/taler-wallet-webextension/src/platform/api.ts b/packages/taler-wallet-webextension/src/platform/api.ts index da257c25f..37546d2df 100644 --- a/packages/taler-wallet-webextension/src/platform/api.ts +++ b/packages/taler-wallet-webextension/src/platform/api.ts @@ -176,13 +176,13 @@ export interface PlatformAPI { findTalerUriInClipboard(): Promise; /** - * Used from the frontend to send commands to the wallet - * - * @param operation - * @param payload - * - * @return response from the backend - */ + * Used from the frontend to send commands to the wallet + * + * @param operation + * @param payload + * + * @return response from the backend + */ sendMessageToWalletBackground( operation: string, payload: any, diff --git a/packages/taler-wallet-webextension/src/platform/chrome.ts b/packages/taler-wallet-webextension/src/platform/chrome.ts index 75900882f..99c0c134f 100644 --- a/packages/taler-wallet-webextension/src/platform/chrome.ts +++ b/packages/taler-wallet-webextension/src/platform/chrome.ts @@ -109,7 +109,7 @@ export async function requestClipboardPermissions(): Promise { rej(le); } res(resp); - }) + }); }); } @@ -130,13 +130,13 @@ type HeaderListenerFunc = ( ) => void; let currentHeaderListener: HeaderListenerFunc | undefined = undefined; -type TabListenerFunc = ( - tabId: number, info: chrome.tabs.TabChangeInfo, -) => void; +type TabListenerFunc = (tabId: number, info: chrome.tabs.TabChangeInfo) => void; let currentTabListener: TabListenerFunc | undefined = undefined; export function containsTalerHeaderListener(): boolean { - return currentHeaderListener !== undefined || currentTabListener !== undefined; + return ( + currentHeaderListener !== undefined || currentTabListener !== undefined + ); } export async function removeHostPermissions(): Promise { @@ -147,9 +147,11 @@ export async function removeHostPermissions(): Promise { ) { chrome.webRequest.onHeadersReceived.removeListener(currentHeaderListener); } - if (currentTabListener && - chrome?.tabs?.onUpdated?.hasListener(currentTabListener)) { - chrome.tabs.onUpdated.removeListener(currentTabListener) + if ( + currentTabListener && + chrome?.tabs?.onUpdated?.hasListener(currentTabListener) + ) { + chrome.tabs.onUpdated.removeListener(currentTabListener); } currentHeaderListener = undefined; @@ -413,20 +415,25 @@ function registerTalerHeaderListener( .map((h) => h.value) .filter((value): value is string => !!value); if (values.length > 0) { - logger.info(`Found a Taler URI in a response header for the request ${details.url} from tab ${details.tabId}`) + logger.info( + `Found a Taler URI in a response header for the request ${details.url} from tab ${details.tabId}`, + ); callback(details.tabId, values[0]); } } return; } - async function tabListener(tabId: number, info: chrome.tabs.TabChangeInfo): Promise { + async function tabListener( + tabId: number, + info: chrome.tabs.TabChangeInfo, + ): Promise { if (tabId < 0) return; if (info.status !== "complete") return; const uri = await findTalerUriInTab(tabId); if (!uri) return; - logger.info(`Found a Taler URI in the tab ${tabId}`) - callback(tabId, uri) + logger.info(`Found a Taler URI in the tab ${tabId}`); + callback(tabId, uri); } const prevHeaderListener = currentHeaderListener; @@ -442,14 +449,18 @@ function registerTalerHeaderListener( ) { chrome.webRequest.onHeadersReceived.removeListener(prevHeaderListener); } - if (prevTabListener && chrome?.tabs?.onUpdated?.hasListener(prevTabListener)) { - chrome.tabs.onUpdated.removeListener(prevTabListener) + if ( + prevTabListener && + chrome?.tabs?.onUpdated?.hasListener(prevTabListener) + ) { + chrome.tabs.onUpdated.removeListener(prevTabListener); } //if the result was positive, add the headerListener if (result) { - const headersEvent: chrome.webRequest.WebResponseHeadersEvent | undefined = - chrome?.webRequest?.onHeadersReceived; + const headersEvent: + | chrome.webRequest.WebResponseHeadersEvent + | undefined = chrome?.webRequest?.onHeadersReceived; if (headersEvent) { headersEvent.addListener(headerListener, { urls: [""] }, [ "responseHeaders", @@ -472,7 +483,6 @@ function registerTalerHeaderListener( } }); }); - } const alertIcons = { @@ -515,26 +525,26 @@ function setAlertedIcon(): void { interface OffscreenCanvasRenderingContext2D extends CanvasState, - CanvasTransform, - CanvasCompositing, - CanvasImageSmoothing, - CanvasFillStrokeStyles, - CanvasShadowStyles, - CanvasFilters, - CanvasRect, - CanvasDrawPath, - CanvasUserInterface, - CanvasText, - CanvasDrawImage, - CanvasImageData, - CanvasPathDrawingStyles, - CanvasTextDrawingStyles, - CanvasPath { + CanvasTransform, + CanvasCompositing, + CanvasImageSmoothing, + CanvasFillStrokeStyles, + CanvasShadowStyles, + CanvasFilters, + CanvasRect, + CanvasDrawPath, + CanvasUserInterface, + CanvasText, + CanvasDrawImage, + CanvasImageData, + CanvasPathDrawingStyles, + CanvasTextDrawingStyles, + CanvasPath { readonly canvas: OffscreenCanvas; } declare const OffscreenCanvasRenderingContext2D: { prototype: OffscreenCanvasRenderingContext2D; - new(): OffscreenCanvasRenderingContext2D; + new (): OffscreenCanvasRenderingContext2D; }; interface OffscreenCanvas extends EventTarget { @@ -547,7 +557,7 @@ interface OffscreenCanvas extends EventTarget { } declare const OffscreenCanvas: { prototype: OffscreenCanvas; - new(width: number, height: number): OffscreenCanvas; + new (width: number, height: number): OffscreenCanvas; }; function createCanvas(size: number): OffscreenCanvas { @@ -727,20 +737,23 @@ async function findTalerUriInTab(tabId: number): Promise { } async function timeout(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); + return new Promise((resolve) => setTimeout(resolve, ms)); } async function findTalerUriInClipboard(): Promise { try { //It looks like clipboard promise does not return, so we need a timeout const textInClipboard = await Promise.any([ timeout(100), - window.navigator.clipboard.readText() - ]) + window.navigator.clipboard.readText(), + ]); if (!textInClipboard) return; - return textInClipboard.startsWith("taler://") || textInClipboard.startsWith("taler+http://") ? textInClipboard : undefined + return textInClipboard.startsWith("taler://") || + textInClipboard.startsWith("taler+http://") + ? textInClipboard + : undefined; } catch (e) { - logger.error("could not read clipboard", e) - return undefined + logger.error("could not read clipboard", e); + return undefined; } } diff --git a/packages/taler-wallet-webextension/src/utils/index.ts b/packages/taler-wallet-webextension/src/utils/index.ts index 2414fc86a..8fe1f2a44 100644 --- a/packages/taler-wallet-webextension/src/utils/index.ts +++ b/packages/taler-wallet-webextension/src/utils/index.ts @@ -31,7 +31,8 @@ function getJsonIfOk(r: Response): Promise { } throw new Error( - `Try another server: (${r.status}) ${r.statusText || "internal server error" + `Try another server: (${r.status}) ${ + r.statusText || "internal server error" }`, ); } @@ -102,10 +103,10 @@ export function buildTermsOfServiceStatus( return !content ? "notfound" : !acceptedVersion - ? "new" - : acceptedVersion !== currentVersion - ? "changed" - : "accepted"; + ? "new" + : acceptedVersion !== currentVersion + ? "changed" + : "accepted"; } function parseTermsOfServiceContent( diff --git a/packages/taler-wallet-webextension/src/wallet/DepositPage.test.ts b/packages/taler-wallet-webextension/src/wallet/DepositPage.test.ts index 12a13bbdf..99bb547de 100644 --- a/packages/taler-wallet-webextension/src/wallet/DepositPage.test.ts +++ b/packages/taler-wallet-webextension/src/wallet/DepositPage.test.ts @@ -62,9 +62,9 @@ describe("DepositPage states", () => { mountHook(() => useComponentState(currency, nullFunction, nullFunction, { getBalance: async () => - ({ - balances: [{ available: `${currency}:0` }], - } as Partial), + ({ + balances: [{ available: `${currency}:0` }], + } as Partial), listKnownBankAccounts: async () => ({ accounts: {} }), } as Partial as any), ); @@ -89,9 +89,9 @@ describe("DepositPage states", () => { mountHook(() => useComponentState(currency, nullFunction, nullFunction, { getBalance: async () => - ({ - balances: [{ available: `${currency}:1` }], - } as Partial), + ({ + balances: [{ available: `${currency}:1` }], + } as Partial), listKnownBankAccounts: async () => ({ accounts: {} }), } as Partial as any), ); @@ -111,19 +111,21 @@ describe("DepositPage states", () => { await assertNoPendingUpdate(); }); - const ibanPayto_str = "payto://iban/ES8877998399652238" + const ibanPayto_str = "payto://iban/ES8877998399652238"; const ibanPayto = { ibanPayto_str: parsePaytoUri(ibanPayto_str)! }; - const talerBankPayto_str = "payto://x-taler-bank/ES8877998399652238" - const talerBankPayto = { talerBankPayto_str: parsePaytoUri(talerBankPayto_str)! }; + const talerBankPayto_str = "payto://x-taler-bank/ES8877998399652238"; + const talerBankPayto = { + talerBankPayto_str: parsePaytoUri(talerBankPayto_str)!, + }; it("should have status 'ready' but unable to deposit ", async () => { const { getLastResultOrThrow, waitNextUpdate, assertNoPendingUpdate } = mountHook(() => useComponentState(currency, nullFunction, nullFunction, { getBalance: async () => - ({ - balances: [{ available: `${currency}:1` }], - } as Partial), + ({ + balances: [{ available: `${currency}:1` }], + } as Partial), listKnownBankAccounts: async () => ({ accounts: ibanPayto }), } as Partial as any), ); @@ -153,9 +155,9 @@ describe("DepositPage states", () => { mountHook(() => useComponentState(currency, nullFunction, nullFunction, { getBalance: async () => - ({ - balances: [{ available: `${currency}:1` }], - } as Partial), + ({ + balances: [{ available: `${currency}:1` }], + } as Partial), listKnownBankAccounts: async () => ({ accounts: ibanPayto }), getFeeForDeposit: withoutFee, } as Partial as any), @@ -202,9 +204,9 @@ describe("DepositPage states", () => { mountHook(() => useComponentState(currency, nullFunction, nullFunction, { getBalance: async () => - ({ - balances: [{ available: `${currency}:1` }], - } as Partial), + ({ + balances: [{ available: `${currency}:1` }], + } as Partial), listKnownBankAccounts: async () => ({ accounts: ibanPayto }), getFeeForDeposit: withSomeFee, } as Partial as any), @@ -252,9 +254,9 @@ describe("DepositPage states", () => { mountHook(() => useComponentState(currency, nullFunction, nullFunction, { getBalance: async () => - ({ - balances: [{ available: `${currency}:1` }], - } as Partial), + ({ + balances: [{ available: `${currency}:1` }], + } as Partial), listKnownBankAccounts: async () => ({ accounts: { ...ibanPayto, ...talerBankPayto }, }), @@ -338,9 +340,9 @@ describe("DepositPage states", () => { mountHook(() => useComponentState(currency, nullFunction, nullFunction, { getBalance: async () => - ({ - balances: [{ available: `${currency}:15` }], - } as Partial), + ({ + balances: [{ available: `${currency}:15` }], + } as Partial), listKnownBankAccounts: async () => ({ accounts: ibanPayto }), getFeeForDeposit: withSomeFee, } as Partial as any), diff --git a/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/index.ts b/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/index.ts index 2773e66f7..fd82cde73 100644 --- a/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/index.ts +++ b/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/index.ts @@ -25,13 +25,9 @@ export interface Props { p: string; } -export type State = - | State.Loading - | State.LoadingUriError - | State.Ready; +export type State = State.Loading | State.LoadingUriError | State.Ready; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -54,10 +50,11 @@ export namespace State { const viewMapping: StateViewMap = { loading: Loading, "loading-uri": LoadingUriView, - "ready": ReadyView, + ready: ReadyView, }; - -export const ComponentName = compose("ComponentName", (p: Props) => useComponentState(p, wxApi), viewMapping) - - +export const ComponentName = compose( + "ComponentName", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/state.ts b/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/state.ts index 45b174063..2c5ac95c0 100644 --- a/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/state.ts +++ b/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/state.ts @@ -17,12 +17,9 @@ import * as wxApi from "../../wxApi.js"; import { Props, State } from "./index.js"; -export function useComponentState( - { p }: Props, - api: typeof wxApi, -): State { +export function useComponentState({ p }: Props, api: typeof wxApi): State { return { status: "ready", error: undefined, - } + }; } diff --git a/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/test.ts b/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/test.ts index 631e76d01..eae4d4ca2 100644 --- a/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/test.ts +++ b/packages/taler-wallet-webextension/src/wallet/EmptyComponentExample/test.ts @@ -22,10 +22,7 @@ import { expect } from "chai"; describe("test description", () => { - it("should assert", () => { - - expect([]).deep.equals([]) + expect([]).deep.equals([]); }); -}) - +}); diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/index.ts b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/index.ts index 16ab7ab16..3b2708eff 100644 --- a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/index.ts +++ b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/index.ts @@ -14,16 +14,25 @@ GNU Taler; see the file COPYING. If not, see */ -import { FeeDescription, FeeDescriptionPair, AbsoluteTime, ExchangeFullDetails, OperationMap } from "@gnu-taler/taler-util"; +import { + FeeDescription, + FeeDescriptionPair, + AbsoluteTime, + ExchangeFullDetails, + OperationMap, +} from "@gnu-taler/taler-util"; import { Loading } from "../../components/Loading.js"; import { HookError } from "../../hooks/useAsyncAsHook.js"; import { ButtonHandler, SelectFieldHandler } from "../../mui/handlers.js"; import { compose, StateViewMap } from "../../utils/index.js"; import * as wxApi from "../../wxApi.js"; import { useComponentState } from "./state.js"; -import { ComparingView, LoadingUriView, NoExchangesView, ReadyView } from "./views.js"; - - +import { + ComparingView, + LoadingUriView, + NoExchangesView, + ReadyView, +} from "./views.js"; export interface Props { currency?: string; @@ -39,7 +48,6 @@ export type State = | State.NoExchanges; export namespace State { - export interface Loading { status: "loading"; error: undefined; @@ -75,13 +83,16 @@ export namespace State { } } - const viewMapping: StateViewMap = { loading: Loading, "loading-uri": LoadingUriView, - "comparing": ComparingView, + comparing: ComparingView, "no-exchanges": NoExchangesView, - "ready": ReadyView, + ready: ReadyView, }; -export const ExchangeSelectionPage = compose("ExchangeSelectionPage", (p: Props) => useComponentState(p, wxApi), viewMapping) +export const ExchangeSelectionPage = compose( + "ExchangeSelectionPage", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts index 352952da0..8c0c21486 100644 --- a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts +++ b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts @@ -14,7 +14,6 @@ GNU Taler; see the file COPYING. If not, see */ - import { FeeDescription, OperationMap } from "@gnu-taler/taler-util"; import { createDenominationPairTimeline } from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; @@ -26,26 +25,32 @@ export function useComponentState( { onCancel, onSelection, currency }: Props, api: typeof wxApi, ): State { - const initialValue = 0 + const initialValue = 0; const [value, setValue] = useState(String(initialValue)); const hook = useAsyncAsHook(async () => { - const { exchanges } = await api.listExchanges() - - const selectedIdx = parseInt(value, 10) - const selectedExchange = exchanges.length == 0 ? undefined : exchanges[selectedIdx] - const selected = !selectedExchange ? undefined : await api.getExchangeDetailedInfo(selectedExchange.exchangeBaseUrl) - - const initialExchange = selectedIdx === initialValue ? undefined : exchanges[initialValue] - const original = !initialExchange ? undefined : await api.getExchangeDetailedInfo(initialExchange.exchangeBaseUrl) - return { exchanges, selected, original } + const { exchanges } = await api.listExchanges(); + + const selectedIdx = parseInt(value, 10); + const selectedExchange = + exchanges.length == 0 ? undefined : exchanges[selectedIdx]; + const selected = !selectedExchange + ? undefined + : await api.getExchangeDetailedInfo(selectedExchange.exchangeBaseUrl); + + const initialExchange = + selectedIdx === initialValue ? undefined : exchanges[initialValue]; + const original = !initialExchange + ? undefined + : await api.getExchangeDetailedInfo(initialExchange.exchangeBaseUrl); + return { exchanges, selected, original }; }); if (!hook) { return { status: "loading", error: undefined, - } + }; } if (hook.hasError) { return { @@ -60,11 +65,14 @@ export function useComponentState( //!selected <=> exchanges.length === 0 return { status: "no-exchanges", - error: undefined - } + error: undefined, + }; } - const exchangeMap = exchanges.reduce((prev, cur, idx) => ({ ...prev, [cur.exchangeBaseUrl]: String(idx) }), {} as Record) + const exchangeMap = exchanges.reduce( + (prev, cur, idx) => ({ ...prev, [cur.exchangeBaseUrl]: String(idx) }), + {} as Record, + ); if (!original) { // !original <=> selected == original @@ -74,24 +82,36 @@ export function useComponentState( list: exchangeMap, value: value, onChange: async (v) => { - setValue(v) - } + setValue(v); + }, }, error: undefined, onClose: { - onClick: onCancel + onClick: onCancel, }, selected, - timeline: selected.feesDescription - } + timeline: selected.feesDescription, + }; } const pairTimeline: OperationMap = { - deposit: createDenominationPairTimeline(selected.feesDescription.deposit, original.feesDescription.deposit), - refresh: createDenominationPairTimeline(selected.feesDescription.refresh, original.feesDescription.refresh), - refund: createDenominationPairTimeline(selected.feesDescription.refund, original.feesDescription.refund), - withdraw: createDenominationPairTimeline(selected.feesDescription.withdraw, original.feesDescription.withdraw), - } + deposit: createDenominationPairTimeline( + selected.feesDescription.deposit, + original.feesDescription.deposit, + ), + refresh: createDenominationPairTimeline( + selected.feesDescription.refresh, + original.feesDescription.refresh, + ), + refund: createDenominationPairTimeline( + selected.feesDescription.refund, + original.feesDescription.refund, + ), + withdraw: createDenominationPairTimeline( + selected.feesDescription.withdraw, + original.feesDescription.withdraw, + ), + }; return { status: "comparing", @@ -99,23 +119,21 @@ export function useComponentState( list: exchangeMap, value: value, onChange: async (v) => { - setValue(v) - } + setValue(v); + }, }, error: undefined, onReset: { onClick: async () => { - setValue(String(initialValue)) - } + setValue(String(initialValue)); + }, }, onSelect: { onClick: async () => { - onSelection(selected.exchangeBaseUrl) - } + onSelection(selected.exchangeBaseUrl); + }, }, selected, pairTimeline, - } - + }; } - diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/test.ts b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/test.ts index 61bc6425f..3c7235851 100644 --- a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/test.ts +++ b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/test.ts @@ -19,8 +19,5 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { - AbsoluteTime, - Amounts, DenominationInfo -} from "@gnu-taler/taler-util"; +import { AbsoluteTime, Amounts, DenominationInfo } from "@gnu-taler/taler-util"; import { expect } from "chai"; diff --git a/packages/taler-wallet-webextension/src/wxApi.ts b/packages/taler-wallet-webextension/src/wxApi.ts index e9d26853d..872cbed19 100644 --- a/packages/taler-wallet-webextension/src/wxApi.ts +++ b/packages/taler-wallet-webextension/src/wxApi.ts @@ -261,9 +261,11 @@ export function listExchanges(): Promise { return callBackend("listExchanges", {}); } -export function getExchangeDetailedInfo(exchangeBaseUrl: string): Promise { +export function getExchangeDetailedInfo( + exchangeBaseUrl: string, +): Promise { return callBackend("getExchangeDetailedInfo", { - exchangeBaseUrl + exchangeBaseUrl, }); } @@ -538,6 +540,6 @@ export function acceptPeerPullPayment( export function getTransactionById(tid: string): Promise { return callBackend("getTransactionById", { - transactionId: tid - }) -} \ No newline at end of file + transactionId: tid, + }); +} diff --git a/packages/taler-wallet-webextension/src/wxBackend.ts b/packages/taler-wallet-webextension/src/wxBackend.ts index 60b250453..1dc6343c5 100644 --- a/packages/taler-wallet-webextension/src/wxBackend.ts +++ b/packages/taler-wallet-webextension/src/wxBackend.ts @@ -344,7 +344,6 @@ export async function wxMain(): Promise { console.error(e); } - // On platforms that support it, also listen to external // modification of permissions. platform.getPermissionsApi().addPermissionsListener((perm, lastError) => { -- cgit v1.2.3