taler-typescript-core

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

commit d4d4b29a5706174fbb1a872f3c57f6dbd7bf9167
parent f0ce9c0f6abecb19bdd2b70f112efc9a2766423d
Author: Sebastian <sebasjm@gmail.com>
Date:   Tue, 22 Apr 2025 17:49:05 -0300

change payto://taler/ to payto://taler-reserve/ and payto://taler-reserve-http/

Diffstat:
Mpackages/aml-backoffice-ui/src/pages/Search.tsx | 13++++++++++---
Mpackages/aml-backoffice-ui/src/pages/decision/AmlDecisionRequestWizard.tsx | 4+++-
Mpackages/aml-backoffice-ui/src/pages/decision/Rules.tsx | 4+++-
Mpackages/bank-ui/src/pages/OperationState/views.tsx | 8++++++--
Mpackages/bank-ui/src/pages/PaytoWireTransferForm.tsx | 16++++++----------
Mpackages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx | 3++-
Mpackages/merchant-backoffice-ui/src/components/modal/index.tsx | 3++-
Mpackages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx | 20++++++++++++++------
Mpackages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx | 7+++++--
Mpackages/taler-util/src/payto.ts | 52+++++++++++++++++++++++++++++++++++++++++-----------
Mpackages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx | 5+++--
Mpackages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx | 9++++++---
12 files changed, 101 insertions(+), 43 deletions(-)

diff --git a/packages/aml-backoffice-ui/src/pages/Search.tsx b/packages/aml-backoffice-ui/src/pages/Search.tsx @@ -52,7 +52,10 @@ import { privatePages } from "../Routing.js"; import { Pagination, ToInvestigateIcon } from "./Cases.js"; import { HandleAccountNotReady } from "./HandleAccountNotReady.js"; import { Officer } from "./Officer.js"; -import { DECISION_REQUEST_EMPTY, DecisionRequest } from "../hooks/decision-request.js"; +import { + DECISION_REQUEST_EMPTY, + DecisionRequest, +} from "../hooks/decision-request.js"; export function Search({ onNewDecision, @@ -298,7 +301,11 @@ function ShowResult({ // payto: encodeCrockForURI(paytoStr), // })} onClick={async () => { - onNewDecision(DECISION_REQUEST_EMPTY, account, encodeCrockForURI(paytoStr)); + onNewDecision( + DECISION_REQUEST_EMPTY, + account, + encodeCrockForURI(paytoStr), + ); }} class="text-indigo-600 hover:text-indigo-900" > @@ -422,7 +429,7 @@ function WalletForm({ form.status.status === "fail" ? undefined : buildPayto( - "taler", + "taler-reserve", form.status.result.exchange, form.status.result.reservePub, ); diff --git a/packages/aml-backoffice-ui/src/pages/decision/AmlDecisionRequestWizard.tsx b/packages/aml-backoffice-ui/src/pages/decision/AmlDecisionRequestWizard.tsx @@ -364,7 +364,9 @@ function Header({ ? undefined : (newPaytoParsed = parsePaytoUri(newPayto)) === undefined ? undefined - : newPaytoParsed.isKnown && newPaytoParsed.targetType === "taler"; + : newPaytoParsed.isKnown && + (newPaytoParsed.targetType === "taler-reserve" || + newPaytoParsed.targetType === "taler-reserve-http"); const activeDecision = useAccountActiveDecision( isNewAccount ? undefined : account, diff --git a/packages/aml-backoffice-ui/src/pages/decision/Rules.tsx b/packages/aml-backoffice-ui/src/pages/decision/Rules.tsx @@ -137,7 +137,9 @@ export function Rules({ ? undefined : (newPaytoParsed = parsePaytoUri(newPayto)) === undefined ? undefined - : newPaytoParsed.isKnown && newPaytoParsed.targetType === "taler"; + : newPaytoParsed.isKnown && + (newPaytoParsed.targetType === "taler-reserve" || + newPaytoParsed.targetType === "taler-reserve-http"); // const [request, updateRequestField, updateRequest] = // useCurrentDecisionRequest(); diff --git a/packages/bank-ui/src/pages/OperationState/views.tsx b/packages/bank-ui/src/pages/OperationState/views.tsx @@ -212,7 +212,10 @@ export function NeedConfirmationView({ <i18n.Translate>Confirm the withdrawal operation</i18n.Translate> </h3> <div class="mt-3 text-sm leading-6"> - <ShouldBeSameUser username={account} onAuthorizationRequired={onAuthorizationRequired}> + <ShouldBeSameUser + username={account} + onAuthorizationRequired={onAuthorizationRequired} + > <form class="bg-white shadow-sm ring-1 ring-gray-900/5 sm:rounded-xl md:col-span-2" autoCapitalize="none" @@ -240,7 +243,8 @@ export function NeedConfirmationView({ ); } switch (details.account.targetType) { - case "taler": { + case "taler-reserve-http": + case "taler-reserve": { // FIXME: support wire transfer to wallet return <div>not yet supported</div>; } diff --git a/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx b/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx @@ -167,7 +167,8 @@ export function PaytoWireTransferForm({ ? undefined : p.targetType === "iban" ? p.iban - : p.targetType === "taler" + : p.targetType === "taler-reserve" || + p.targetType === "taler-reserve-http" ? undefined // FIXME: unsupported payto:// : p.targetType === "bitcoin" ? p.address @@ -322,7 +323,10 @@ export function PaytoWireTransferForm({ onChange={() => { if (parsed && parsed.isKnown) { switch (parsed.targetType) { - case "taler": { + case "ethereum": + case "bitcoin": + case "taler-reserve": + case "taler-reserve-http": { // FIXME: unsupported payto break; } @@ -334,14 +338,6 @@ export function PaytoWireTransferForm({ setAccount(parsed.account); break; } - case "bitcoin": { - // FIXME: unsupported payto - break; - } - case "ethereum": { - // FIXME: unsupported payto - break; - } default: { assertUnreachable(parsed); } diff --git a/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx b/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx @@ -275,7 +275,8 @@ export function WithdrawalConfirmationQuestion({ ); } switch (details.account.targetType) { - case "taler": { + case "taler-reserve-http": + case "taler-reserve": { // FIXME: support wire transfer to wallet return <div>not yet supported</div>; } diff --git a/packages/merchant-backoffice-ui/src/components/modal/index.tsx b/packages/merchant-backoffice-ui/src/components/modal/index.tsx @@ -465,7 +465,8 @@ export function ValidBankAccount({ ? origin.targetPath : origin.targetType === "iban" ? origin.iban - : origin.targetType === "taler" + : origin.targetType === "taler-reserve" || + origin.targetType === "taler-reserve-http" ? origin.reservePub : origin.targetType === "bitcoin" ? `${origin.address.substring(0, 8)}...` diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx @@ -23,8 +23,7 @@ import { parsePaytoUri, PaytoType, PaytoUri, - PaytoUriBitcoin, - TalerMerchantApi + TalerMerchantApi, } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; @@ -105,14 +104,23 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { const emptyList: Record< PaytoType | "unknown", { parsed: PaytoUri; acc: Entity }[] - > = { bitcoin: [], "x-taler-bank": [], iban: [], taler: [], unknown: [], ethereum: [] }; + > = { + bitcoin: [], + "x-taler-bank": [], + iban: [], + "taler-reserve": [], + "taler-reserve-http": [], + unknown: [], + ethereum: [], + }; const accountsByType = accounts.reduce((prev, acc) => { const parsed = parsePaytoUri(acc.payto_uri); if (!parsed) return prev; //skip if ( parsed.targetType !== "bitcoin" && - parsed.targetType !== "taler" && + parsed.targetType !== "taler-reserve" && + parsed.targetType !== "taler-reserve-http" && parsed.targetType !== "x-taler-bank" && parsed.targetType !== "iban" ) { @@ -127,7 +135,8 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { const talerbankAccounts = accountsByType["x-taler-bank"]; const ibanAccounts = accountsByType["iban"]; const unknownAccounts = accountsByType["unknown"]; - + //FIXME: add support for payto://taler-reserve and payto://taler-reserve-http + //FIXME: this code doesn't addapt well on new payto definitions return ( <Fragment> <div class="table-container"> @@ -290,7 +299,6 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { </tbody> </table> </div> - </Fragment> ); } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/UpdatePage.tsx @@ -464,8 +464,11 @@ export function paytoDisplayAccountName(account: PaytoString): string { case "iban": { return p.iban; } - case "taler": { - return p.reservePub; + case "taler-reserve": { + return `${p.reservePub}@${p.exchange}`; + } + case "taler-reserve-http": { + return `${p.reservePub}@${p.exchange}`; } case "x-taler-bank": { return `${p.account}@${p.host}`; diff --git a/packages/taler-util/src/payto.ts b/packages/taler-util/src/payto.ts @@ -25,7 +25,6 @@ import { } from "./codec.js"; import { AccessToken, - assertUnreachable, codecForAccessToken, codecOptional, hashTruncate32, @@ -37,6 +36,7 @@ export type PaytoUri = | PaytoUriUnknown | PaytoUriIBAN | PaytoUriTaler + | PaytoUriTalerHttp | PaytoUriTalerBank | PaytoUriEthereum | PaytoUriBitcoin; @@ -82,7 +82,14 @@ export interface PaytoUriIBAN extends PaytoUriGeneric { export interface PaytoUriTaler extends PaytoUriGeneric { isKnown: true; - targetType: "taler"; + targetType: "taler-reserve"; + exchange: string; + reservePub: string; +} + +export interface PaytoUriTalerHttp extends PaytoUriGeneric { + isKnown: true; + targetType: "taler-reserve-http"; exchange: string; reservePub: string; } @@ -113,7 +120,8 @@ export type PaytoType = | "iban" | "bitcoin" | "x-taler-bank" - | "taler" + | "taler-reserve" + | "taler-reserve-http" | "ethereum"; export function buildPayto( @@ -123,7 +131,13 @@ export function buildPayto( params?: Record<string, string>, ): PaytoUriIBAN; export function buildPayto( - type: "taler", + type: "taler-reserve", + exchange: string, + reservePub: string, + params?: Record<string, string>, +): PaytoUriIBAN; +export function buildPayto( + type: "taler-reserve-http", exchange: string, reservePub: string, params?: Record<string, string>, @@ -182,7 +196,7 @@ export function buildPayto( return result; } case "x-taler-bank": { - if (!second) throw Error("missing account for payto://x-taler-bank"); + if (!second) throw Error("missing account for payto://x-taler-bank/"); const result: PaytoUriTalerBank = { isKnown: true, targetType: "x-taler-bank", @@ -193,11 +207,24 @@ export function buildPayto( }; return result; } - case "taler": { - if (!second) throw Error("missing reservePub for payto://taler"); + case "taler-reserve-http": { + if (!second) + throw Error("missing reservePub for payto://taler-reserve-http/"); + const result: PaytoUriTalerHttp = { + isKnown: true, + targetType: "taler-reserve-http", + exchange: first, + reservePub: second, + params, + targetPath: `${first}/${second}`, + }; + return result; + } + case "taler-reserve": { + if (!second) throw Error("missing reservePub for payto://taler-reserve/"); const result: PaytoUriTaler = { isKnown: true, - targetType: "taler", + targetType: "taler-reserve", exchange: first, reservePub: second, params, @@ -308,8 +335,11 @@ export function hashNormalizedPaytoUri(p: PaytoUri | string): Uint8Array { case "ethereum": paytoStr = `payto://ethereum/${p.address}`; break; - case "taler": - paytoStr = `payto://taler/${p.exchange}/${p.reservePub}`; + case "taler-reserve": + paytoStr = `payto://taler-reserve/${p.exchange}/${p.reservePub}`; + break; + case "taler-reserve-http": + paytoStr = `payto://taler-reserve-http/${p.exchange}/${p.reservePub}`; break; } } @@ -431,7 +461,7 @@ export function parsePaytoUri(s: string): PaytoUri | undefined { account, }; } - case "taler": { + case "taler-reserve": { const parts = targetPath.split("/"); const exchange = parts[0]; const reservePub = parts[1]; diff --git a/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx b/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx @@ -22,6 +22,7 @@ import { PaytoUriIBAN, PaytoUriTaler, PaytoUriTalerBank, + PaytoUriTalerHttp, PaytoUriUnknown, segwitMinAmount, stringifyPaytoUri, @@ -191,7 +192,7 @@ function IBANAccountInfoTable({ subject, }: { subject: string; - payto: PaytoUriUnknown | PaytoUriIBAN | PaytoUriTalerBank | PaytoUriTaler; + payto: PaytoUriUnknown | PaytoUriIBAN | PaytoUriTalerBank | PaytoUriTalerHttp | PaytoUriTaler; }) { const { i18n } = useTranslationContext(); const api = useBackendContext(); @@ -230,7 +231,7 @@ function IBANAccountInfoTable({ ) : undefined} <Row name={i18n.str`IBAN`} value={payto.iban} /> </Fragment> - ) : payto.targetType === "taler" ? ( + ) : (payto.targetType === "taler-reserve" || payto.targetType === "taler-reserve-http") ? ( <Fragment> <Row name={i18n.str`Exchange`} value={payto.exchange} /> <Row name={i18n.str`Reserve Pub`} value={payto.reservePub} /> diff --git a/packages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx b/packages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx @@ -400,11 +400,14 @@ function describeAccount(paytoUri: string): string { case "iban": { return p.iban; } - case "taler": { - return p.reservePub; + case "taler-reserve-http": { + return `${p.reservePub}@${p.exchange}`; + } + case "taler-reserve": { + return `${p.reservePub}@${p.exchange}`; } case "x-taler-bank": { - return `${p.host}/${p.account}`; + return `${p.account}@${p.host}`; } case "bitcoin": { return `${p.address}`;