commit b6f88a19427b853746be237fcdb6f0a45f7735f7
parent 54a553caba82eff2c3e0e47c15b53167c55ff1c9
Author: Florian Dold <florian@dold.me>
Date: Wed, 7 Aug 2024 21:02:35 +0200
wallet-core: implement getBankingChoicesForPayto
Diffstat:
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,
+ },
};
/**