taler-typescript-core

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

commit 2935e650d6b6ff5b2b0a025ef463c5b21dd5f478
parent 616f7b3beadd0a103b8cfc0b2bc755810ebea117
Author: Sebastian <sebasjm@taler-systems.com>
Date:   Tue, 13 Jan 2026 09:28:06 -0300

fix #10848

Diffstat:
Mpackages/aml-backoffice-ui/src/pages/Search.tsx | 16+++++++++++++++-
Mpackages/bank-ui/src/pages/OperationState/views.tsx | 40++++++++++++++++++++++++++++++++++++++++
Mpackages/bank-ui/src/pages/PaytoWireTransferForm.tsx | 4++++
Mpackages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx | 50++++++++++++++++++++++++++++++++++++++++++++++----
Mpackages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx | 1+
Mpackages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx | 7+++++++
Mpackages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx | 3+++
7 files changed, 116 insertions(+), 5 deletions(-)

diff --git a/packages/aml-backoffice-ui/src/pages/Search.tsx b/packages/aml-backoffice-ui/src/pages/Search.tsx @@ -30,7 +30,7 @@ import { PaytoType, ReservePubParseError, TalerError, - TranslatedString + TranslatedString, } from "@gnu-taler/taler-util"; import { Attention, @@ -624,6 +624,10 @@ function translatePaytoError( return i18n.str`Exchange host and account is missing`; case PaytoType.Ethereum: return i18n.str`Ethereum address is missing`; + case PaytoType.Cyclos: + return i18n.str`Cyclos address is missing`; + default: + assertUnreachable(result.body); } } case PaytoParseError.INVALID_TARGET_PATH: { @@ -693,6 +697,16 @@ function translatePaytoError( assertUnreachable(result.body); } } + case PaytoType.Cyclos: { + switch (result.body.pos) { + case 0: + return i18n.str`Invalid host`; + default: + assertUnreachable(result.body); + } + } + default: + assertUnreachable(result.body); } } } diff --git a/packages/bank-ui/src/pages/OperationState/views.tsx b/packages/bank-ui/src/pages/OperationState/views.tsx @@ -301,6 +301,46 @@ export function NeedConfirmationView({ </Fragment> ); } + case PaytoType.Cyclos: { + const name = details.account.params["receiver-name"]; + return ( + <Fragment> + <div class="px-4 py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"> + <dt class="text-sm font-medium leading-6 text-gray-900"> + <i18n.Translate> + Payment Service Provider's account cyclos + hostname + </i18n.Translate> + </dt> + <dd class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0"> + {details.account.url} + </dd> + </div> + <div class="px-4 py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"> + <dt class="text-sm font-medium leading-6 text-gray-900"> + <i18n.Translate> + Payment Service Provider's account id + </i18n.Translate> + </dt> + <dd class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0"> + {details.account.account} + </dd> + </div> + {name && ( + <div class="px-4 py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"> + <dt class="text-sm font-medium leading-6 text-gray-900"> + <i18n.Translate> + Payment Service Provider's name + </i18n.Translate> + </dt> + <dd class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0"> + {name} + </dd> + </div> + )} + </Fragment> + ); + } default: { assertUnreachable(details.account); } diff --git a/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx b/packages/bank-ui/src/pages/PaytoWireTransferForm.tsx @@ -276,6 +276,10 @@ export function PaytoWireTransferForm({ setAccount(parsed.body.account); break; } + case PaytoType.Cyclos: { + setAccount(parsed.body.account); + break; + } default: { assertUnreachable(parsed.body); } diff --git a/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx b/packages/bank-ui/src/pages/WithdrawalConfirmationQuestion.tsx @@ -332,6 +332,47 @@ export function WithdrawalConfirmationQuestion({ </Fragment> ); } + case PaytoType.Cyclos: { + const name = + details.account.params["receiver-name"]; + return ( + <Fragment> + <div class="px-4 py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"> + <dt class="text-sm font-medium leading-6 text-gray-900"> + <i18n.Translate> + Payment Service Provider's account + cyclos hostname + </i18n.Translate> + </dt> + <dd class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0"> + {details.account.url} + </dd> + </div> + <div class="px-4 py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"> + <dt class="text-sm font-medium leading-6 text-gray-900"> + <i18n.Translate> + Payment Service Provider's account id + </i18n.Translate> + </dt> + <dd class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0"> + {details.account.account} + </dd> + </div> + {name && ( + <div class="px-4 py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"> + <dt class="text-sm font-medium leading-6 text-gray-900"> + <i18n.Translate> + Payment Service Provider's name + </i18n.Translate> + </dt> + <dd class="mt-1 text-sm leading-6 text-gray-700 sm:col-span-2 sm:mt-0"> + {name} + </dd> + </div> + )} + </Fragment> + ); + } default: { assertUnreachable(details.account); } @@ -416,15 +457,16 @@ export function ShouldBeSameUser({ if (credentials.status === "loggedOut") { return ( <Fragment> - <Attention type="info" title={i18n.str`Authentication required`} ></Attention> + <Attention + type="info" + title={i18n.str`Authentication required`} + ></Attention> <LoginForm currentUser={username} fixedUser /> </Fragment> ); } if (credentials.status === "expired") { - return ( - <LoginForm currentUser={username} fixedUser /> - ); + return <LoginForm currentUser={username} fixedUser />; } if (credentials.username !== username) { return ( 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 @@ -183,6 +183,7 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { "taler-reserve-http": [], unknown: [], ethereum: [], + cyclos: [], }; const accountsByType = accounts.reduce((prev, acc) => { diff --git a/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx b/packages/taler-wallet-webextension/src/components/BankDetailsByPaytoType.tsx @@ -19,6 +19,7 @@ import { Amounts, AmountString, parsePaytoUri, + PaytoUriCyclos, PaytoUriIBAN, PaytoUriTaler, PaytoUriTalerBank, @@ -196,6 +197,7 @@ function IBANAccountInfoTable({ | PaytoUriUnknown | PaytoUriIBAN | PaytoUriTalerBank + | PaytoUriCyclos | PaytoUriTalerHttp | PaytoUriTaler; }) { @@ -229,6 +231,11 @@ function IBANAccountInfoTable({ <Row name={i18n.str`Bank host`} value={payto.host} /> <Row name={i18n.str`Bank account`} value={payto.account} /> </Fragment> + ) : payto.targetType === "cyclos" ? ( + <Fragment> + <Row name={i18n.str`Cyclos host`} value={payto.host} /> + <Row name={i18n.str`Account id`} value={payto.account} /> + </Fragment> ) : payto.targetType === "iban" ? ( <Fragment> {payto.bic !== undefined ? ( diff --git a/packages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx b/packages/taler-wallet-webextension/src/wallet/DestinationSelection/views.tsx @@ -415,6 +415,9 @@ function describeAccount(paytoUri: string): string { case "x-taler-bank": { return `${p.account}@${p.host}`; } + case "cyclos": { + return `${p.account}@${p.host}`; + } case "bitcoin": { return `${p.address}`; }