taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit b6f88a19427b853746be237fcdb6f0a45f7735f7
parent 54a553caba82eff2c3e0e47c15b53167c55ff1c9
Author: Florian Dold <florian@dold.me>
Date:   Wed,  7 Aug 2024 21:02:35 +0200

wallet-core: implement getBankingChoicesForPayto

Diffstat:
Mpackages/taler-util/src/types-taler-wallet.ts | 20++++++++++++++++++++
Mpackages/taler-wallet-core/src/wallet-api-types.ts | 10++++++++++
Mpackages/taler-wallet-core/src/wallet.ts | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 81 insertions(+), 0 deletions(-)

diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts @@ -3559,6 +3559,26 @@ export interface GetQrCodesForPaytoResponse { codes: QrCodeSpec[]; } +export interface GetBankingChoicesForPaytoRequest { + paytoUri: string; +} + +export const codecForGetBankingChoicesForPaytoRequest = () => + buildCodecForObject<GetBankingChoicesForPaytoRequest>() + .property("paytoUri", codecForString()) + .build("GetBankingChoicesForPaytoRequest"); + +export interface BankingChoiceSpec { + label: string; + // FIXME: In the future, we might also have some way to return intents here? + type: "weblink" | "deeplink"; + uri: string; +} + +export interface GetBankingChoicesForPaytoResponse { + choices: BankingChoiceSpec[]; +} + export type EmptyObject = Record<string, never>; export const codecForEmptyObject = (): Codec<EmptyObject> => diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -71,6 +71,8 @@ import { GetActiveTasksResponse, GetAmountRequest, GetBalanceDetailRequest, + GetBankingChoicesForPaytoRequest, + GetBankingChoicesForPaytoResponse, GetContractTermsDetailsRequest, GetCurrencySpecificationRequest, GetCurrencySpecificationResponse, @@ -271,6 +273,7 @@ export enum WalletApiOperation { CanonicalizeBaseUrl = "canonicalizeBaseUrl", GetDepositWireTypesForCurrency = "getDepositWireTypesForCurrency", GetQrCodesForPayto = "getQrCodesForPayto", + GetBankingChoicesForPayto = "getBankingChoicesForPayto", TestingWaitTransactionsFinal = "testingWaitTransactionsFinal", TestingWaitRefreshesFinal = "testingWaitRefreshesFinal", TestingWaitTransactionState = "testingWaitTransactionState", @@ -998,6 +1001,12 @@ export type GetQrCodesForPaytoOp = { response: GetQrCodesForPaytoResponse; }; +export type GetBankingChoicesForPaytoOp = { + op: WalletApiOperation.GetBankingChoicesForPayto; + request: GetBankingChoicesForPaytoRequest; + response: GetBankingChoicesForPaytoResponse; +}; + // group: Database Management /** @@ -1358,6 +1367,7 @@ export type WalletOperations = { [WalletApiOperation.HintNetworkAvailability]: HintNetworkAvailabilityOp; [WalletApiOperation.GetDepositWireTypesForCurrency]: GetDepositWireTypesForCurrencyOp; [WalletApiOperation.GetQrCodesForPayto]: GetQrCodesForPaytoOp; + [WalletApiOperation.GetBankingChoicesForPayto]: GetBankingChoicesForPaytoOp; }; export type WalletCoreRequestType< diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts @@ -57,6 +57,8 @@ import { FailTransactionRequest, ForgetKnownBankAccountsRequest, GetActiveTasksResponse, + GetBankingChoicesForPaytoRequest, + GetBankingChoicesForPaytoResponse, GetContractTermsDetailsRequest, GetCurrencySpecificationRequest, GetCurrencySpecificationResponse, @@ -147,6 +149,7 @@ import { codecForForgetKnownBankAccounts, codecForGetAmountRequest, codecForGetBalanceDetailRequest, + codecForGetBankingChoicesForPaytoRequest, codecForGetContractTermsDetails, codecForGetCurrencyInfoRequest, codecForGetDepositWireTypesForCurrencyRequest, @@ -1056,6 +1059,50 @@ async function handleGetQrCodesForPayto( }; } +async function handleGetBankingChoicesForPayto( + wex: WalletExecutionContext, + req: GetBankingChoicesForPaytoRequest, +): Promise<GetBankingChoicesForPaytoResponse> { + const parsedPayto = parsePaytoUri(req.paytoUri); + if (!parsedPayto) { + throw Error("invalid payto URI"); + } + const amount = parsedPayto.params["amount"]; + if (!amount) { + logger.warn("payto URI has no amount"); + return { + choices: [], + }; + } + const currency = Amounts.currencyOf(amount); + switch (currency) { + case "KUDOS": + return { + choices: [ + { + label: "Demobank Website", + type: "weblink", + uri: `https://bank.demo.taler.net/webui/#/transfer/${encodeURIComponent( + req.paytoUri, + )}`, + }, + { + label: "Demobank App", + type: "deeplink", + uri: `https://bank.demo.taler.net/app/transfer/${encodeURIComponent( + req.paytoUri, + )}`, + }, + ], + }; + break; + default: + return { + choices: [], + }; + } +} + async function handleConfirmPay( wex: WalletExecutionContext, req: ConfirmPayRequest, @@ -2051,6 +2098,10 @@ const handlers: { [T in WalletApiOperation]: HandlerWithValidator<T> } = { throw Error("not implemented"); }, }, + [WalletApiOperation.GetBankingChoicesForPayto]: { + codec: codecForGetBankingChoicesForPaytoRequest(), + handler: handleGetBankingChoicesForPayto, + }, }; /**