commit f040aa1126775f462cea46369386e01efef3459d
parent fa52e25e2a54805e6bc3c753c7b0f1325c3677bc
Author: Sebastian <sebasjm@gmail.com>
Date: Tue, 11 Feb 2025 12:45:09 -0300
fix #9520
Diffstat:
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`}