@qite/tide-booking-component 1.4.93 → 1.4.95

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.
Files changed (181) hide show
  1. package/.prettierrc +9 -9
  2. package/.vs/ProjectSettings.json +3 -3
  3. package/.vs/VSWorkspaceState.json +5 -5
  4. package/build/build-cjs/index.js +81 -27
  5. package/build/build-cjs/src/booking-wizard/features/booking/booking-slice.d.ts +2 -1
  6. package/build/build-cjs/src/booking-wizard/features/booking/selectors.d.ts +4 -3
  7. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-slice.d.ts +1 -0
  8. package/build/build-cjs/src/booking-wizard/features/price-details/selectors.d.ts +1 -0
  9. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar.d.ts +1 -0
  10. package/build/build-cjs/src/booking-wizard/types.d.ts +1 -0
  11. package/build/build-cjs/src/shared/utils/localization-util.d.ts +1 -0
  12. package/build/build-esm/index.js +81 -27
  13. package/build/build-esm/src/booking-wizard/features/booking/booking-slice.d.ts +2 -1
  14. package/build/build-esm/src/booking-wizard/features/booking/selectors.d.ts +4 -3
  15. package/build/build-esm/src/booking-wizard/features/price-details/price-details-slice.d.ts +1 -0
  16. package/build/build-esm/src/booking-wizard/features/price-details/selectors.d.ts +1 -0
  17. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar.d.ts +1 -0
  18. package/build/build-esm/src/booking-wizard/types.d.ts +1 -0
  19. package/build/build-esm/src/shared/utils/localization-util.d.ts +1 -0
  20. package/package.json +83 -83
  21. package/src/booking-product/components/age-select.tsx +35 -35
  22. package/src/booking-product/components/amount-input.tsx +51 -51
  23. package/src/booking-product/components/date-range-picker/calendar.tsx +155 -155
  24. package/src/booking-product/components/footer.tsx +54 -54
  25. package/src/booking-product/components/header.tsx +57 -57
  26. package/src/booking-product/components/icon.tsx +200 -200
  27. package/src/booking-product/components/list-view.tsx +54 -54
  28. package/src/booking-product/components/rating.tsx +21 -21
  29. package/src/booking-product/components/rooms.tsx +171 -171
  30. package/src/booking-product/constants.ts +1 -1
  31. package/src/booking-product/index.tsx +21 -21
  32. package/src/booking-product/settings-context.ts +16 -16
  33. package/src/booking-product/types.ts +30 -30
  34. package/src/booking-product/utils/api.ts +26 -26
  35. package/src/booking-product/utils/price.ts +28 -28
  36. package/src/booking-wizard/api-settings-slice.ts +24 -24
  37. package/src/booking-wizard/components/icon.tsx +398 -398
  38. package/src/booking-wizard/components/labeled-input.tsx +56 -56
  39. package/src/booking-wizard/components/labeled-select.tsx +54 -54
  40. package/src/booking-wizard/components/message.tsx +21 -21
  41. package/src/booking-wizard/components/multi-range-filter.tsx +99 -99
  42. package/src/booking-wizard/components/phone-input.tsx +146 -146
  43. package/src/booking-wizard/components/print-offer-button.tsx +53 -53
  44. package/src/booking-wizard/components/product-card.tsx +23 -23
  45. package/src/booking-wizard/declarations.d.ts +4 -4
  46. package/src/booking-wizard/features/booking/booking-self-contained.tsx +16 -1
  47. package/src/booking-wizard/features/booking/booking-slice.ts +9 -1
  48. package/src/booking-wizard/features/booking/booking.tsx +16 -1
  49. package/src/booking-wizard/features/booking/selectors.ts +5 -0
  50. package/src/booking-wizard/features/flight-options/flight-filter.tsx +371 -371
  51. package/src/booking-wizard/features/flight-options/flight-option-flight.tsx +354 -354
  52. package/src/booking-wizard/features/flight-options/flight-option-modal.tsx +211 -211
  53. package/src/booking-wizard/features/flight-options/flight-option.tsx +57 -57
  54. package/src/booking-wizard/features/flight-options/flight-utils.ts +423 -423
  55. package/src/booking-wizard/features/price-details/price-details-api.ts +20 -20
  56. package/src/booking-wizard/features/price-details/price-details-slice.ts +2 -0
  57. package/src/booking-wizard/features/price-details/selectors.ts +1 -0
  58. package/src/booking-wizard/features/price-details/util.ts +115 -115
  59. package/src/booking-wizard/features/product-options/no-options.tsx +18 -18
  60. package/src/booking-wizard/features/product-options/none-option.tsx +73 -73
  61. package/src/booking-wizard/features/product-options/option-booking-airline-group.tsx +53 -53
  62. package/src/booking-wizard/features/product-options/option-booking-group.tsx +152 -152
  63. package/src/booking-wizard/features/product-options/option-item.tsx +236 -236
  64. package/src/booking-wizard/features/product-options/option-pax-card.tsx +159 -159
  65. package/src/booking-wizard/features/product-options/option-pax-group.tsx +122 -122
  66. package/src/booking-wizard/features/product-options/option-room.tsx +226 -226
  67. package/src/booking-wizard/features/product-options/option-unit-group.tsx +138 -138
  68. package/src/booking-wizard/features/room-options/room-utils.ts +154 -154
  69. package/src/booking-wizard/features/room-options/room.tsx +123 -123
  70. package/src/booking-wizard/features/room-options/traveler-rooms.tsx +64 -64
  71. package/src/booking-wizard/features/sidebar/index.tsx +2 -0
  72. package/src/booking-wizard/features/sidebar/sidebar-flight.tsx +66 -66
  73. package/src/booking-wizard/features/sidebar/sidebar.tsx +17 -1
  74. package/src/booking-wizard/features/summary/summary-booking-option-pax.tsx +23 -23
  75. package/src/booking-wizard/features/summary/summary-booking-option-unit.tsx +23 -23
  76. package/src/booking-wizard/features/summary/summary-flight.tsx +36 -36
  77. package/src/booking-wizard/features/summary/summary-per-booking-option-group.tsx +60 -60
  78. package/src/booking-wizard/features/summary/summary-per-pax-option-group.tsx +56 -56
  79. package/src/booking-wizard/features/summary/summary-per-unit-option-group.tsx +58 -58
  80. package/src/booking-wizard/features/summary/summary-slice.ts +27 -27
  81. package/src/booking-wizard/features/travelers-form/travelers-form-slice.ts +157 -157
  82. package/src/booking-wizard/features/travelers-form/travelers-form-util.ts +10 -10
  83. package/src/booking-wizard/features/travelers-form/type-ahead-input.tsx +85 -85
  84. package/src/booking-wizard/features/travelers-form/validate-form.ts +178 -178
  85. package/src/booking-wizard/index.tsx +27 -27
  86. package/src/booking-wizard/store.ts +26 -26
  87. package/src/booking-wizard/types.ts +1 -0
  88. package/src/booking-wizard/use-offer-printer.ts +108 -108
  89. package/src/content/components/LanguageSwitcher.tsx +158 -158
  90. package/src/content/components/accordion.tsx +30 -30
  91. package/src/content/components/contact.tsx +211 -211
  92. package/src/content/components/personal-contact-form.tsx +809 -809
  93. package/src/content/header/index.tsx +43 -43
  94. package/src/content/header/types.ts +26 -26
  95. package/src/qsm/components/date-picker/index.tsx +152 -152
  96. package/src/qsm/components/date-range-picker/calendar-day.tsx +49 -49
  97. package/src/qsm/components/date-range-picker/calendar.tsx +211 -211
  98. package/src/qsm/components/date-range-picker/index.tsx +404 -404
  99. package/src/qsm/index.tsx +26 -26
  100. package/src/qsm/store/qsm-store.ts +13 -13
  101. package/src/search-results/components/flight/flight-card.tsx +38 -38
  102. package/src/search-results/components/flight/flight-leg.tsx +61 -61
  103. package/src/search-results/components/flight/flight-path.tsx +23 -23
  104. package/src/search-results/components/multi-range-filter.tsx +104 -104
  105. package/src/search-results/components/search-results-container/search-results-container.tsx +2 -2
  106. package/src/search-results/index.tsx +24 -24
  107. package/src/search-results/search-results-configuration-context.ts +6 -6
  108. package/src/search-results/store/search-results-store.ts +13 -13
  109. package/src/shared/components/loader.tsx +16 -16
  110. package/src/shared/translations/ar-SA.json +2 -1
  111. package/src/shared/translations/da-DK.json +2 -1
  112. package/src/shared/translations/de-DE.json +2 -1
  113. package/src/shared/translations/en-GB.json +2 -1
  114. package/src/shared/translations/es-ES.json +2 -1
  115. package/src/shared/translations/fr-BE.json +2 -1
  116. package/src/shared/translations/fr-FR.json +2 -1
  117. package/src/shared/translations/is-IS.json +2 -1
  118. package/src/shared/translations/it-IT.json +2 -1
  119. package/src/shared/translations/ja-JP.json +2 -1
  120. package/src/shared/translations/nl-BE.json +2 -1
  121. package/src/shared/translations/nl-NL.json +2 -1
  122. package/src/shared/translations/no-NO.json +2 -1
  123. package/src/shared/translations/pl-PL.json +2 -1
  124. package/src/shared/translations/pt-PT.json +2 -1
  125. package/src/shared/translations/sv-SE.json +2 -1
  126. package/src/shared/utils/class-util.ts +7 -7
  127. package/src/shared/utils/query-string-util.ts +91 -91
  128. package/src/shared/utils/tide-api-utils.ts +34 -34
  129. package/src/shared/utils/use-media-query-util.ts +19 -19
  130. package/styles/abstracts/_mixins.scss +74 -74
  131. package/styles/abstracts/_variables.scss +57 -57
  132. package/styles/base/_fonts.scss +2 -2
  133. package/styles/base/_normalize.scss +227 -227
  134. package/styles/base/_typography.scss +35 -35
  135. package/styles/booking-joker-variables.scss +596 -596
  136. package/styles/booking-product-variables.scss +330 -330
  137. package/styles/booking-product.scss +438 -438
  138. package/styles/booking-qsm-variables.scss +501 -501
  139. package/styles/booking-qsm.scss +52 -52
  140. package/styles/booking-wizard-variables.scss +603 -603
  141. package/styles/booking-wizard.scss +61 -61
  142. package/styles/components/_accordion.scss +67 -67
  143. package/styles/components/_animations.scss +39 -39
  144. package/styles/components/_base.scss +107 -107
  145. package/styles/components/_breadcrumb.scss +92 -92
  146. package/styles/components/_button.scss +238 -238
  147. package/styles/components/_checkbox.scss +230 -230
  148. package/styles/components/_contact.scss +239 -239
  149. package/styles/components/_cta.scss +238 -238
  150. package/styles/components/_date-list.scss +41 -41
  151. package/styles/components/_date-range-picker.scss +223 -223
  152. package/styles/components/_decrement-increment.scss +35 -35
  153. package/styles/components/_dropdown.scss +72 -72
  154. package/styles/components/_faq.scss +27 -27
  155. package/styles/components/_flight-option.scss +1419 -1419
  156. package/styles/components/_gallery.scss +314 -314
  157. package/styles/components/_header.scss +113 -113
  158. package/styles/components/_img-slider.scss +175 -175
  159. package/styles/components/_info-message.scss +75 -75
  160. package/styles/components/_input.scss +35 -35
  161. package/styles/components/_list.scss +185 -185
  162. package/styles/components/_loader.scss +70 -70
  163. package/styles/components/_mixins.scss +579 -579
  164. package/styles/components/_passenger-picker.scss +306 -306
  165. package/styles/components/_phone-input.scss +8 -8
  166. package/styles/components/_placeholders.scss +165 -165
  167. package/styles/components/_qsm.scss +17 -17
  168. package/styles/components/_radiobutton.scss +170 -170
  169. package/styles/components/_select-wrapper.scss +76 -76
  170. package/styles/components/_slider.scss +128 -128
  171. package/styles/components/_spinner.scss +29 -29
  172. package/styles/components/_step-indicators.scss +161 -161
  173. package/styles/components/_table.scss +81 -81
  174. package/styles/components/_typeahead.scss +275 -275
  175. package/styles/components/_variables.scss +89 -89
  176. package/styles/content-blocks-variables.scss +507 -507
  177. package/styles/font.scss +2 -2
  178. package/styles/qsm/_calendar.scss +274 -274
  179. package/styles/qsm/_qsm.scss +1094 -1094
  180. package/styles/search.scss +1200 -1200
  181. 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;
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "المغادرة",
128
128
  "FLIGHT_ARRIVAL": "الوصول",
129
129
  "ON_REQUEST": "حسب الطلب",
130
- "CHANGES": "التحويلات"
130
+ "CHANGES": "التحويلات",
131
+ "COMMISSION": "العمولة"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "العمر",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Afrejse",
128
128
  "FLIGHT_ARRIVAL": "Ankomst",
129
129
  "ON_REQUEST": "På forespørgsel",
130
- "CHANGES": "overførsler"
130
+ "CHANGES": "overførsler",
131
+ "COMMISSION": "Provision"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Alder",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Abflug",
128
128
  "FLIGHT_ARRIVAL": "Ankunft",
129
129
  "ON_REQUEST": "Auf Anfrage",
130
- "CHANGES": "Transfers"
130
+ "CHANGES": "Transfers",
131
+ "COMMISSION": "Provision"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Alter",
@@ -128,7 +128,8 @@
128
128
  "FLIGHT_ARRIVAL": "Arrival",
129
129
  "ON_REQUEST": "On request",
130
130
  "CHANGES": "transfers",
131
- "PACKAGE_NOT_AVAILABLE": "Package not available"
131
+ "PACKAGE_NOT_AVAILABLE": "Package not available",
132
+ "COMMISSION": "Commission"
132
133
  },
133
134
  "TRAVELERS_FORM": {
134
135
  "AGE": "Age",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Salida",
128
128
  "FLIGHT_ARRIVAL": "Llegada",
129
129
  "ON_REQUEST": "A petición",
130
- "CHANGES": "traslados"
130
+ "CHANGES": "traslados",
131
+ "COMMISSION": "comisión"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Edad",
@@ -128,7 +128,8 @@
128
128
  "FLIGHT_ARRIVAL": "Arrivée",
129
129
  "ON_REQUEST": "Sur demande",
130
130
  "CHANGES": "correspondances",
131
- "PACKAGE_NOT_AVAILABLE": "Forfait non disponible"
131
+ "PACKAGE_NOT_AVAILABLE": "Forfait non disponible",
132
+ "COMMISSION": "Commission"
132
133
  },
133
134
  "TRAVELERS_FORM": {
134
135
  "AGE": "Age",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Départ",
128
128
  "FLIGHT_ARRIVAL": "Arrivée",
129
129
  "ON_REQUEST": "Sur demande",
130
- "CHANGES": "transferts"
130
+ "CHANGES": "transferts",
131
+ "COMMISSION": "Commission"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Âge",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Brottför",
128
128
  "FLIGHT_ARRIVAL": "Koma",
129
129
  "ON_REQUEST": "Á beiðni",
130
- "CHANGES": "flutningar"
130
+ "CHANGES": "flutningar",
131
+ "COMMISSION": "Þóknun"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Aldur",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Partenza",
128
128
  "FLIGHT_ARRIVAL": "Arrivo",
129
129
  "ON_REQUEST": "Su richiesta",
130
- "CHANGES": "trasferimenti"
130
+ "CHANGES": "trasferimenti",
131
+ "COMMISSION": "Commissione"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Età",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "出発",
128
128
  "FLIGHT_ARRIVAL": "到着",
129
129
  "ON_REQUEST": "要リクエスト",
130
- "CHANGES": "送迎"
130
+ "CHANGES": "送迎",
131
+ "COMMISSION": "手数料"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "年齢",
@@ -128,7 +128,8 @@
128
128
  "FLIGHT_ARRIVAL": "Aankomst",
129
129
  "ON_REQUEST": "Op aanvraag",
130
130
  "CHANGES": "overstappen",
131
- "PACKAGE_NOT_AVAILABLE": "Pakket niet beschikbaar"
131
+ "PACKAGE_NOT_AVAILABLE": "Pakket niet beschikbaar",
132
+ "COMMISSION": "Commissie"
132
133
  },
133
134
  "TRAVELERS_FORM": {
134
135
  "AGE": "Leeftijd",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Vertrek",
128
128
  "FLIGHT_ARRIVAL": "Aankomst",
129
129
  "ON_REQUEST": "Op aanvraag",
130
- "CHANGES": "transfers"
130
+ "CHANGES": "transfers",
131
+ "COMMISSION": "Commissie"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Leeftijd",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Avgang",
128
128
  "FLIGHT_ARRIVAL": "Ankomst",
129
129
  "ON_REQUEST": "På forespørsel",
130
- "CHANGES": "transporter"
130
+ "CHANGES": "transporter",
131
+ "COMMISSION": "provisjon"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Alder",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Odlot",
128
128
  "FLIGHT_ARRIVAL": "Przylot",
129
129
  "ON_REQUEST": "Na zapytanie",
130
- "CHANGES": "transfery"
130
+ "CHANGES": "transfery",
131
+ "COMMISSION": "Prowizja"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Wiek",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Partida",
128
128
  "FLIGHT_ARRIVAL": "Chegada",
129
129
  "ON_REQUEST": "A pedido",
130
- "CHANGES": "transferes"
130
+ "CHANGES": "transferes",
131
+ "COMMISSION": "Comissão"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Idade",
@@ -127,7 +127,8 @@
127
127
  "FLIGHT_DEPARTURE": "Avgång",
128
128
  "FLIGHT_ARRIVAL": "Ankomst",
129
129
  "ON_REQUEST": "På förfrågan",
130
- "CHANGES": "transfers"
130
+ "CHANGES": "transfers",
131
+ "COMMISSION": "provision"
131
132
  },
132
133
  "TRAVELERS_FORM": {
133
134
  "AGE": "Ålder",
@@ -1,7 +1,7 @@
1
- import { compact } from 'lodash';
2
-
3
- export const buildClassName = (parts: any[]): string => {
4
- const sanitizedParts = parts.filter((part) => typeof part === 'string').map((part: string) => part.trim());
5
-
6
- return compact(sanitizedParts).join(' ');
7
- };
1
+ import { compact } from 'lodash';
2
+
3
+ export const buildClassName = (parts: any[]): string => {
4
+ const sanitizedParts = parts.filter((part) => typeof part === 'string').map((part: string) => part.trim());
5
+
6
+ return compact(sanitizedParts).join(' ');
7
+ };
@@ -1,91 +1,91 @@
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 = (params: URLSearchParams, name: string): string | null => {
6
- const dateString = params.get(name);
7
- if (dateString === null) {
8
- return null;
9
- }
10
-
11
- const year = parseInt(dateString.slice(0, 5));
12
- const month = parseInt(dateString.slice(5, 7));
13
- const date = parseInt(dateString.slice(8, 10));
14
-
15
- return new Date(Date.UTC(year, month - 1, date)).toISOString();
16
- };
17
-
18
- export const getDateAsDateFromParams = (params: URLSearchParams, name: string): Date | null => {
19
- const dateString = params.get(name);
20
-
21
- if (dateString === null) {
22
- return null;
23
- }
24
-
25
- const year = parseInt(dateString.slice(0, 5));
26
- const month = parseInt(dateString.slice(5, 7));
27
- const date = parseInt(dateString.slice(8, 10));
28
-
29
- return new Date(Date.UTC(year, month - 1, date));
30
- };
31
-
32
- export const getNumberFromParams = (params: URLSearchParams, name: string): number | null => {
33
- const numberString = params.get(name);
34
- if (numberString === null) {
35
- return null;
36
- }
37
-
38
- return parseInt(numberString);
39
- };
40
-
41
- export const getRoomsFromParams = (params: URLSearchParams, name: string): Room[] | null => {
42
- const roomString = params.get(name);
43
- if (roomString === null) {
44
- return null;
45
- }
46
-
47
- // Encode the accommodation code in the room string because (external) acco codes can contain special characters like '='. eg: 'ACNYNEgUzMDc4NBoKMTAzODcwMjk4NQ=='
48
- const safeRoomsString = roomString.replace(/accommodationCode:([^,]*)/, (match, code) => {
49
- return `accommodationCode:${encodeURIComponent(code)}`;
50
- });
51
-
52
- const rooms = JsonURL.parse(safeRoomsString) as Room[] | undefined;
53
- if (isNil(rooms)) {
54
- return null;
55
- }
56
-
57
- return rooms.map((room) => {
58
- if (!isArray(room.childAges)) {
59
- room.childAges = [];
60
- }
61
-
62
- room.children = room.childAges.length ?? 0;
63
- return room;
64
- });
65
- };
66
-
67
- export const getFlightsFromParams = (params: URLSearchParams, name: string): FlightInfo | null => {
68
- let flightString = params.get(name);
69
- if (flightString === null) {
70
- return null;
71
- }
72
-
73
- flightString = flightString.replace(/ /g, '%20');
74
-
75
- const flightInfo = JsonURL.parse(flightString, { AQF: true }) as FlightInfo | undefined;
76
-
77
- if (isNil(flightInfo)) {
78
- return null;
79
- }
80
-
81
- return flightInfo;
82
- };
83
-
84
- export const getStringFromParams = (params: URLSearchParams, name: string): string | null => {
85
- return params.get(name);
86
- };
87
-
88
- export const getNumbersFromParams = (params: URLSearchParams, name: string): number[] => {
89
- const numberStrings = params.getAll(name);
90
- return numberStrings.map((x) => parseInt(x));
91
- };
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 = (params: URLSearchParams, name: string): string | null => {
6
+ const dateString = params.get(name);
7
+ if (dateString === null) {
8
+ return null;
9
+ }
10
+
11
+ const year = parseInt(dateString.slice(0, 5));
12
+ const month = parseInt(dateString.slice(5, 7));
13
+ const date = parseInt(dateString.slice(8, 10));
14
+
15
+ return new Date(Date.UTC(year, month - 1, date)).toISOString();
16
+ };
17
+
18
+ export const getDateAsDateFromParams = (params: URLSearchParams, name: string): Date | null => {
19
+ const dateString = params.get(name);
20
+
21
+ if (dateString === null) {
22
+ return null;
23
+ }
24
+
25
+ const year = parseInt(dateString.slice(0, 5));
26
+ const month = parseInt(dateString.slice(5, 7));
27
+ const date = parseInt(dateString.slice(8, 10));
28
+
29
+ return new Date(Date.UTC(year, month - 1, date));
30
+ };
31
+
32
+ export const getNumberFromParams = (params: URLSearchParams, name: string): number | null => {
33
+ const numberString = params.get(name);
34
+ if (numberString === null) {
35
+ return null;
36
+ }
37
+
38
+ return parseInt(numberString);
39
+ };
40
+
41
+ export const getRoomsFromParams = (params: URLSearchParams, name: string): Room[] | null => {
42
+ const roomString = params.get(name);
43
+ if (roomString === null) {
44
+ return null;
45
+ }
46
+
47
+ // Encode the accommodation code in the room string because (external) acco codes can contain special characters like '='. eg: 'ACNYNEgUzMDc4NBoKMTAzODcwMjk4NQ=='
48
+ const safeRoomsString = roomString.replace(/accommodationCode:([^,]*)/, (match, code) => {
49
+ return `accommodationCode:${encodeURIComponent(code)}`;
50
+ });
51
+
52
+ const rooms = JsonURL.parse(safeRoomsString) as Room[] | undefined;
53
+ if (isNil(rooms)) {
54
+ return null;
55
+ }
56
+
57
+ return rooms.map((room) => {
58
+ if (!isArray(room.childAges)) {
59
+ room.childAges = [];
60
+ }
61
+
62
+ room.children = room.childAges.length ?? 0;
63
+ return room;
64
+ });
65
+ };
66
+
67
+ export const getFlightsFromParams = (params: URLSearchParams, name: string): FlightInfo | null => {
68
+ let flightString = params.get(name);
69
+ if (flightString === null) {
70
+ return null;
71
+ }
72
+
73
+ flightString = flightString.replace(/ /g, '%20');
74
+
75
+ const flightInfo = JsonURL.parse(flightString, { AQF: true }) as FlightInfo | undefined;
76
+
77
+ if (isNil(flightInfo)) {
78
+ return null;
79
+ }
80
+
81
+ return flightInfo;
82
+ };
83
+
84
+ export const getStringFromParams = (params: URLSearchParams, name: string): string | null => {
85
+ return params.get(name);
86
+ };
87
+
88
+ export const getNumbersFromParams = (params: URLSearchParams, name: string): number[] => {
89
+ const numberStrings = params.getAll(name);
90
+ return numberStrings.map((x) => parseInt(x));
91
+ };
@@ -1,34 +1,34 @@
1
- import { TideClientConfig } from '@qite/tide-client';
2
- import { isNil } from 'lodash';
3
- import { ApiSettingsState } from '../types';
4
-
5
- export function buildTideClientConfig(settings?: ApiSettingsState): TideClientConfig {
6
- const HOST = settings?.apiUrl || process.env.REACT_APP_BOOKING_HOST;
7
- const API_KEY = settings?.apiKey || process.env.REACT_APP_BOOKING_API_KEY;
8
- const token = selectAgentToken();
9
-
10
- if (isNil(HOST)) {
11
- throw Error(`Environment variable "HOST" was not set.`);
12
- }
13
-
14
- if (isNil(API_KEY)) {
15
- throw Error(`Environment variable "API_KEY" was not set.`);
16
- }
17
-
18
- return {
19
- host: HOST,
20
- apiKey: API_KEY,
21
- token: token
22
- };
23
- }
24
-
25
- export const selectAgentToken = (): string | undefined => {
26
- let token: string | null = null;
27
- if (typeof sessionStorage !== 'undefined') {
28
- token = sessionStorage.getItem('token');
29
- }
30
- if (token === null && typeof localStorage !== 'undefined') {
31
- token = localStorage.getItem('token');
32
- }
33
- return token ?? undefined;
34
- };
1
+ import { TideClientConfig } from '@qite/tide-client';
2
+ import { isNil } from 'lodash';
3
+ import { ApiSettingsState } from '../types';
4
+
5
+ export function buildTideClientConfig(settings?: ApiSettingsState): TideClientConfig {
6
+ const HOST = settings?.apiUrl || process.env.REACT_APP_BOOKING_HOST;
7
+ const API_KEY = settings?.apiKey || process.env.REACT_APP_BOOKING_API_KEY;
8
+ const token = selectAgentToken();
9
+
10
+ if (isNil(HOST)) {
11
+ throw Error(`Environment variable "HOST" was not set.`);
12
+ }
13
+
14
+ if (isNil(API_KEY)) {
15
+ throw Error(`Environment variable "API_KEY" was not set.`);
16
+ }
17
+
18
+ return {
19
+ host: HOST,
20
+ apiKey: API_KEY,
21
+ token: token
22
+ };
23
+ }
24
+
25
+ export const selectAgentToken = (): string | undefined => {
26
+ let token: string | null = null;
27
+ if (typeof sessionStorage !== 'undefined') {
28
+ token = sessionStorage.getItem('token');
29
+ }
30
+ if (token === null && typeof localStorage !== 'undefined') {
31
+ token = localStorage.getItem('token');
32
+ }
33
+ return token ?? undefined;
34
+ };
@@ -1,19 +1,19 @@
1
- import { useEffect, useState } from 'react';
2
-
3
- const useMediaQuery = (query: string): boolean => {
4
- const [matches, setMatches] = useState(false);
5
-
6
- useEffect(() => {
7
- const media = window.matchMedia(query);
8
- const handler = () => setMatches(media.matches);
9
-
10
- handler();
11
- media.addEventListener('change', handler);
12
-
13
- return () => media.removeEventListener('change', handler);
14
- }, [query]);
15
-
16
- return matches;
17
- };
18
-
19
- export default useMediaQuery;
1
+ import { useEffect, useState } from 'react';
2
+
3
+ const useMediaQuery = (query: string): boolean => {
4
+ const [matches, setMatches] = useState(false);
5
+
6
+ useEffect(() => {
7
+ const media = window.matchMedia(query);
8
+ const handler = () => setMatches(media.matches);
9
+
10
+ handler();
11
+ media.addEventListener('change', handler);
12
+
13
+ return () => media.removeEventListener('change', handler);
14
+ }, [query]);
15
+
16
+ return matches;
17
+ };
18
+
19
+ export default useMediaQuery;
@@ -1,74 +1,74 @@
1
- @use '../abstracts/variables' as variables;
2
- // MEDIA QUERIES
3
- @mixin media-xs {
4
- @media only screen and (max-width: variables.$screen-xs) {
5
- @content;
6
- }
7
- }
8
-
9
- @mixin media-sm {
10
- @media only screen and (max-width: variables.$screen-sm) {
11
- @content;
12
- }
13
- }
14
-
15
- @mixin media-md {
16
- @media only screen and (max-width: variables.$screen-md) {
17
- @content;
18
- }
19
- }
20
-
21
- @mixin media-lg {
22
- @media only screen and (max-width: variables.$screen-lg) {
23
- @content;
24
- }
25
- }
26
-
27
- @mixin media-xgl {
28
- @media only screen and (max-width: variables.$screen-xgl) {
29
- @content;
30
- }
31
- }
32
-
33
- @mixin media-xl {
34
- @media only screen and (max-width: variables.$screen-xl) {
35
- @content;
36
- }
37
- }
38
-
39
- @mixin media-xxl {
40
- @media only screen and (max-width: variables.$screen-xxl) {
41
- @content;
42
- }
43
- }
44
-
45
- @mixin media-xxxl {
46
- @media only screen and (max-width: variables.$screen-xxl) {
47
- @content;
48
- }
49
- }
50
-
51
- @mixin make-container($padding-x: $container-padding-x) {
52
- width: 100%;
53
- max-width: 1496px;
54
- margin-right: auto;
55
- margin-left: auto;
56
-
57
- @include media-xl {
58
- padding: 0 $padding-x;
59
- }
60
- }
61
-
62
- @mixin container() {
63
- width: 100%;
64
- padding: 0 15px;
65
- margin: 0 auto;
66
-
67
- @include media-sm {
68
- padding: 0 30px;
69
- }
70
-
71
- @include media-lg {
72
- padding: 0 45px;
73
- }
74
- }
1
+ @use '../abstracts/variables' as variables;
2
+ // MEDIA QUERIES
3
+ @mixin media-xs {
4
+ @media only screen and (max-width: variables.$screen-xs) {
5
+ @content;
6
+ }
7
+ }
8
+
9
+ @mixin media-sm {
10
+ @media only screen and (max-width: variables.$screen-sm) {
11
+ @content;
12
+ }
13
+ }
14
+
15
+ @mixin media-md {
16
+ @media only screen and (max-width: variables.$screen-md) {
17
+ @content;
18
+ }
19
+ }
20
+
21
+ @mixin media-lg {
22
+ @media only screen and (max-width: variables.$screen-lg) {
23
+ @content;
24
+ }
25
+ }
26
+
27
+ @mixin media-xgl {
28
+ @media only screen and (max-width: variables.$screen-xgl) {
29
+ @content;
30
+ }
31
+ }
32
+
33
+ @mixin media-xl {
34
+ @media only screen and (max-width: variables.$screen-xl) {
35
+ @content;
36
+ }
37
+ }
38
+
39
+ @mixin media-xxl {
40
+ @media only screen and (max-width: variables.$screen-xxl) {
41
+ @content;
42
+ }
43
+ }
44
+
45
+ @mixin media-xxxl {
46
+ @media only screen and (max-width: variables.$screen-xxl) {
47
+ @content;
48
+ }
49
+ }
50
+
51
+ @mixin make-container($padding-x: $container-padding-x) {
52
+ width: 100%;
53
+ max-width: 1496px;
54
+ margin-right: auto;
55
+ margin-left: auto;
56
+
57
+ @include media-xl {
58
+ padding: 0 $padding-x;
59
+ }
60
+ }
61
+
62
+ @mixin container() {
63
+ width: 100%;
64
+ padding: 0 15px;
65
+ margin: 0 auto;
66
+
67
+ @include media-sm {
68
+ padding: 0 30px;
69
+ }
70
+
71
+ @include media-lg {
72
+ padding: 0 45px;
73
+ }
74
+ }