taler-typescript-core

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

commit 9750e03a74d9a9c86bc7bbacd0d9a8458c3ae2e7
parent 2935e650d6b6ff5b2b0a025ef463c5b21dd5f478
Author: Sebastian <sebasjm@taler-systems.com>
Date:   Tue, 13 Jan 2026 10:22:11 -0300

fix #10844

Diffstat:
Mpackages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx | 46++++++++++++++++++++++++++++++++++++++++++++--
Mpackages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx | 32+++++++++++++++++++-------------
2 files changed, 63 insertions(+), 15 deletions(-)

diff --git a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx @@ -191,7 +191,7 @@ function validateIBAN_path1( return undefined; } -const allTargets = ["iban", "bitcoin", "ethereum", "x-taler-bank"]; +const allTargets = ["iban", "bitcoin", "ethereum", "cyclos", "x-taler-bank"]; function checkServerRegex( i18n: InternationalizationAPI, @@ -276,7 +276,7 @@ export function InputPaytoForm<T>({ ) : undefined, path2: - value.target === "x-taler-bank" + value.target === "x-taler-bank" || value.target === "cyclos" ? !value.path2 ? i18n.str`Required` : undefined @@ -459,6 +459,45 @@ export function InputPaytoForm<T>({ /> </Fragment> )} + {value.target === "cyclos" && ( + <Fragment> + <Input<Entity> + name="path1" + readonly={readonly} + label={i18n.str`Host`} + fromStr={(v) => { + if (v.startsWith("http")) { + try { + const url = new URL(v); + return url.host + url.pathname; + } catch { + return v; + } + } + return v; + }} + tooltip={i18n.str`Cyclos host`} + help={ + <Fragment> + <div> + <i18n.Translate> + Enter the data without a scheme. A subpath may be + included: + </i18n.Translate> + </div> + <div>demo.cyclos.org/</div> + <div>demo.cyclos.org/path/subpath/</div> + </Fragment> + } + /> + <Input<Entity> + name="path2" + readonly={readonly} + label={i18n.str`Account`} + tooltip={i18n.str`cyclos account`} + /> + </Fragment> + )} {/** * Show additional fields apart from the payto @@ -487,5 +526,8 @@ function cleanupPath1(str: string, type?: string) { if (type === "x-taler-bank") { return !str.endsWith("/") ? str + "/" : str; } + if (type === "cyclos") { + return !str.endsWith("/") ? str + "/" : str; + } return str; } 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 @@ -26,8 +26,8 @@ import { Paytos, PaytoType, PaytoUri, - succeedOrThrow, - TalerMerchantApi, + succeedOrValue, + TalerMerchantApi } from "@gnu-taler/taler-util"; import { LocalNotificationBannerBulma, @@ -60,7 +60,7 @@ export function CardTable({ accounts, onCreate, onSelect }: Props): VNode { const remove = safeFunctionHandler( lib.instance.deleteBankAccount.bind(lib.instance), - !session.token || !deleting ? undefined : [session.token, deleting.h_wire] + !session.token || !deleting ? undefined : [session.token, deleting.h_wire], ); remove.onFail = (fail) => { switch (fail.case) { @@ -86,7 +86,9 @@ export function CardTable({ accounts, onCreate, onSelect }: Props): VNode { <ConfirmModal label={i18n.str`Delete account`} description={i18n.str`Delete the account "${ - succeedOrThrow(Paytos.fromString(deleting.payto_uri)).displayName + succeedOrValue(Paytos.fromString(deleting.payto_uri), { + displayName: i18n.str`Invalid payto: "${deleting.payto_uri}"`, + }).displayName }"`} danger active @@ -99,8 +101,9 @@ export function CardTable({ accounts, onCreate, onSelect }: Props): VNode { <b> &quot; { - succeedOrThrow(Paytos.fromString(deleting.payto_uri)) - .displayName + succeedOrValue(Paytos.fromString(deleting.payto_uri), { + displayName: i18n.str`Invalid payto: "${deleting.payto_uri}"`, + }).displayName } &quot; </b>{" "} @@ -242,8 +245,9 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { style={{ cursor: "pointer" }} > { - succeedOrThrow(Paytos.fromString(acc.payto_uri)) - .displayName + succeedOrValue(Paytos.fromString(acc.payto_uri), { + displayName: i18n.str`Invalid payto: "${acc.payto_uri}"`, + }).displayName } </td> <td @@ -280,7 +284,7 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { style={{ cursor: "pointer" }} > { - succeedOrThrow(Paytos.fromString(acc.payto_uri)) + succeedOrValue(Paytos.fromString(acc.payto_uri),{displayName: i18n.str`Invalid payto: "${acc.payto_uri}"`}) .displayName } </td> @@ -318,8 +322,9 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { style={{ cursor: "pointer" }} > { - succeedOrThrow(Paytos.fromString(acc.payto_uri)) - .displayName + succeedOrValue(Paytos.fromString(acc.payto_uri), { + displayName: i18n.str`Invalid payto: "${acc.payto_uri}"`, + }).displayName } </td> <td @@ -356,8 +361,9 @@ function Table({ accounts, onDelete, onSelect }: TableProps): VNode { style={{ cursor: "pointer" }} > { - succeedOrThrow(Paytos.fromString(acc.payto_uri)) - .displayName + succeedOrValue(Paytos.fromString(acc.payto_uri), { + displayName: i18n.str`Invalid payto: "${acc.payto_uri}"`, + }).displayName } </td> <td