taler-typescript-core

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

commit f040aa1126775f462cea46369386e01efef3459d
parent fa52e25e2a54805e6bc3c753c7b0f1325c3677bc
Author: Sebastian <sebasjm@gmail.com>
Date:   Tue, 11 Feb 2025 12:45:09 -0300

fix #9520

Diffstat:
Mpackages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx | 68+++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 55 insertions(+), 13 deletions(-)

diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx @@ -26,6 +26,8 @@ import { Duration, TalerMerchantApi, TalerProtocolDuration, + codecForURL, + getURLHostnamePortPath, } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { format, isFuture } from "date-fns"; @@ -113,7 +115,8 @@ interface Pricing extends TalerForm { interface Shipping extends TalerForm { delivery_date?: Date; delivery_location?: TalerMerchantApi.Location; - fullfilment_url?: string; + fulfillment_url?: string; + fulfillment_message?: string; } interface Payments extends TalerForm { refund_deadline: Duration; @@ -133,6 +136,15 @@ interface Entity extends TalerForm { extra: Record<string, string>; } +function isInvalidUrl(url: string) { + try { + const asd = new URL("./", url); + return false; + } catch (e) { + return true; + } +} + export function CreatePage({ onCreate, onBack, @@ -209,6 +221,19 @@ export function CreatePage({ : !isFuture(value.shipping.delivery_date) ? i18n.str`Must be in the future` : undefined, + fulfillment_message: + !!value.shipping?.fulfillment_message && + !!value.shipping?.fulfillment_url + ? i18n.str`Either fulfillment url or fulfillment message must be specified.` + : undefined, + fulfillment_url: + !!value.shipping?.fulfillment_message && + !!value.shipping?.fulfillment_url + ? i18n.str`Either fulfillment url or fulfillment message must be specified.` + : !!value.shipping?.fulfillment_url && + isInvalidUrl(value.shipping.fulfillment_url) + ? i18n.str`is not a valid URL` + : undefined, }), }); const hasErrors = errors !== undefined; @@ -255,7 +280,8 @@ export function CreatePage({ ? { t_s: value.shipping.delivery_date.getTime() / 1000 } : undefined, delivery_location: value.shipping.delivery_location, - fulfillment_url: value.shipping.fullfilment_url, + fulfillment_url: value.shipping.fulfillment_url, + fulfillment_message: value.shipping.fulfillment_message, minimum_age: value.payments.minimum_age, }, inventory_products: inventoryList.map((p) => ({ @@ -491,7 +517,7 @@ export function CreatePage({ tooltip={i18n.str`Title of the order to be shown to the customer`} /> - {(pref.advanceOrderMode|| errors?.shipping) && ( + {(pref.advanceOrderMode || errors?.shipping) && ( <InputGroup name="shipping" label={i18n.str`Shipping and fulfillment`} @@ -512,20 +538,29 @@ export function CreatePage({ </InputGroup> )} <Input - name="shipping.fullfilment_url" + name="shipping.fulfillment_url" label={i18n.str`Fulfillment URL`} tooltip={i18n.str`URL to which the user will be redirected after successful payment.`} /> + <Input + name="shipping.fulfillment_message" + label={i18n.str`Fulfillment message`} + tooltip={i18n.str`Message shown to the customer after paying for the order.`} + /> </InputGroup> )} - {(pref.advanceOrderMode || requiresSomeTalerOptions || errors?.payments) && ( + {(pref.advanceOrderMode || + requiresSomeTalerOptions || + errors?.payments) && ( <InputGroup name="payments" label={i18n.str`Taler payment options`} tooltip={i18n.str`Override default Taler payment settings for this order`} > - {(pref.advanceOrderMode || noDefault_payDeadline || errors?.payments?.pay_deadline !== undefined) && ( + {(pref.advanceOrderMode || + noDefault_payDeadline || + errors?.payments?.pay_deadline !== undefined) && ( <InputDuration name="payments.pay_deadline" label={i18n.str`Payment time`} @@ -557,7 +592,8 @@ export function CreatePage({ } /> )} - {(pref.advanceOrderMode || errors?.payments?.refund_deadline !== undefined) && ( + {(pref.advanceOrderMode || + errors?.payments?.refund_deadline !== undefined) && ( <InputDuration name="payments.refund_deadline" label={i18n.str`Refund time`} @@ -590,7 +626,9 @@ export function CreatePage({ } /> )} - {(pref.advanceOrderMode || noDefault_wireDeadline || errors?.payments?.wire_transfer_deadline !== undefined) && ( + {(pref.advanceOrderMode || + noDefault_wireDeadline || + errors?.payments?.wire_transfer_deadline !== undefined) && ( <InputDuration name="payments.wire_transfer_deadline" label={i18n.str`Wire transfer time`} @@ -624,7 +662,8 @@ export function CreatePage({ } /> )} - {(pref.advanceOrderMode || errors?.payments?.auto_refund_deadline !== undefined) && ( + {(pref.advanceOrderMode || + errors?.payments?.auto_refund_deadline !== undefined) && ( <InputDuration name="payments.auto_refund_deadline" label={i18n.str`Auto-refund time`} @@ -638,21 +677,24 @@ export function CreatePage({ /> )} - {(pref.advanceOrderMode || errors?.payments?.max_fee !== undefined) && ( + {(pref.advanceOrderMode || + errors?.payments?.max_fee !== undefined) && ( <InputCurrency name="payments.max_fee" label={i18n.str`Maximum fee`} tooltip={i18n.str`Maximum fees the merchant is willing to cover for this order. Higher deposit fees must be covered in full by the consumer.`} /> )} - {(pref.advanceOrderMode|| errors?.payments?.createToken !== undefined) && ( + {(pref.advanceOrderMode || + errors?.payments?.createToken !== undefined) && ( <InputToggle name="payments.createToken" label={i18n.str`Create token`} tooltip={i18n.str`If the order ID is easy to guess the token will prevent users to steal orders from others.`} /> )} - {(pref.advanceOrderMode|| errors?.payments?.minimum_age !== undefined) && ( + {(pref.advanceOrderMode || + errors?.payments?.minimum_age !== undefined) && ( <InputNumber name="payments.minimum_age" label={i18n.str`Minimum age required`} @@ -667,7 +709,7 @@ export function CreatePage({ </InputGroup> )} - {(pref.advanceOrderMode|| errors?.extra !== undefined) && ( + {(pref.advanceOrderMode || errors?.extra !== undefined) && ( <InputGroup name="extra" label={i18n.str`Additional information`}