@voyant-travel/bookings-react 0.141.0 → 0.141.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/file-dropzone.d.ts +1 -1
- package/dist/components/file-dropzone.d.ts.map +1 -1
- package/dist/components/file-dropzone.js +10 -3
- package/dist/i18n/en-journey.d.ts +1 -0
- package/dist/i18n/en-journey.d.ts.map +1 -1
- package/dist/i18n/en-journey.js +1 -0
- package/dist/i18n/en.d.ts +1 -0
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/messages-journey.d.ts +1 -0
- package/dist/i18n/messages-journey.d.ts.map +1 -1
- package/dist/i18n/provider.d.ts +2 -0
- package/dist/i18n/provider.d.ts.map +1 -1
- package/dist/i18n/ro-journey.d.ts +1 -0
- package/dist/i18n/ro-journey.d.ts.map +1 -1
- package/dist/i18n/ro-journey.js +1 -0
- package/dist/i18n/ro.d.ts +1 -0
- package/dist/i18n/ro.d.ts.map +1 -1
- package/dist/journey/components/booking-journey-rules.d.ts +1 -0
- package/dist/journey/components/booking-journey-rules.d.ts.map +1 -1
- package/dist/journey/components/booking-journey-rules.js +20 -2
- package/dist/journey/components/booking-journey.d.ts.map +1 -1
- package/dist/journey/components/booking-journey.js +3 -3
- package/dist/journey/components/journey-steps/billing-step.d.ts +2 -1
- package/dist/journey/components/journey-steps/billing-step.d.ts.map +1 -1
- package/dist/journey/components/journey-steps/billing-step.js +8 -4
- package/dist/journey/components/journey-steps/shared.d.ts +5 -1
- package/dist/journey/components/journey-steps/shared.d.ts.map +1 -1
- package/dist/journey/components/journey-steps/shared.js +8 -2
- package/dist/journey/components/journey-steps/travelers-step.d.ts +2 -1
- package/dist/journey/components/journey-steps/travelers-step.d.ts.map +1 -1
- package/dist/journey/components/journey-steps/travelers-step.js +8 -4
- package/dist/journey/lib/email-validation.d.ts +3 -0
- package/dist/journey/lib/email-validation.d.ts.map +1 -0
- package/dist/journey/lib/email-validation.js +8 -0
- package/package.json +12 -12
|
@@ -7,7 +7,7 @@ export interface UploadedFile {
|
|
|
7
7
|
name: string;
|
|
8
8
|
}
|
|
9
9
|
export interface FileDropzoneProps {
|
|
10
|
-
/** URL of the upload endpoint
|
|
10
|
+
/** URL of the upload endpoint. Defaults to the Voyant provider API base. */
|
|
11
11
|
uploadUrl?: string;
|
|
12
12
|
/** MIME types or extensions to accept (same format as <input accept>). */
|
|
13
13
|
accept?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-dropzone.d.ts","sourceRoot":"","sources":["../../src/components/file-dropzone.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"file-dropzone.d.ts","sourceRoot":"","sources":["../../src/components/file-dropzone.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;IACxC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,MAAM,EACN,OAAO,EACP,UAAU,EACV,SAAS,EACT,OAAO,EACP,UAAU,EACV,QAAQ,GACT,EAAE,iBAAiB,qBAgLnB"}
|
|
@@ -3,7 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
3
3
|
import { File as FileIcon, Loader2, Upload, X } from "lucide-react";
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import { formatMessage, useBookingsUiI18nOrDefault, useBookingsUiMessagesOrDefault, } from "../i18n/provider.js";
|
|
6
|
-
|
|
6
|
+
import { useVoyantBookingsContext } from "../provider.js";
|
|
7
|
+
export function FileDropzone({ uploadUrl, accept, maxSize, onUploaded, onCleared, onError, helperText, disabled, }) {
|
|
8
|
+
const client = useVoyantBookingsContext();
|
|
7
9
|
const inputRef = React.useRef(null);
|
|
8
10
|
const [isDragging, setIsDragging] = React.useState(false);
|
|
9
11
|
const [isUploading, setIsUploading] = React.useState(false);
|
|
@@ -12,6 +14,7 @@ export function FileDropzone({ uploadUrl = "/api/v1/admin/uploads", accept, maxS
|
|
|
12
14
|
const { formatNumber } = useBookingsUiI18nOrDefault();
|
|
13
15
|
const messages = useBookingsUiMessagesOrDefault();
|
|
14
16
|
const resolvedHelperText = helperText ?? messages.fileDropzone.helperText;
|
|
17
|
+
const resolvedUploadUrl = uploadUrl ?? joinUrl(client.baseUrl, "/v1/admin/uploads");
|
|
15
18
|
const formatSize = React.useCallback((bytes) => {
|
|
16
19
|
if (bytes < 1024)
|
|
17
20
|
return `${formatNumber(bytes)} B`;
|
|
@@ -36,10 +39,9 @@ export function FileDropzone({ uploadUrl = "/api/v1/admin/uploads", accept, maxS
|
|
|
36
39
|
try {
|
|
37
40
|
const formData = new FormData();
|
|
38
41
|
formData.append("file", file);
|
|
39
|
-
const res = await
|
|
42
|
+
const res = await client.fetcher(resolvedUploadUrl, {
|
|
40
43
|
method: "POST", // i18n-literal-ok HTTP method
|
|
41
44
|
body: formData,
|
|
42
|
-
credentials: "include", // i18n-literal-ok fetch credentials mode
|
|
43
45
|
});
|
|
44
46
|
if (!res.ok) {
|
|
45
47
|
const body = await res.text();
|
|
@@ -101,3 +103,8 @@ export function FileDropzone({ uploadUrl = "/api/v1/admin/uploads", accept, maxS
|
|
|
101
103
|
}
|
|
102
104
|
return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("button", { type: "button", onClick: () => inputRef.current?.click(), onDrop: handleDrop, onDragOver: handleDragOver, onDragLeave: handleDragLeave, disabled: disabled || isUploading, "data-dragging": isDragging, className: "flex flex-col items-center justify-center gap-2 rounded-md border border-dashed px-4 py-8 text-center transition-colors hover:border-foreground/30 hover:bg-muted/30 data-[dragging=true]:border-primary data-[dragging=true]:bg-primary/5 disabled:cursor-not-allowed disabled:opacity-60", children: isUploading ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-6 w-6 animate-spin text-muted-foreground" }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.fileDropzone.uploading })] })) : (_jsxs(_Fragment, { children: [_jsx(Upload, { className: "h-6 w-6 text-muted-foreground" }), _jsx("p", { className: "text-sm text-muted-foreground", children: resolvedHelperText }), accept && (_jsxs("p", { className: "text-xs text-muted-foreground", children: [messages.fileDropzone.acceptedPrefix, " ", accept] }))] })) }), _jsx("input", { ref: inputRef, type: "file", className: "hidden", accept: accept, onChange: handleChange, disabled: disabled || isUploading }), error && _jsx("p", { className: "text-xs text-destructive", children: error })] }));
|
|
103
105
|
}
|
|
106
|
+
function joinUrl(baseUrl, path) {
|
|
107
|
+
const trimmedBase = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
|
|
108
|
+
const trimmedPath = path.startsWith("/") ? path : `/${path}`;
|
|
109
|
+
return `${trimmedBase}${trimmedPath}`;
|
|
110
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en-journey.d.ts","sourceRoot":"","sources":["../../src/i18n/en-journey.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"en-journey.d.ts","sourceRoot":"","sources":["../../src/i18n/en-journey.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0PK,CAAA"}
|
package/dist/i18n/en-journey.js
CHANGED
|
@@ -44,6 +44,7 @@ export const bookingsUiEnJourney = {
|
|
|
44
44
|
dependencyExcludes: "{dependent} can't be combined with {master}.",
|
|
45
45
|
dependencyLimitPerMaster: "At most {limit} {dependent} per {master}.",
|
|
46
46
|
dependencyLimitSum: "At most {limit} {dependent} allowed.",
|
|
47
|
+
invalidEmail: "Enter a valid email address.",
|
|
47
48
|
},
|
|
48
49
|
warnings: {
|
|
49
50
|
phoneMissing: "Phone number not set — useful for last-minute supplier contact.",
|
package/dist/i18n/en.d.ts
CHANGED
package/dist/i18n/en.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMK,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages-journey.d.ts","sourceRoot":"","sources":["../../src/i18n/messages-journey.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,CACT,WAAW,GACX,SAAS,GACT,WAAW,GACX,SAAS,GACT,eAAe,GACf,QAAQ,GACR,SAAS,GACT,WAAW,GACX,QAAQ,EACV,MAAM,CACP,GAAG;YACF,iBAAiB,EAAE,MAAM,CAAA;YACzB,gBAAgB,EAAE,MAAM,CAAA;SACzB,CAAA;QACD,UAAU,EAAE;YACV,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAA;YACZ,QAAQ,EAAE,MAAM,CAAA;YAChB,QAAQ,EAAE,MAAM,CAAA;YAChB,IAAI,EAAE,MAAM,CAAA;YACZ,IAAI,EAAE,MAAM,CAAA;YACZ,MAAM,EAAE,MAAM,CAAA;SACf,CAAA;QACD,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAA;YACf,MAAM,EAAE,MAAM,CAAA;YACd,IAAI,EAAE,MAAM,CAAA;YACZ,iBAAiB,EAAE,MAAM,CAAA;SAC1B,CAAA;QACD,UAAU,EAAE;YACV,4BAA4B,EAAE,MAAM,CAAA;YACpC,gBAAgB,EAAE,MAAM,CAAA;YACxB,WAAW,EAAE,MAAM,CAAA;YACnB,UAAU,EAAE,MAAM,CAAA;YAClB,gBAAgB,EAAE,MAAM,CAAA;YACxB,kBAAkB,EAAE,MAAM,CAAA;YAC1B,cAAc,EAAE,MAAM,CAAA;YACtB,uBAAuB,EAAE,MAAM,CAAA;YAC/B,mBAAmB,EAAE,MAAM,CAAA;YAC3B,sBAAsB,EAAE,MAAM,CAAA;YAC9B,aAAa,EAAE,MAAM,CAAA;YACrB,kBAAkB,EAAE,MAAM,CAAA;YAC1B,kBAAkB,EAAE,MAAM,CAAA;YAC1B,wBAAwB,EAAE,MAAM,CAAA;YAChC,kBAAkB,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"messages-journey.d.ts","sourceRoot":"","sources":["../../src/i18n/messages-journey.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n/provider.d.ts
CHANGED
|
@@ -756,6 +756,7 @@ export declare const bookingsUiMessageDefinitions: {
|
|
|
756
756
|
dependencyExcludes: string;
|
|
757
757
|
dependencyLimitPerMaster: string;
|
|
758
758
|
dependencyLimitSum: string;
|
|
759
|
+
invalidEmail: string;
|
|
759
760
|
};
|
|
760
761
|
warnings: {
|
|
761
762
|
phoneMissing: string;
|
|
@@ -2358,6 +2359,7 @@ export declare const bookingsUiMessageDefinitions: {
|
|
|
2358
2359
|
dependencyExcludes: string;
|
|
2359
2360
|
dependencyLimitPerMaster: string;
|
|
2360
2361
|
dependencyLimitSum: string;
|
|
2362
|
+
invalidEmail: string;
|
|
2361
2363
|
};
|
|
2362
2364
|
warnings: {
|
|
2363
2365
|
phoneMissing: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/i18n/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,aAAa,EAEb,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAEtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAKvD,eAAO,MAAM,4BAA4B
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/i18n/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,aAAa,EAEb,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAEtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAKvD,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGe,CAAA;AAExD,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,CAAC,kBAAkB,CAAC,CAAA;AASnF,wBAAgB,yBAAyB,CAAC,EACxC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAA;CAC9C,sBAOA;AAED,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAClC,SAAS,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAA;CAC9C,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,CASvC;AAED,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAA;CAC9C,+BAWA;AAED,eAAO,MAAM,iBAAiB,4CAA4B,CAAA;AAC1D,eAAO,MAAM,qBAAqB,0BAAgC,CAAA;AAElE,wBAAgB,0BAA0B,yCAEzC;AAED,wBAAgB,8BAA8B,uBAE7C;AAED,OAAO,EAAE,aAAa,EAAE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ro-journey.d.ts","sourceRoot":"","sources":["../../src/i18n/ro-journey.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"ro-journey.d.ts","sourceRoot":"","sources":["../../src/i18n/ro-journey.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8PK,CAAA"}
|
package/dist/i18n/ro-journey.js
CHANGED
|
@@ -44,6 +44,7 @@ export const bookingsUiRoJourney = {
|
|
|
44
44
|
dependencyExcludes: "{dependent} nu poate fi combinat cu {master}.",
|
|
45
45
|
dependencyLimitPerMaster: "Maximum {limit} {dependent} per {master}.",
|
|
46
46
|
dependencyLimitSum: "Maximum {limit} {dependent} permis.",
|
|
47
|
+
invalidEmail: "Introdu o adresa de email valida.",
|
|
47
48
|
},
|
|
48
49
|
warnings: {
|
|
49
50
|
phoneMissing: "Numarul de telefon lipseste - util pentru contact furnizor in ultimul moment.",
|
package/dist/i18n/ro.d.ts
CHANGED
package/dist/i18n/ro.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ro.d.ts","sourceRoot":"","sources":["../../src/i18n/ro.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"ro.d.ts","sourceRoot":"","sources":["../../src/i18n/ro.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMK,CAAA"}
|
|
@@ -26,6 +26,7 @@ export declare function buildCommitPaymentIntent(draft: Draft): {
|
|
|
26
26
|
};
|
|
27
27
|
export declare function isStepVisible(step: JourneyStep, shape: BookingDraftShape): boolean;
|
|
28
28
|
export declare function canAdvanceFromStep(step: JourneyStep, draft: Draft, shape: BookingDraftShape, available: boolean): boolean;
|
|
29
|
+
export declare function validationErrorsForStep(step: JourneyStep, draft: Draft, messages: BookingsUiMessages): ReadonlyArray<string>;
|
|
29
30
|
/**
|
|
30
31
|
* Completeness for the stacked admin accordion's AUTO-advance — stricter
|
|
31
32
|
* than `canAdvanceFromStep` so the flow pauses on sections that need a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"booking-journey-rules.d.ts","sourceRoot":"","sources":["../../../src/journey/components/booking-journey-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAOvB,MAAM,6DAA6D,CAAA;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAAiB,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,KAAK,KAAK,EAAY,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"booking-journey-rules.d.ts","sourceRoot":"","sources":["../../../src/journey/components/booking-journey-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAOvB,MAAM,6DAA6D,CAAA;AACpE,OAAO,EAAE,KAAK,kBAAkB,EAAiB,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAE,KAAK,KAAK,EAAY,MAAM,uBAAuB,CAAA;AAI5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2BtE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,WAAW,GAAG,kBAAkB,CAK7F;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAGvE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAgClF;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,OAAO,GACjB,OAAO,CAgET;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,kBAAkB,GAC3B,aAAa,CAAC,MAAM,CAAC,CAevB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,OAAO,GACjB,OAAO,CAeT;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,kBAAkB,GAC3B,aAAa,CAAC,MAAM,CAAC,CA4DvB;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAMf;AAED,wBAAgB,mBAAmB,IAAI,iBAAiB,CAavD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DEFAULT_PAX_BANDS, DEFAULT_PAYMENT_INTENTS, defaultBookingFields, defaultDraftShapeFlags, defaultTravelerFields, paxBandsAllowedTotalFrom, } from "@voyant-travel/catalog-contracts/booking-engine/draft-shape";
|
|
2
2
|
import { formatMessage } from "../../i18n/index.js";
|
|
3
3
|
import { totalPax } from "../lib/draft-state.js";
|
|
4
|
+
import { isValidOptionalEmail } from "../lib/email-validation.js";
|
|
4
5
|
import { evaluatePaxBandDependencies } from "../lib/pax-band-dependencies.js";
|
|
5
6
|
import { findPaidScheduleRowsMissingPaymentDate } from "../lib/payment-schedule.js";
|
|
6
7
|
/**
|
|
@@ -114,11 +115,12 @@ export function canAdvanceFromStep(step, draft, shape, available) {
|
|
|
114
115
|
// collect an individual contact name (and the manual contact inputs are
|
|
115
116
|
// hidden), so requiring one would lock the step with no way to satisfy it.
|
|
116
117
|
if (draft.billing.buyerType === "B2B") {
|
|
117
|
-
return Boolean(draft.billing.organizationId);
|
|
118
|
+
return (Boolean(draft.billing.organizationId) && isValidOptionalEmail(draft.billing.contact.email));
|
|
118
119
|
}
|
|
119
120
|
const c = draft.billing.contact;
|
|
120
121
|
return (c.firstName.length > 0 &&
|
|
121
122
|
c.lastName.length > 0 &&
|
|
123
|
+
isValidOptionalEmail(c.email) &&
|
|
122
124
|
(c.email.length > 0 || Boolean(c.phone?.trim())));
|
|
123
125
|
}
|
|
124
126
|
case "travelers": {
|
|
@@ -134,7 +136,7 @@ export function canAdvanceFromStep(step, draft, shape, available) {
|
|
|
134
136
|
}
|
|
135
137
|
// Hard-reject only on canonical traveler fields (firstName, lastName);
|
|
136
138
|
// other required fields surface as warnings, fillable later.
|
|
137
|
-
return draft.travelers.every((t) => t.firstName && t.lastName);
|
|
139
|
+
return draft.travelers.every((t) => t.firstName && t.lastName && isValidOptionalEmail(t.email));
|
|
138
140
|
}
|
|
139
141
|
case "payment":
|
|
140
142
|
return findPaidScheduleRowsMissingPaymentDate(draft.paymentSchedules) === null;
|
|
@@ -142,6 +144,22 @@ export function canAdvanceFromStep(step, draft, shape, available) {
|
|
|
142
144
|
return true;
|
|
143
145
|
}
|
|
144
146
|
}
|
|
147
|
+
export function validationErrorsForStep(step, draft, messages) {
|
|
148
|
+
const errors = [];
|
|
149
|
+
switch (step) {
|
|
150
|
+
case "billing":
|
|
151
|
+
if (!isValidOptionalEmail(draft.billing.contact.email)) {
|
|
152
|
+
errors.push(messages.bookingJourney.validation.invalidEmail);
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
case "travelers":
|
|
156
|
+
if (draft.travelers.some((t) => !isValidOptionalEmail(t.email))) {
|
|
157
|
+
errors.push(messages.bookingJourney.validation.invalidEmail);
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
return errors;
|
|
162
|
+
}
|
|
145
163
|
/**
|
|
146
164
|
* Completeness for the stacked admin accordion's AUTO-advance — stricter
|
|
147
165
|
* than `canAdvanceFromStep` so the flow pauses on sections that need a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"booking-journey.d.ts","sourceRoot":"","sources":["../../../src/journey/components/booking-journey.tsx"],"names":[],"mappings":"AAgCA,OAAO,EACL,KAAK,mBAAmB,EAIzB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"booking-journey.d.ts","sourceRoot":"","sources":["../../../src/journey/components/booking-journey.tsx"],"names":[],"mappings":"AAgCA,OAAO,EACL,KAAK,mBAAmB,EAIzB,MAAM,aAAa,CAAA;AA+BpB,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,CAAC,YAAY,CA8wB7E"}
|
|
@@ -8,7 +8,7 @@ import { useBookingsUiMessagesOrDefault } from "../../i18n/index.js";
|
|
|
8
8
|
import { emptyDraft, totalPax } from "../lib/draft-state.js";
|
|
9
9
|
import { findPaidScheduleRowsMissingPaymentDate } from "../lib/payment-schedule.js";
|
|
10
10
|
import { JOURNEY_STEP_ORDER, } from "../types.js";
|
|
11
|
-
import { buildCommitParty, buildCommitPaymentIntent, canAdvanceFromStep, defaultMinimalShape, isStepVisible, makeHoldSignature, resolveInitialStatus, stackedStepComplete, warningsForStep, } from "./booking-journey-rules.js";
|
|
11
|
+
import { buildCommitParty, buildCommitPaymentIntent, canAdvanceFromStep, defaultMinimalShape, isStepVisible, makeHoldSignature, resolveInitialStatus, stackedStepComplete, validationErrorsForStep, warningsForStep, } from "./booking-journey-rules.js";
|
|
12
12
|
import { ConfigureStepSkeleton } from "./configure-step-skeleton.js";
|
|
13
13
|
import { ContractPreviewDialog } from "./contract-preview-dialog.js";
|
|
14
14
|
import { AccommodationStep, AddonsStep, BillingStep, DepartureStep, DocumentsStep, FinalizeControls, OptionsStep, PaymentStep, ReviewStep, TravelersStep, } from "./journey-steps.js";
|
|
@@ -396,9 +396,9 @@ export function BookingJourney(props) {
|
|
|
396
396
|
case "options":
|
|
397
397
|
return (_jsx(OptionsStep, { draft: draft, setDraft: setDraft, shape: shape, productId: props.entityId, renderUnitsPicker: props.renderUnitsPicker }));
|
|
398
398
|
case "billing":
|
|
399
|
-
return (_jsx(BillingStep, { draft: draft, setDraft: setDraft, shape: shape, renderLeadContactPicker: props.renderLeadContactPicker, renderExtras: billingExtrasSlot, warnings: warningsForStep("billing", draft, shape, messages) }));
|
|
399
|
+
return (_jsx(BillingStep, { draft: draft, setDraft: setDraft, shape: shape, renderLeadContactPicker: props.renderLeadContactPicker, renderExtras: billingExtrasSlot, errors: validationErrorsForStep("billing", draft, messages), warnings: warningsForStep("billing", draft, shape, messages) }));
|
|
400
400
|
case "travelers":
|
|
401
|
-
return (_jsx(TravelersStep, { draft: draft, setDraft: setDraft, shape: shape, renderTravelerContactPicker: props.renderTravelerContactPicker, warnings: warningsForStep("travelers", draft, shape, messages) }));
|
|
401
|
+
return (_jsx(TravelersStep, { draft: draft, setDraft: setDraft, shape: shape, renderTravelerContactPicker: props.renderTravelerContactPicker, errors: validationErrorsForStep("travelers", draft, messages), warnings: warningsForStep("travelers", draft, shape, messages) }));
|
|
402
402
|
case "accommodation":
|
|
403
403
|
return _jsx(AccommodationStep, { draft: draft, setDraft: setDraft, shape: shape });
|
|
404
404
|
case "addons":
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { LeadContactPickerProps } from "../../types.js";
|
|
2
2
|
import { type StepCommonProps } from "./shared.js";
|
|
3
|
-
export declare function BillingStep({ draft, setDraft, renderLeadContactPicker, renderExtras, warnings, }: StepCommonProps & {
|
|
3
|
+
export declare function BillingStep({ draft, setDraft, renderLeadContactPicker, renderExtras, warnings, errors, }: StepCommonProps & {
|
|
4
4
|
renderLeadContactPicker?: (props: LeadContactPickerProps) => React.ReactNode;
|
|
5
5
|
renderExtras?: () => React.ReactNode;
|
|
6
6
|
warnings?: ReadonlyArray<string>;
|
|
7
|
+
errors?: ReadonlyArray<string>;
|
|
7
8
|
}): React.ReactElement;
|
|
8
9
|
//# sourceMappingURL=billing-step.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/billing-step.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"billing-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/billing-step.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAA;AAMpB,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,uBAAuB,EACvB,YAAY,EACZ,QAAQ,EACR,MAAM,GACP,EAAE,eAAe,GAAG;IACnB,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,KAAK,CAAC,SAAS,CAAA;IAC5E,YAAY,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAA;IACpC,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC/B,GAAG,KAAK,CAAC,YAAY,CA8OrB"}
|
|
@@ -7,13 +7,17 @@ import { Label } from "@voyant-travel/ui/components/label";
|
|
|
7
7
|
import { RadioGroup, RadioGroupItem } from "@voyant-travel/ui/components/radio-group";
|
|
8
8
|
import { useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
9
9
|
import { patchBilling, setBillingBuyerType } from "../../lib/draft-state.js";
|
|
10
|
-
import {
|
|
10
|
+
import { isValidOptionalEmail } from "../../lib/email-validation.js";
|
|
11
|
+
import { Field, JourneyErrors, JourneyWarnings, PhoneField, } from "./shared.js";
|
|
11
12
|
// ─────────────────────────────────────────────────────────────────
|
|
12
13
|
// Billing
|
|
13
14
|
// ─────────────────────────────────────────────────────────────────
|
|
14
|
-
export function BillingStep({ draft, setDraft, renderLeadContactPicker, renderExtras, warnings, }) {
|
|
15
|
+
export function BillingStep({ draft, setDraft, renderLeadContactPicker, renderExtras, warnings, errors, }) {
|
|
15
16
|
const messages = useBookingsUiMessagesOrDefault();
|
|
16
17
|
const billing = draft.billing;
|
|
18
|
+
const emailError = isValidOptionalEmail(billing.contact.email)
|
|
19
|
+
? undefined
|
|
20
|
+
: messages.bookingJourney.validation.invalidEmail;
|
|
17
21
|
// Merge each partial from the picker (person record, org record, address
|
|
18
22
|
// lookup) into the billing draft without clobbering the other slices.
|
|
19
23
|
const apply = (next) => {
|
|
@@ -50,7 +54,7 @@ export function BillingStep({ draft, setDraft, renderLeadContactPicker, renderEx
|
|
|
50
54
|
contact: { ...billing.contact, firstName: v },
|
|
51
55
|
})) }), _jsx(Field, { id: "bj-billing-lastName", label: messages.bookingJourney.billing.lastName, value: billing.contact.lastName, onChange: (v) => setDraft(patchBilling(draft, {
|
|
52
56
|
contact: { ...billing.contact, lastName: v },
|
|
53
|
-
})) }), _jsx(Field, { id: "bj-billing-email", label: messages.bookingJourney.billing.email, type: "email", value: billing.contact.email, onChange: (v) => setDraft(patchBilling(draft, {
|
|
57
|
+
})) }), _jsx(Field, { id: "bj-billing-email", label: messages.bookingJourney.billing.email, type: "email", value: billing.contact.email, error: emailError, onChange: (v) => setDraft(patchBilling(draft, {
|
|
54
58
|
contact: { ...billing.contact, email: v },
|
|
55
59
|
})) }), _jsx(PhoneField, { id: "bj-billing-phone", label: messages.bookingJourney.billing.phone, value: billing.contact.phone ?? "", onChange: (v) => setDraft(patchBilling(draft, {
|
|
56
60
|
contact: { ...billing.contact, phone: v },
|
|
@@ -74,5 +78,5 @@ export function BillingStep({ draft, setDraft, renderLeadContactPicker, renderEx
|
|
|
74
78
|
...(billing.company ?? { name: "" }),
|
|
75
79
|
vatId: v,
|
|
76
80
|
},
|
|
77
|
-
})) })] })) : null] })), renderExtras ? _jsx("div", { children: renderExtras() }) : null, _jsx(JourneyWarnings, { warnings: warnings })] })] }));
|
|
81
|
+
})) })] })) : null] })), renderExtras ? _jsx("div", { children: renderExtras() }) : null, _jsx(JourneyErrors, { errors: errors }), _jsx(JourneyWarnings, { warnings: warnings })] })] }));
|
|
78
82
|
}
|
|
@@ -22,13 +22,17 @@ export interface StepCommonProps {
|
|
|
22
22
|
export declare function JourneyWarnings({ warnings, }: {
|
|
23
23
|
warnings?: ReadonlyArray<string>;
|
|
24
24
|
}): React.ReactElement | null;
|
|
25
|
-
export declare function
|
|
25
|
+
export declare function JourneyErrors({ errors, }: {
|
|
26
|
+
errors?: ReadonlyArray<string>;
|
|
27
|
+
}): React.ReactElement | null;
|
|
28
|
+
export declare function Field({ id, label, value, onChange, type, placeholder, error, }: {
|
|
26
29
|
id: string;
|
|
27
30
|
label: string;
|
|
28
31
|
value: string;
|
|
29
32
|
onChange: (v: string) => void;
|
|
30
33
|
type?: string;
|
|
31
34
|
placeholder?: string;
|
|
35
|
+
error?: string;
|
|
32
36
|
}): React.ReactElement;
|
|
33
37
|
export declare function PhoneField({ id, label, value, onChange, }: {
|
|
34
38
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/shared.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6DAA6D,CAAA;AAYpG,OAAO,EAAiB,8BAA8B,EAAE,MAAM,wBAAwB,CAAA;AACtF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAE5E,kFAAkF;AAClF,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,KAAK,CAAC,SAAS,CAAA;AACpF,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAA;AAE5E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAA;IAIZ,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,CAAA;IAC1D,KAAK,EAAE,iBAAiB,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACjC,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAS5B;AAED,wBAAgB,KAAK,CAAC,EACpB,EAAE,EACF,KAAK,EACL,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,WAAW,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/shared.tsx"],"names":[],"mappings":"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"}
|
|
@@ -15,8 +15,14 @@ export function JourneyWarnings({ warnings, }) {
|
|
|
15
15
|
return null;
|
|
16
16
|
return (_jsx("ul", { className: "space-y-1 rounded-md border border-amber-300 bg-amber-50 p-3 text-amber-900 text-sm dark:border-amber-700 dark:bg-amber-950 dark:text-amber-100", children: warnings.map((w) => (_jsxs("li", { children: ["\u26A0 ", w] }, w))) }));
|
|
17
17
|
}
|
|
18
|
-
export function
|
|
19
|
-
|
|
18
|
+
export function JourneyErrors({ errors, }) {
|
|
19
|
+
if (!errors || errors.length === 0)
|
|
20
|
+
return null;
|
|
21
|
+
return (_jsx("ul", { className: "space-y-1 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-destructive text-sm", children: errors.map((error) => (_jsx("li", { children: error }, error))) }));
|
|
22
|
+
}
|
|
23
|
+
export function Field({ id, label, value, onChange, type, placeholder, error, }) {
|
|
24
|
+
const errorId = `${id}-error`;
|
|
25
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: id, children: label }), _jsx(Input, { id: id, type: type ?? "text", value: value, placeholder: placeholder, "aria-invalid": error ? true : undefined, "aria-describedby": error ? errorId : undefined, onChange: (e) => onChange(e.target.value) }), error ? (_jsx("p", { id: errorId, className: "text-destructive text-xs", role: "alert", children: error })) : null] }));
|
|
20
26
|
}
|
|
21
27
|
export function PhoneField({ id, label, value, onChange, }) {
|
|
22
28
|
return (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: id, children: label }), _jsx(PhoneInput, { id: id, defaultCountry: "GB", international: true, value: value || undefined, onChange: (v) => onChange(v ? String(v) : "") })] }));
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { TravelerContactPickerProps } from "../../types.js";
|
|
2
2
|
import { type StepCommonProps } from "./shared.js";
|
|
3
|
-
export declare function TravelersStep({ draft, setDraft, shape, renderTravelerContactPicker, warnings, }: StepCommonProps & {
|
|
3
|
+
export declare function TravelersStep({ draft, setDraft, shape, renderTravelerContactPicker, warnings, errors, }: StepCommonProps & {
|
|
4
4
|
renderTravelerContactPicker?: (props: TravelerContactPickerProps) => React.ReactNode;
|
|
5
5
|
warnings?: ReadonlyArray<string>;
|
|
6
|
+
errors?: ReadonlyArray<string>;
|
|
6
7
|
}): React.ReactElement;
|
|
7
8
|
//# sourceMappingURL=travelers-step.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"travelers-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/travelers-step.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"travelers-step.d.ts","sourceRoot":"","sources":["../../../../src/journey/components/journey-steps/travelers-step.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAEhE,OAAO,EASL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAA;AA+BpB,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,2BAA2B,EAC3B,QAAQ,EACR,MAAM,GACP,EAAE,eAAe,GAAG;IACnB,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,KAAK,CAAC,SAAS,CAAA;IACpF,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC/B,GAAG,KAAK,CAAC,YAAY,CAyGrB"}
|
|
@@ -7,8 +7,9 @@ import { Plus } from "lucide-react";
|
|
|
7
7
|
import { useEffect, useRef } from "react";
|
|
8
8
|
import { formatMessage, useBookingsUiMessagesOrDefault } from "../../../i18n/index.js";
|
|
9
9
|
import { canCopyBillingContactToTraveler, patchConfigure, setTravelers, totalPax, } from "../../lib/draft-state.js";
|
|
10
|
+
import { isValidOptionalEmail } from "../../lib/email-validation.js";
|
|
10
11
|
import { PaxDependencyWarnings, PaxValidation } from "./configure-steps.js";
|
|
11
|
-
import { computeAge, cryptoRowId, DateField, Field, JourneyWarnings, PhoneField, SelectField, } from "./shared.js";
|
|
12
|
+
import { computeAge, cryptoRowId, DateField, Field, JourneyErrors, JourneyWarnings, PhoneField, SelectField, } from "./shared.js";
|
|
12
13
|
/** Pax counts are DERIVED from the traveler rows — each row's band is the
|
|
13
14
|
* source of truth, so the quote always matches who's actually in the list. */
|
|
14
15
|
function paxFromTravelers(travelers, bands) {
|
|
@@ -24,7 +25,7 @@ function paxFromTravelers(travelers, bands) {
|
|
|
24
25
|
function applyTravelers(draft, next, bands) {
|
|
25
26
|
return patchConfigure(setTravelers(draft, next), { pax: paxFromTravelers(next, bands) });
|
|
26
27
|
}
|
|
27
|
-
export function TravelersStep({ draft, setDraft, shape, renderTravelerContactPicker, warnings, }) {
|
|
28
|
+
export function TravelersStep({ draft, setDraft, shape, renderTravelerContactPicker, warnings, errors, }) {
|
|
28
29
|
const messages = useBookingsUiMessagesOrDefault();
|
|
29
30
|
const travelers = draft.travelers;
|
|
30
31
|
const bands = shape.paxBands;
|
|
@@ -80,7 +81,7 @@ export function TravelersStep({ draft, setDraft, shape, renderTravelerContactPic
|
|
|
80
81
|
setDraft(applyTravelers(draft, next, bands));
|
|
81
82
|
};
|
|
82
83
|
return (_jsx(TravelerCard, { idx: idx, traveler: traveler, shape: shape, draft: draft, setDraft: setDraft, renderTravelerContactPicker: renderTravelerContactPicker, apply: apply, showBandSelect: hasBandChoice, onRemove: travelers.length > 1 ? () => removeTraveler(idx) : undefined }, traveler.rowId ?? idx));
|
|
83
|
-
}), _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: addTraveler, disabled: atMax, className: "w-full", children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), messages.bookingJourney.travelers.addTraveler] }), _jsx(PaxValidation, { draft: draft, shape: shape }), _jsx(PaxDependencyWarnings, { draft: draft, shape: shape }), _jsx(JourneyWarnings, { warnings: warnings })] })] }));
|
|
84
|
+
}), _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: addTraveler, disabled: atMax, className: "w-full", children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), messages.bookingJourney.travelers.addTraveler] }), _jsx(PaxValidation, { draft: draft, shape: shape }), _jsx(PaxDependencyWarnings, { draft: draft, shape: shape }), _jsx(JourneyErrors, { errors: errors }), _jsx(JourneyWarnings, { warnings: warnings })] })] }));
|
|
84
85
|
}
|
|
85
86
|
/**
|
|
86
87
|
* One traveler block — type (band) selector, name, optional contact, age, and
|
|
@@ -106,6 +107,9 @@ function TravelerCard({ idx, traveler, shape, draft, setDraft, renderTravelerCon
|
|
|
106
107
|
// documents) always show.
|
|
107
108
|
const showIdentity = !renderTravelerContactPicker;
|
|
108
109
|
const gridHasContent = showIdentity || Boolean(dobField) || dynamicFields.length > 0;
|
|
110
|
+
const emailError = isValidOptionalEmail(traveler.email)
|
|
111
|
+
? undefined
|
|
112
|
+
: messages.bookingJourney.validation.invalidEmail;
|
|
109
113
|
// Live age from DOB — surfaces in the header so the user gets feedback as
|
|
110
114
|
// they pick a date.
|
|
111
115
|
const computedAge = traveler.dateOfBirth ? computeAge(traveler.dateOfBirth) : null;
|
|
@@ -166,7 +170,7 @@ function TravelerCard({ idx, traveler, shape, draft, setDraft, renderTravelerCon
|
|
|
166
170
|
rowIndex: idx,
|
|
167
171
|
apply,
|
|
168
172
|
selectedPersonId: traveler.personId,
|
|
169
|
-
}) })) : null, gridHasContent ? (_jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [showIdentity ? (_jsxs(_Fragment, { children: [_jsx(Field, { id: `bj-trav-${idx}-first`, label: messages.bookingJourney.billing.firstName, value: traveler.firstName, onChange: (v) => patchRow({ firstName: v }) }), _jsx(Field, { id: `bj-trav-${idx}-last`, label: messages.bookingJourney.billing.lastName, value: traveler.lastName, onChange: (v) => patchRow({ lastName: v }) }), applicableFields.some((f) => f.key === "email") ? (_jsx(Field, { id: `bj-trav-${idx}-email`, label: messages.bookingJourney.billing.email, type: "email", value: traveler.email ?? "", onChange: (v) => patchRow({ email: v }) })) : null, phoneField ? (_jsx(PhoneField, { id: `bj-trav-${idx}-phone`,
|
|
173
|
+
}) })) : null, gridHasContent ? (_jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [showIdentity ? (_jsxs(_Fragment, { children: [_jsx(Field, { id: `bj-trav-${idx}-first`, label: messages.bookingJourney.billing.firstName, value: traveler.firstName, onChange: (v) => patchRow({ firstName: v }) }), _jsx(Field, { id: `bj-trav-${idx}-last`, label: messages.bookingJourney.billing.lastName, value: traveler.lastName, onChange: (v) => patchRow({ lastName: v }) }), applicableFields.some((f) => f.key === "email") ? (_jsx(Field, { id: `bj-trav-${idx}-email`, label: messages.bookingJourney.billing.email, type: "email", value: traveler.email ?? "", error: emailError, onChange: (v) => patchRow({ email: v }) })) : null, phoneField ? (_jsx(PhoneField, { id: `bj-trav-${idx}-phone`,
|
|
170
174
|
// i18n-literal-ok Required marker appended to a descriptor-supplied field label.
|
|
171
175
|
label: phoneField.label + (phoneField.required ? " *" : ""), value: traveler.phone ?? "", onChange: (v) => patchRow({ phone: v }) })) : null] })) : null, dobField ? (_jsxs("div", { className: "space-y-1", children: [_jsx(DateField, { id: `bj-trav-${idx}-dob`,
|
|
172
176
|
// i18n-literal-ok Required marker appended to a descriptor-supplied field label.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-validation.d.ts","sourceRoot":"","sources":["../../../src/journey/lib/email-validation.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE9E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyant-travel/bookings-react",
|
|
3
|
-
"version": "0.141.
|
|
3
|
+
"version": "0.141.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -146,16 +146,16 @@
|
|
|
146
146
|
"react-hook-form": "^7.80.0",
|
|
147
147
|
"zod": "^4.0.0",
|
|
148
148
|
"@voyant-travel/admin": "^0.116.0",
|
|
149
|
-
"@voyant-travel/bookings": "^0.141.
|
|
150
|
-
"@voyant-travel/catalog-react": "^0.139.0",
|
|
151
|
-
"@voyant-travel/distribution-react": "^0.131.0",
|
|
149
|
+
"@voyant-travel/bookings": "^0.141.2",
|
|
152
150
|
"@voyant-travel/relationships-react": "^0.141.0",
|
|
153
|
-
"@voyant-travel/finance-react": "^0.141.
|
|
151
|
+
"@voyant-travel/finance-react": "^0.141.1",
|
|
154
152
|
"@voyant-travel/identity-react": "^0.141.0",
|
|
155
153
|
"@voyant-travel/legal-react": "^0.141.0",
|
|
154
|
+
"@voyant-travel/distribution-react": "^0.131.0",
|
|
156
155
|
"@voyant-travel/commerce-react": "^0.23.0",
|
|
157
|
-
"@voyant-travel/inventory-react": "^0.23.0",
|
|
158
156
|
"@voyant-travel/ui": "^0.108.10",
|
|
157
|
+
"@voyant-travel/catalog-react": "^0.139.0",
|
|
158
|
+
"@voyant-travel/inventory-react": "^0.23.1",
|
|
159
159
|
"@voyant-travel/operations-react": "^0.22.0"
|
|
160
160
|
},
|
|
161
161
|
"peerDependenciesMeta": {
|
|
@@ -204,10 +204,10 @@
|
|
|
204
204
|
},
|
|
205
205
|
"dependencies": {
|
|
206
206
|
"sonner": "^2.0.7",
|
|
207
|
-
"@voyant-travel/catalog-contracts": "^0.108.1",
|
|
208
207
|
"@voyant-travel/i18n": "^0.110.0",
|
|
208
|
+
"@voyant-travel/types": "^0.107.0",
|
|
209
209
|
"@voyant-travel/react": "^0.104.1",
|
|
210
|
-
"@voyant-travel/
|
|
210
|
+
"@voyant-travel/catalog-contracts": "^0.108.2"
|
|
211
211
|
},
|
|
212
212
|
"devDependencies": {
|
|
213
213
|
"@tanstack/react-query": "^5.101.2",
|
|
@@ -223,18 +223,18 @@
|
|
|
223
223
|
"vitest": "^4.1.9",
|
|
224
224
|
"zod": "^4.4.3",
|
|
225
225
|
"@voyant-travel/admin": "^0.116.0",
|
|
226
|
-
"@voyant-travel/bookings": "^0.141.0",
|
|
227
226
|
"@voyant-travel/catalog-react": "^0.139.0",
|
|
228
227
|
"@voyant-travel/distribution-react": "^0.131.0",
|
|
229
|
-
"@voyant-travel/
|
|
230
|
-
"@voyant-travel/
|
|
228
|
+
"@voyant-travel/finance-react": "^0.141.1",
|
|
229
|
+
"@voyant-travel/bookings": "^0.141.2",
|
|
231
230
|
"@voyant-travel/identity-react": "^0.141.0",
|
|
232
231
|
"@voyant-travel/legal-react": "^0.141.0",
|
|
233
232
|
"@voyant-travel/commerce-react": "^0.23.0",
|
|
234
|
-
"@voyant-travel/inventory-react": "^0.23.
|
|
233
|
+
"@voyant-travel/inventory-react": "^0.23.1",
|
|
235
234
|
"@voyant-travel/react": "^0.104.1",
|
|
236
235
|
"@voyant-travel/ui": "^0.108.10",
|
|
237
236
|
"@voyant-travel/voyant-typescript-config": "^0.1.0",
|
|
237
|
+
"@voyant-travel/relationships-react": "^0.141.0",
|
|
238
238
|
"@voyant-travel/operations-react": "^0.22.0"
|
|
239
239
|
},
|
|
240
240
|
"files": [
|