taler-typescript-core

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

commit e7a47757f46628336616f02317370c768b5fa9af
parent 62f1fc682a5b6b48e3e651cd5a08337f5cdd7cb2
Author: Sebastian <sebasjm@taler-systems.com>
Date:   Tue, 10 Mar 2026 08:38:34 -0300

fix #11218

Diffstat:
Mpackages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx | 21+++++++++++++++++----
Mpackages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx | 51++++++++++++++++++++++++++++++++++++++++++++++-----
Mpackages/merchant-backoffice-ui/src/paths/newAccount/index.tsx | 3++-
3 files changed, 65 insertions(+), 10 deletions(-)

diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx @@ -100,6 +100,15 @@ export function CreatePage({ onConfirm, onBack, forceId }: Props): VNode { const [notification, safeFunctionHandler] = useLocalNotificationBetter(); const mfa = useChallengeHandler(); + let phoneRegex: RegExp | undefined = undefined; + if (config.phone_regex) { + try { + phoneRegex = new RegExp(config.phone_regex); + } catch (e) { + console.log("invalid phone regex", e); + } + } + const errors = undefinedIfEmpty<FormErrors<Entity>>({ id: !value.id ? i18n.str`Required` @@ -114,10 +123,14 @@ export function CreatePage({ onConfirm, onBack, forceId }: Props): VNode { : undefined, phone_number: !value.phone_number ? undefined - : !value.phone_number.startsWith("+") - ? i18n.str`Should start with +` - : !PHONE_JUST_NUMBERS_REGEX.test(value.phone_number) - ? i18n.str`A phone number consists of numbers only` + : !phoneRegex + ? !value.phone_number.startsWith("+") + ? i18n.str`Should start with +` + : !PHONE_JUST_NUMBERS_REGEX.test(value.phone_number) + ? i18n.str`A phone number consists of numbers only` + : undefined + : !phoneRegex.test(value.phone_number) + ? i18n.str`Invalid phone number` : undefined, default_pay_delay: !value.default_pay_delay ? i18n.str`Required` diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx @@ -25,6 +25,7 @@ import { HttpStatusCode, TalerMerchantApi, TalerMerchantInstanceHttpClient, + TanChannel, } from "@gnu-taler/taler-util"; import { ButtonBetterBulma, @@ -47,6 +48,10 @@ import { undefinedIfEmpty } from "../../../utils/table.js"; import { CopyButton } from "../../../components/modal/index.js"; import { Tooltip } from "../../../components/Tooltip.js"; import { maybeTryFirstMFA } from "../accounts/create/CreatePage.js"; +import { + EMAIL_REGEX, + PHONE_JUST_NUMBERS_REGEX, +} from "../../../utils/constants.js"; const TALER_SCREEN_ID = 75; @@ -90,17 +95,53 @@ export function UpdatePage({ const { i18n } = useTranslationContext(); + const serverRequiresEmail = + config.mandatory_tan_channels?.indexOf(TanChannel.EMAIL) !== -1; + const serverRequiresSms = + config.mandatory_tan_channels?.indexOf(TanChannel.SMS) !== -1; + + let phoneRegex: RegExp | undefined = undefined; + if (config.phone_regex) { + try { + phoneRegex = new RegExp(config.phone_regex); + } catch (e) { + console.log("invalid phone regex", e); + } + } + const errors = undefinedIfEmpty<FormErrors<Entity>>({ name: !value.name ? i18n.str`Required` : undefined, + email: !value.email + ? undefined + : !EMAIL_REGEX.test(value.email) + ? i18n.str`Doesn't have the pattern of an email` + : undefined, + phone_number: !value.phone_number + ? undefined + : !phoneRegex + ? !value.phone_number.startsWith("+") + ? i18n.str`Should start with +` + : !PHONE_JUST_NUMBERS_REGEX.test(value.phone_number) + ? i18n.str`A phone number consists of numbers only` + : undefined + : !phoneRegex.test(value.phone_number) + ? i18n.str`Invalid phone number` + : undefined, default_pay_delay: !value.default_pay_delay ? i18n.str`Required` - : undefined, + : value.default_pay_delay.d_us === "forever" + ? i18n.str`Invalid value` + : undefined, default_refund_delay: !value.default_refund_delay ? i18n.str`Required` - : undefined, + : value.default_refund_delay.d_us === "forever" + ? i18n.str`Invalid value` + : undefined, default_wire_transfer_delay: !value.default_wire_transfer_delay ? i18n.str`Required` - : undefined, + : value.default_wire_transfer_delay.d_us === "forever" + ? i18n.str`Invalid value` + : undefined, address: undefinedIfEmpty({ address_lines: value.address?.address_lines && value.address?.address_lines.length > 7 @@ -142,11 +183,11 @@ export function UpdatePage({ d: TalerMerchantApi.InstanceReconfigurationMessage, challengeIds: string[], ) => { - const resp = await doUpdate(token, d, { challengeIds }) + const resp = await doUpdate(token, d, { challengeIds }); if (resp.type === "fail" && resp.case === HttpStatusCode.Accepted) { await maybeTryFirstMFA(lib.instance, mfa, resp.body); } - return resp + return resp; }, hasErrors || !state.token ? undefined : [state.token, result, []], ); diff --git a/packages/merchant-backoffice-ui/src/paths/newAccount/index.tsx b/packages/merchant-backoffice-ui/src/paths/newAccount/index.tsx @@ -108,12 +108,13 @@ export function NewAccount({ onCancel, onCreated }: Props): VNode { config.mandatory_tan_channels?.indexOf(TanChannel.SMS) !== -1; let phoneRegex: RegExp | undefined = undefined; - if (config.phone_regex) + if (config.phone_regex) { try { phoneRegex = new RegExp(config.phone_regex); } catch (e) { console.log("invalid phone regex", e); } + } const errors = undefinedIfEmpty<FormErrors<Account>>({ id: !value.id