commit 9750e03a74d9a9c86bc7bbacd0d9a8458c3ae2e7
parent 2935e650d6b6ff5b2b0a025ef463c5b21dd5f478
Author: Sebastian <sebasjm@taler-systems.com>
Date: Tue, 13 Jan 2026 10:22:11 -0300
fix #10844
Diffstat:
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>
"
{
- succeedOrThrow(Paytos.fromString(deleting.payto_uri))
- .displayName
+ succeedOrValue(Paytos.fromString(deleting.payto_uri), {
+ displayName: i18n.str`Invalid payto: "${deleting.payto_uri}"`,
+ }).displayName
}
"
</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