@qite/tide-booking-component 1.4.2 → 1.4.5
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/.vs/ProjectSettings.json +3 -3
- package/.vs/VSWorkspaceState.json +5 -5
- package/README.md +8 -8
- package/build/build-cjs/booking-wizard/components/phone-input.d.ts +17 -0
- package/build/build-cjs/booking-wizard/features/booking/selectors.d.ts +41 -12
- package/build/build-cjs/booking-wizard/features/summary/summary-flight.d.ts +2 -2
- package/build/build-cjs/booking-wizard/features/travelers-form/controls/gender-control.d.ts +5 -0
- package/build/build-cjs/booking-wizard/features/travelers-form/travelers-form-util.d.ts +7 -0
- package/build/build-cjs/booking-wizard/features/travelers-form/validate-form.d.ts +2 -2
- package/build/build-cjs/booking-wizard/types.d.ts +13 -0
- package/build/build-cjs/index.js +458 -273
- package/build/build-cjs/shared/utils/localization-util.d.ts +3 -0
- package/build/build-esm/booking-wizard/components/phone-input.d.ts +17 -0
- package/build/build-esm/booking-wizard/features/booking/selectors.d.ts +41 -12
- package/build/build-esm/booking-wizard/features/summary/summary-flight.d.ts +2 -2
- package/build/build-esm/booking-wizard/features/travelers-form/controls/gender-control.d.ts +5 -0
- package/build/build-esm/booking-wizard/features/travelers-form/travelers-form-util.d.ts +7 -0
- package/build/build-esm/booking-wizard/features/travelers-form/validate-form.d.ts +2 -2
- package/build/build-esm/booking-wizard/types.d.ts +13 -0
- package/build/build-esm/index.js +460 -275
- package/build/build-esm/shared/utils/localization-util.d.ts +3 -0
- package/package.json +1 -1
- package/rollup.config.js +23 -23
- package/src/booking-product/components/age-select.tsx +35 -35
- package/src/booking-product/components/amount-input.tsx +78 -78
- package/src/booking-product/components/date-range-picker/calendar-day.tsx +58 -58
- package/src/booking-product/components/date-range-picker/calendar.tsx +178 -178
- package/src/booking-product/components/date-range-picker/index.tsx +196 -196
- package/src/booking-product/components/dates.tsx +136 -136
- package/src/booking-product/components/footer.tsx +69 -69
- package/src/booking-product/components/header.tsx +79 -79
- package/src/booking-product/components/icon.tsx +251 -251
- package/src/booking-product/components/rating.tsx +21 -21
- package/src/booking-product/components/rooms.tsx +199 -199
- package/src/booking-product/index.tsx +30 -30
- package/src/booking-product/settings-context.ts +14 -14
- package/src/booking-product/types.ts +28 -28
- package/src/booking-product/utils/api.ts +25 -25
- package/src/booking-product/utils/price.ts +28 -28
- package/src/booking-wizard/api-settings-slice.ts +24 -24
- package/src/booking-wizard/components/icon.tsx +508 -508
- package/src/booking-wizard/components/labeled-input.tsx +64 -64
- package/src/booking-wizard/components/labeled-select.tsx +69 -69
- package/src/booking-wizard/components/message.tsx +34 -34
- package/src/booking-wizard/components/multi-range-filter.tsx +113 -113
- package/src/booking-wizard/components/phone-input.tsx +181 -0
- package/src/booking-wizard/components/product-card.tsx +37 -37
- package/src/booking-wizard/components/step-indicator.tsx +51 -51
- package/src/booking-wizard/components/step-route.tsx +27 -27
- package/src/booking-wizard/declarations.d.ts +4 -4
- package/src/booking-wizard/features/booking/api.ts +49 -49
- package/src/booking-wizard/features/booking/booking-slice.ts +2 -0
- package/src/booking-wizard/features/booking/booking.tsx +28 -28
- package/src/booking-wizard/features/booking/constants.ts +16 -16
- package/src/booking-wizard/features/booking/selectors.ts +17 -14
- package/src/booking-wizard/features/error/error.tsx +78 -78
- package/src/booking-wizard/features/flight-options/flight-filter.tsx +432 -432
- package/src/booking-wizard/features/flight-options/flight-option-flight.tsx +385 -385
- package/src/booking-wizard/features/flight-options/flight-option-modal.tsx +229 -229
- package/src/booking-wizard/features/flight-options/flight-option.tsx +80 -80
- package/src/booking-wizard/features/flight-options/index.tsx +196 -196
- package/src/booking-wizard/features/price-details/price-details-api.ts +24 -24
- package/src/booking-wizard/features/price-details/price-details-slice.ts +178 -178
- package/src/booking-wizard/features/price-details/util.ts +155 -155
- package/src/booking-wizard/features/product-options/no-options.tsx +21 -21
- package/src/booking-wizard/features/product-options/none-option.tsx +121 -121
- package/src/booking-wizard/features/product-options/option-booking-airline-group.tsx +64 -64
- package/src/booking-wizard/features/product-options/option-booking-group.tsx +216 -216
- package/src/booking-wizard/features/product-options/option-item.tsx +321 -321
- package/src/booking-wizard/features/product-options/option-pax-card.tsx +201 -201
- package/src/booking-wizard/features/product-options/option-pax-group.tsx +175 -175
- package/src/booking-wizard/features/product-options/option-unit-group.tsx +198 -198
- package/src/booking-wizard/features/product-options/option-units-card.tsx +185 -185
- package/src/booking-wizard/features/room-options/index.tsx +187 -187
- package/src/booking-wizard/features/room-options/room-utils.ts +190 -190
- package/src/booking-wizard/features/room-options/room.tsx +161 -161
- package/src/booking-wizard/features/room-options/traveler-rooms.tsx +75 -75
- package/src/booking-wizard/features/sidebar/sidebar-flight.tsx +4 -2
- package/src/booking-wizard/features/sidebar/sidebar-util.ts +2 -0
- package/src/booking-wizard/features/summary/summary-booking-option-unit.tsx +25 -25
- package/src/booking-wizard/features/summary/summary-flight.tsx +7 -6
- package/src/booking-wizard/features/summary/summary-per-booking-option-group.tsx +69 -69
- package/src/booking-wizard/features/summary/summary-per-pax-option-group.tsx +63 -63
- package/src/booking-wizard/features/summary/summary-per-unit-option-group.tsx +66 -66
- package/src/booking-wizard/features/summary/summary-slice.ts +28 -28
- package/src/booking-wizard/features/summary/summary.tsx +91 -62
- package/src/booking-wizard/features/travelers-form/controls/gender-control.tsx +70 -0
- package/src/booking-wizard/features/travelers-form/travelers-form-util.ts +11 -0
- package/src/booking-wizard/features/travelers-form/travelers-form.tsx +451 -313
- package/src/booking-wizard/features/travelers-form/type-ahead-input.tsx +101 -101
- package/src/booking-wizard/features/travelers-form/validate-form.ts +84 -98
- package/src/booking-wizard/index.tsx +36 -36
- package/src/booking-wizard/store.ts +31 -31
- package/src/booking-wizard/types.ts +15 -0
- package/src/index.ts +4 -4
- package/src/shared/components/loader.tsx +16 -16
- package/src/shared/translations/en-GB.json +3 -0
- package/src/shared/translations/fr-BE.json +3 -0
- package/src/shared/translations/nl-BE.json +3 -0
- package/src/shared/types.ts +4 -4
- package/src/shared/utils/class-util.ts +9 -9
- package/src/shared/utils/localization-util.ts +62 -62
- package/src/shared/utils/query-string-util.ts +119 -119
- package/styles/booking-product-variables.scss +394 -394
- package/styles/booking-product.scss +446 -446
- package/styles/booking-wizard.scss +1 -0
- package/styles/components/_animations.scss +39 -39
- package/styles/components/_base.scss +107 -107
- package/styles/components/_button.scss +238 -238
- package/styles/components/_checkbox.scss +219 -219
- package/styles/components/_cta.scss +208 -208
- package/styles/components/_date-list.scss +41 -41
- package/styles/components/_date-range-picker.scss +225 -225
- package/styles/components/_decrement-increment.scss +35 -35
- package/styles/components/_flight-option.scss +1429 -1429
- package/styles/components/_info-message.scss +71 -71
- package/styles/components/_input.scss +25 -25
- package/styles/components/_list.scss +187 -187
- package/styles/components/_loader.scss +72 -72
- package/styles/components/_mixins.scss +550 -550
- package/styles/components/_phone-input.scss +8 -0
- package/styles/components/_placeholders.scss +166 -166
- package/styles/components/_pricing-summary.scss +155 -155
- package/styles/components/_qsm.scss +17 -17
- package/styles/components/_radiobutton.scss +170 -170
- package/styles/components/_select-wrapper.scss +80 -80
- package/styles/components/_spinner.scss +29 -29
- package/styles/components/_table.scss +81 -81
- package/styles/components/_tree.scss +530 -530
- package/styles/components/_typeahead.scss +281 -281
- package/styles/components/_variables.scss +89 -89
- package/tsconfig.json +24 -24
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
interface LoaderProps {
|
|
4
|
-
loaderText?: string;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
const Loader: React.FC<LoaderProps> = ({ loaderText }) => {
|
|
8
|
-
return (
|
|
9
|
-
<div className="loader">
|
|
10
|
-
<div className="loader__spinner"></div>
|
|
11
|
-
{loaderText && <p className="loader__text">{loaderText}</p>}
|
|
12
|
-
</div>
|
|
13
|
-
);
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export default Loader;
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
interface LoaderProps {
|
|
4
|
+
loaderText?: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const Loader: React.FC<LoaderProps> = ({ loaderText }) => {
|
|
8
|
+
return (
|
|
9
|
+
<div className="loader">
|
|
10
|
+
<div className="loader__spinner"></div>
|
|
11
|
+
{loaderText && <p className="loader__text">{loaderText}</p>}
|
|
12
|
+
</div>
|
|
13
|
+
);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default Loader;
|
|
@@ -163,8 +163,11 @@
|
|
|
163
163
|
"CHOOSE_AGENT_PLACEHOLDER": "Choose your travel agent",
|
|
164
164
|
"VALIDATION": {
|
|
165
165
|
"TRAVELER_X_FIELD": "Room {0} - Traveler {1}: {2}",
|
|
166
|
+
"SINGLE_ROOM_TRAVELER_X_FIELD": "Traveler {0}: {1}",
|
|
166
167
|
"TRAVELER_X_IS_NO_ADULT": "Room {0} - Traveler {1}: is not an adult",
|
|
168
|
+
"SINGLE_ROOM_TRAVELER_X_IS_NO_ADULT": "Traveler {0}: is not an adult",
|
|
167
169
|
"TRAVELER_X_IS_NO_CHILD": "Room {0} - Traveler {1}: is not a child",
|
|
170
|
+
"SINGLE_ROOM_TRAVELER_X_IS_NO_CHILD": "Traveler {0}: is not a child",
|
|
168
171
|
"NO_MAIN_BOOKER_SELECTED": "No main booker has been selected",
|
|
169
172
|
"MAIN_BOOKER_FIELD": "Main booker: {0}",
|
|
170
173
|
"MAIN_BOOKER_EMAIL_IS_INVALID": "Main booker: email is invalid",
|
|
@@ -163,8 +163,11 @@
|
|
|
163
163
|
"CHOOSE_AGENT_PLACEHOLDER": "Choisissez votre agent de voyage",
|
|
164
164
|
"VALIDATION": {
|
|
165
165
|
"TRAVELER_X_FIELD": "Chambre {0} - Voyageur {1} : {2}",
|
|
166
|
+
"SINGLE_ROOM_TRAVELER_X_FIELD": "Voyageur {0} : {1}",
|
|
166
167
|
"TRAVELER_X_IS_NO_ADULT": "Chambre {0} - Voyageur {1} : n'est pas un adulte",
|
|
168
|
+
"SINGLE_ROOM_TRAVELER_X_IS_NO_ADULT": "Voyageur {0} : n'est pas un adulte",
|
|
167
169
|
"TRAVELER_X_IS_NO_CHILD": "Chambre {0} - Voyageur {1} : n'est pas un enfant",
|
|
170
|
+
"SINGLE_ROOM_TRAVELER_X_IS_NO_CHILD": "Voyageur {0} : n'est pas un enfant",
|
|
168
171
|
"NO_MAIN_BOOKER_SELECTED": "Aucun réservant principal n'a été sélectionné",
|
|
169
172
|
"MAIN_BOOKER_FIELD": "Principal réservant : {0}",
|
|
170
173
|
"MAIN_BOOKER_EMAIL_IS_INVALID": "Principal réservant : e-mail invalide",
|
|
@@ -163,8 +163,11 @@
|
|
|
163
163
|
"CHOOSE_AGENT_PLACEHOLDER": "Kies uw reisagent",
|
|
164
164
|
"VALIDATION": {
|
|
165
165
|
"TRAVELER_X_FIELD": "Kamer {0} - Reiziger {1}: {2}",
|
|
166
|
+
"SINGLE_ROOM_TRAVELER_X_FIELD": "Reiziger {0}: {1}",
|
|
166
167
|
"TRAVELER_X_IS_NO_ADULT": "Kamer {0} - Reiziger {1}: is geen volwassene",
|
|
168
|
+
"SINGLE_ROOM_TRAVELER_X_IS_NO_ADULT": "Reiziger {0}: is geen volwassene",
|
|
167
169
|
"TRAVELER_X_IS_NO_CHILD": "Kamer {0} - Reiziger {1}: is geen kind",
|
|
170
|
+
"SINGLE_ROOM_TRAVELER_X_IS_NO_CHILD": "Reiziger {0}: is geen kind",
|
|
168
171
|
"NO_MAIN_BOOKER_SELECTED": "Er werd geen hoofdboeker geselecteerd",
|
|
169
172
|
"MAIN_BOOKER_FIELD": "Hoofdboeker: {0}",
|
|
170
173
|
"MAIN_BOOKER_EMAIL_IS_INVALID": "Hoofdboeker: e-mail is ongeldig",
|
package/src/shared/types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export interface ApiSettingsState {
|
|
2
|
-
apiUrl: string;
|
|
3
|
-
apiKey: string;
|
|
4
|
-
}
|
|
1
|
+
export interface ApiSettingsState {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
apiKey: string;
|
|
4
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { compact } from "lodash";
|
|
2
|
-
|
|
3
|
-
export const buildClassName = (parts: any[]): string => {
|
|
4
|
-
const sanitizedParts = parts
|
|
5
|
-
.filter((part) => typeof part === "string")
|
|
6
|
-
.map((part: string) => part.trim());
|
|
7
|
-
|
|
8
|
-
return compact(sanitizedParts).join(" ");
|
|
9
|
-
};
|
|
1
|
+
import { compact } from "lodash";
|
|
2
|
+
|
|
3
|
+
export const buildClassName = (parts: any[]): string => {
|
|
4
|
+
const sanitizedParts = parts
|
|
5
|
+
.filter((part) => typeof part === "string")
|
|
6
|
+
.map((part: string) => part.trim());
|
|
7
|
+
|
|
8
|
+
return compact(sanitizedParts).join(" ");
|
|
9
|
+
};
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import { enGB, fr, nlBE } from "date-fns/locale";
|
|
2
|
-
|
|
3
|
-
export const languages = ["nl-BE", "fr-BE", "en-GB"];
|
|
4
|
-
export const defaultLanguage = "nl-BE";
|
|
5
|
-
|
|
6
|
-
export const formatPrice = (price: number, currencyCode: string, locale: string = "nl-BE") => {
|
|
7
|
-
const priceFormat = Intl.NumberFormat(locale, {
|
|
8
|
-
style: "currency",
|
|
9
|
-
currency: currencyCode ? currencyCode : "EUR",
|
|
10
|
-
minimumFractionDigits: 2,
|
|
11
|
-
useGrouping: true,
|
|
12
|
-
});
|
|
13
|
-
return priceFormat.format(price);
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
import frJson from "../translations/fr-BE.json";
|
|
17
|
-
import nlJson from "../translations/nl-BE.json";
|
|
18
|
-
import enJson from "../translations/en-GB.json";
|
|
19
|
-
|
|
20
|
-
export const getTranslations = (language: string) => {
|
|
21
|
-
switch (language) {
|
|
22
|
-
case "nl-BE":
|
|
23
|
-
return nlJson;
|
|
24
|
-
case "fr-BE":
|
|
25
|
-
return frJson;
|
|
26
|
-
case "en-GB":
|
|
27
|
-
return enJson;
|
|
28
|
-
default:
|
|
29
|
-
throw new Error(`The language '${language}' is not yet supported.`);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
export const locales = {
|
|
34
|
-
"nl-BE": nlBE,
|
|
35
|
-
"fr-BE": fr,
|
|
36
|
-
"en-GB": enGB,
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export function getLocale(code: string) {
|
|
40
|
-
switch (code) {
|
|
41
|
-
case "nl-BE":
|
|
42
|
-
return locales[code];
|
|
43
|
-
case "fr-BE":
|
|
44
|
-
return locales[code];
|
|
45
|
-
case "en-GB":
|
|
46
|
-
return locales[code];
|
|
47
|
-
default:
|
|
48
|
-
return locales["nl-BE"];
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export const getPriceDifferenceText = (price: number, currencyCode: string) => {
|
|
53
|
-
return price > 0
|
|
54
|
-
? `+ ${formatPrice(Math.abs(price), currencyCode)}`
|
|
55
|
-
: `- ${formatPrice(Math.abs(price), currencyCode)}`;
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
export function format(text: string, args: any[]) {
|
|
59
|
-
return text.replace(/{([0-9]+)}/g, function (match, index) {
|
|
60
|
-
return typeof args[index] == "undefined" ? match : args[index];
|
|
61
|
-
});
|
|
62
|
-
}
|
|
1
|
+
import { enGB, fr, nlBE } from "date-fns/locale";
|
|
2
|
+
|
|
3
|
+
export const languages = ["nl-BE", "fr-BE", "en-GB"];
|
|
4
|
+
export const defaultLanguage = "nl-BE";
|
|
5
|
+
|
|
6
|
+
export const formatPrice = (price: number, currencyCode: string, locale: string = "nl-BE") => {
|
|
7
|
+
const priceFormat = Intl.NumberFormat(locale, {
|
|
8
|
+
style: "currency",
|
|
9
|
+
currency: currencyCode ? currencyCode : "EUR",
|
|
10
|
+
minimumFractionDigits: 2,
|
|
11
|
+
useGrouping: true,
|
|
12
|
+
});
|
|
13
|
+
return priceFormat.format(price);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
import frJson from "../translations/fr-BE.json";
|
|
17
|
+
import nlJson from "../translations/nl-BE.json";
|
|
18
|
+
import enJson from "../translations/en-GB.json";
|
|
19
|
+
|
|
20
|
+
export const getTranslations = (language: string) => {
|
|
21
|
+
switch (language) {
|
|
22
|
+
case "nl-BE":
|
|
23
|
+
return nlJson;
|
|
24
|
+
case "fr-BE":
|
|
25
|
+
return frJson;
|
|
26
|
+
case "en-GB":
|
|
27
|
+
return enJson;
|
|
28
|
+
default:
|
|
29
|
+
throw new Error(`The language '${language}' is not yet supported.`);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const locales = {
|
|
34
|
+
"nl-BE": nlBE,
|
|
35
|
+
"fr-BE": fr,
|
|
36
|
+
"en-GB": enGB,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export function getLocale(code: string) {
|
|
40
|
+
switch (code) {
|
|
41
|
+
case "nl-BE":
|
|
42
|
+
return locales[code];
|
|
43
|
+
case "fr-BE":
|
|
44
|
+
return locales[code];
|
|
45
|
+
case "en-GB":
|
|
46
|
+
return locales[code];
|
|
47
|
+
default:
|
|
48
|
+
return locales["nl-BE"];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const getPriceDifferenceText = (price: number, currencyCode: string) => {
|
|
53
|
+
return price > 0
|
|
54
|
+
? `+ ${formatPrice(Math.abs(price), currencyCode)}`
|
|
55
|
+
: `- ${formatPrice(Math.abs(price), currencyCode)}`;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export function format(text: string, args: any[]) {
|
|
59
|
+
return text.replace(/{([0-9]+)}/g, function (match, index) {
|
|
60
|
+
return typeof args[index] == "undefined" ? match : args[index];
|
|
61
|
+
});
|
|
62
|
+
}
|
|
@@ -1,119 +1,119 @@
|
|
|
1
|
-
import JsonURL from "@jsonurl/jsonurl";
|
|
2
|
-
import { isArray, isNil } from "lodash";
|
|
3
|
-
import { FlightInfo, Room } from "../../booking-wizard/types";
|
|
4
|
-
|
|
5
|
-
export const getDateFromParams = (
|
|
6
|
-
params: URLSearchParams,
|
|
7
|
-
name: string
|
|
8
|
-
): string | null => {
|
|
9
|
-
const dateString = params.get(name);
|
|
10
|
-
|
|
11
|
-
if (dateString === null) {
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const year = parseInt(dateString.slice(0, 5));
|
|
16
|
-
const month = parseInt(dateString.slice(5, 7));
|
|
17
|
-
const date = parseInt(dateString.slice(8, 10));
|
|
18
|
-
|
|
19
|
-
return new Date(Date.UTC(year, month - 1, date)).toISOString();
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export const getDateAsDateFromParams = (
|
|
23
|
-
params: URLSearchParams,
|
|
24
|
-
name: string
|
|
25
|
-
): Date | null => {
|
|
26
|
-
const dateString = params.get(name);
|
|
27
|
-
|
|
28
|
-
if (dateString === null) {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const year = parseInt(dateString.slice(0, 5));
|
|
33
|
-
const month = parseInt(dateString.slice(5, 7));
|
|
34
|
-
const date = parseInt(dateString.slice(8, 10));
|
|
35
|
-
|
|
36
|
-
return new Date(Date.UTC(year, month - 1, date));
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export const getNumberFromParams = (
|
|
40
|
-
params: URLSearchParams,
|
|
41
|
-
name: string
|
|
42
|
-
): number | null => {
|
|
43
|
-
const numberString = params.get(name);
|
|
44
|
-
|
|
45
|
-
if (numberString === null) {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return parseInt(numberString);
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
export const getRoomsFromParams = (
|
|
53
|
-
params: URLSearchParams,
|
|
54
|
-
name: string
|
|
55
|
-
): Room[] | null => {
|
|
56
|
-
const roomString = params.get(name);
|
|
57
|
-
|
|
58
|
-
if (roomString === null) {
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Encode the accommodation code in the room string because (external) acco codes can contain special characters like '='. eg: 'ACNYNEgUzMDc4NBoKMTAzODcwMjk4NQ=='
|
|
63
|
-
const safeRoomsString = roomString.replace(
|
|
64
|
-
/accommodationCode:([^,]*)/,
|
|
65
|
-
(match, code) => {
|
|
66
|
-
return `accommodationCode:${encodeURIComponent(code)}`;
|
|
67
|
-
}
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
const rooms = JsonURL.parse(safeRoomsString) as Room[] | undefined;
|
|
71
|
-
|
|
72
|
-
if (isNil(rooms)) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return rooms.map((room) => {
|
|
77
|
-
if (!isArray(room.childAges)) room.childAges = [];
|
|
78
|
-
room.children = room.childAges.length ?? 0;
|
|
79
|
-
return room;
|
|
80
|
-
});
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
export const getFlightsFromParams = (
|
|
84
|
-
params: URLSearchParams,
|
|
85
|
-
name: string
|
|
86
|
-
): FlightInfo | null => {
|
|
87
|
-
let flightString = params.get(name);
|
|
88
|
-
|
|
89
|
-
if (flightString === null) {
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
flightString = flightString.replace(/ /g, "%20");
|
|
94
|
-
|
|
95
|
-
const flightInfo = JsonURL.parse(flightString, { AQF: true }) as
|
|
96
|
-
| FlightInfo
|
|
97
|
-
| undefined;
|
|
98
|
-
|
|
99
|
-
if (isNil(flightInfo)) {
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return flightInfo;
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
export const getStringFromParams = (
|
|
107
|
-
params: URLSearchParams,
|
|
108
|
-
name: string
|
|
109
|
-
): string | null => {
|
|
110
|
-
return params.get(name);
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
export const getNumbersFromParams = (
|
|
114
|
-
params: URLSearchParams,
|
|
115
|
-
name: string
|
|
116
|
-
): number[] => {
|
|
117
|
-
const numberStrings = params.getAll(name);
|
|
118
|
-
return numberStrings.map((x) => parseInt(x));
|
|
119
|
-
};
|
|
1
|
+
import JsonURL from "@jsonurl/jsonurl";
|
|
2
|
+
import { isArray, isNil } from "lodash";
|
|
3
|
+
import { FlightInfo, Room } from "../../booking-wizard/types";
|
|
4
|
+
|
|
5
|
+
export const getDateFromParams = (
|
|
6
|
+
params: URLSearchParams,
|
|
7
|
+
name: string
|
|
8
|
+
): string | null => {
|
|
9
|
+
const dateString = params.get(name);
|
|
10
|
+
|
|
11
|
+
if (dateString === null) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const year = parseInt(dateString.slice(0, 5));
|
|
16
|
+
const month = parseInt(dateString.slice(5, 7));
|
|
17
|
+
const date = parseInt(dateString.slice(8, 10));
|
|
18
|
+
|
|
19
|
+
return new Date(Date.UTC(year, month - 1, date)).toISOString();
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const getDateAsDateFromParams = (
|
|
23
|
+
params: URLSearchParams,
|
|
24
|
+
name: string
|
|
25
|
+
): Date | null => {
|
|
26
|
+
const dateString = params.get(name);
|
|
27
|
+
|
|
28
|
+
if (dateString === null) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const year = parseInt(dateString.slice(0, 5));
|
|
33
|
+
const month = parseInt(dateString.slice(5, 7));
|
|
34
|
+
const date = parseInt(dateString.slice(8, 10));
|
|
35
|
+
|
|
36
|
+
return new Date(Date.UTC(year, month - 1, date));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const getNumberFromParams = (
|
|
40
|
+
params: URLSearchParams,
|
|
41
|
+
name: string
|
|
42
|
+
): number | null => {
|
|
43
|
+
const numberString = params.get(name);
|
|
44
|
+
|
|
45
|
+
if (numberString === null) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return parseInt(numberString);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const getRoomsFromParams = (
|
|
53
|
+
params: URLSearchParams,
|
|
54
|
+
name: string
|
|
55
|
+
): Room[] | null => {
|
|
56
|
+
const roomString = params.get(name);
|
|
57
|
+
|
|
58
|
+
if (roomString === null) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Encode the accommodation code in the room string because (external) acco codes can contain special characters like '='. eg: 'ACNYNEgUzMDc4NBoKMTAzODcwMjk4NQ=='
|
|
63
|
+
const safeRoomsString = roomString.replace(
|
|
64
|
+
/accommodationCode:([^,]*)/,
|
|
65
|
+
(match, code) => {
|
|
66
|
+
return `accommodationCode:${encodeURIComponent(code)}`;
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
const rooms = JsonURL.parse(safeRoomsString) as Room[] | undefined;
|
|
71
|
+
|
|
72
|
+
if (isNil(rooms)) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return rooms.map((room) => {
|
|
77
|
+
if (!isArray(room.childAges)) room.childAges = [];
|
|
78
|
+
room.children = room.childAges.length ?? 0;
|
|
79
|
+
return room;
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const getFlightsFromParams = (
|
|
84
|
+
params: URLSearchParams,
|
|
85
|
+
name: string
|
|
86
|
+
): FlightInfo | null => {
|
|
87
|
+
let flightString = params.get(name);
|
|
88
|
+
|
|
89
|
+
if (flightString === null) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
flightString = flightString.replace(/ /g, "%20");
|
|
94
|
+
|
|
95
|
+
const flightInfo = JsonURL.parse(flightString, { AQF: true }) as
|
|
96
|
+
| FlightInfo
|
|
97
|
+
| undefined;
|
|
98
|
+
|
|
99
|
+
if (isNil(flightInfo)) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return flightInfo;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export const getStringFromParams = (
|
|
107
|
+
params: URLSearchParams,
|
|
108
|
+
name: string
|
|
109
|
+
): string | null => {
|
|
110
|
+
return params.get(name);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export const getNumbersFromParams = (
|
|
114
|
+
params: URLSearchParams,
|
|
115
|
+
name: string
|
|
116
|
+
): number[] => {
|
|
117
|
+
const numberStrings = params.getAll(name);
|
|
118
|
+
return numberStrings.map((x) => parseInt(x));
|
|
119
|
+
};
|