@qite/tide-booking-component 1.2.4 → 1.2.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.
Files changed (137) hide show
  1. package/.vs/ProjectSettings.json +3 -3
  2. package/.vs/VSWorkspaceState.json +5 -5
  3. package/README.md +8 -8
  4. package/build/build-cjs/booking-wizard/features/flight-options/flight-option-flight.d.ts +1 -1
  5. package/build/build-cjs/booking-wizard/features/flight-options/flight-option.d.ts +1 -1
  6. package/build/build-cjs/booking-wizard/types.d.ts +6 -0
  7. package/build/build-cjs/index.js +1200 -713
  8. package/build/build-cjs/shared/utils/localization-util.d.ts +1 -0
  9. package/build/build-esm/booking-wizard/features/flight-options/flight-option-flight.d.ts +1 -1
  10. package/build/build-esm/booking-wizard/features/flight-options/flight-option.d.ts +1 -1
  11. package/build/build-esm/booking-wizard/types.d.ts +6 -0
  12. package/build/build-esm/index.js +1201 -714
  13. package/build/build-esm/shared/utils/localization-util.d.ts +1 -0
  14. package/package.json +75 -77
  15. package/rollup.config.js +23 -23
  16. package/src/booking-product/components/age-select.tsx +35 -41
  17. package/src/booking-product/components/amount-input.tsx +78 -64
  18. package/src/booking-product/components/date-range-picker/calendar-day.tsx +58 -54
  19. package/src/booking-product/components/date-range-picker/calendar.tsx +178 -176
  20. package/src/booking-product/components/date-range-picker/index.tsx +196 -181
  21. package/src/booking-product/components/dates.tsx +136 -132
  22. package/src/booking-product/components/footer.tsx +69 -70
  23. package/src/booking-product/components/header.tsx +79 -68
  24. package/src/booking-product/components/icon.tsx +251 -208
  25. package/src/booking-product/components/product.tsx +314 -281
  26. package/src/booking-product/components/rating.tsx +21 -21
  27. package/src/booking-product/components/rooms.tsx +195 -180
  28. package/src/booking-product/index.tsx +30 -30
  29. package/src/booking-product/settings-context.ts +14 -14
  30. package/src/booking-product/types.ts +28 -28
  31. package/src/booking-product/utils/api.ts +25 -25
  32. package/src/booking-product/utils/price.ts +29 -27
  33. package/src/booking-wizard/api-settings-slice.ts +24 -24
  34. package/src/booking-wizard/components/icon.tsx +508 -309
  35. package/src/booking-wizard/components/labeled-input.tsx +64 -64
  36. package/src/booking-wizard/components/labeled-select.tsx +69 -69
  37. package/src/booking-wizard/components/message.tsx +34 -34
  38. package/src/booking-wizard/components/multi-range-filter.tsx +113 -113
  39. package/src/booking-wizard/components/product-card.tsx +37 -37
  40. package/src/booking-wizard/components/step-indicator.tsx +51 -51
  41. package/src/booking-wizard/components/step-route.tsx +27 -27
  42. package/src/booking-wizard/declarations.d.ts +4 -4
  43. package/src/booking-wizard/features/booking/api.ts +49 -45
  44. package/src/booking-wizard/features/booking/booking-self-contained.tsx +384 -357
  45. package/src/booking-wizard/features/booking/booking-slice.ts +662 -603
  46. package/src/booking-wizard/features/booking/booking.tsx +356 -349
  47. package/src/booking-wizard/features/booking/constants.ts +16 -16
  48. package/src/booking-wizard/features/booking/selectors.ts +441 -418
  49. package/src/booking-wizard/features/confirmation/confirmation.tsx +97 -94
  50. package/src/booking-wizard/features/error/error.tsx +78 -75
  51. package/src/booking-wizard/features/flight-options/flight-filter.tsx +432 -357
  52. package/src/booking-wizard/features/flight-options/flight-option-flight.tsx +385 -353
  53. package/src/booking-wizard/features/flight-options/flight-option-modal.tsx +229 -214
  54. package/src/booking-wizard/features/flight-options/flight-option.tsx +81 -66
  55. package/src/booking-wizard/features/flight-options/flight-utils.ts +516 -401
  56. package/src/booking-wizard/features/flight-options/index.tsx +196 -177
  57. package/src/booking-wizard/features/price-details/price-details-api.ts +24 -24
  58. package/src/booking-wizard/features/price-details/price-details-slice.ts +178 -171
  59. package/src/booking-wizard/features/price-details/util.ts +155 -155
  60. package/src/booking-wizard/features/product-options/no-options.tsx +21 -21
  61. package/src/booking-wizard/features/product-options/none-option.tsx +120 -120
  62. package/src/booking-wizard/features/product-options/option-booking-airline-group.tsx +64 -66
  63. package/src/booking-wizard/features/product-options/option-booking-group.tsx +216 -210
  64. package/src/booking-wizard/features/product-options/option-item.tsx +317 -318
  65. package/src/booking-wizard/features/product-options/option-pax-card.tsx +201 -188
  66. package/src/booking-wizard/features/product-options/option-pax-group.tsx +175 -169
  67. package/src/booking-wizard/features/product-options/option-room.tsx +321 -314
  68. package/src/booking-wizard/features/product-options/option-unit-group.tsx +198 -192
  69. package/src/booking-wizard/features/product-options/option-units-card.tsx +185 -174
  70. package/src/booking-wizard/features/product-options/options-form.tsx +459 -437
  71. package/src/booking-wizard/features/room-options/index.tsx +187 -172
  72. package/src/booking-wizard/features/room-options/room-utils.ts +190 -143
  73. package/src/booking-wizard/features/room-options/room.tsx +160 -124
  74. package/src/booking-wizard/features/room-options/traveler-rooms.tsx +75 -63
  75. package/src/booking-wizard/features/sidebar/index.tsx +76 -76
  76. package/src/booking-wizard/features/sidebar/sidebar-flight.tsx +68 -68
  77. package/src/booking-wizard/features/sidebar/sidebar-util.ts +177 -177
  78. package/src/booking-wizard/features/sidebar/sidebar.tsx +364 -346
  79. package/src/booking-wizard/features/summary/summary-booking-option-pax.tsx +25 -25
  80. package/src/booking-wizard/features/summary/summary-booking-option-unit.tsx +25 -25
  81. package/src/booking-wizard/features/summary/summary-flight.tsx +39 -39
  82. package/src/booking-wizard/features/summary/summary-per-booking-option-group.tsx +69 -57
  83. package/src/booking-wizard/features/summary/summary-per-pax-option-group.tsx +63 -51
  84. package/src/booking-wizard/features/summary/summary-per-unit-option-group.tsx +66 -54
  85. package/src/booking-wizard/features/summary/summary-slice.ts +28 -28
  86. package/src/booking-wizard/features/summary/summary.tsx +674 -643
  87. package/src/booking-wizard/features/travelers-form/travelers-form-slice.ts +164 -164
  88. package/src/booking-wizard/features/travelers-form/travelers-form.tsx +754 -755
  89. package/src/booking-wizard/features/travelers-form/type-ahead-input.tsx +101 -101
  90. package/src/booking-wizard/features/travelers-form/validate-form.ts +245 -245
  91. package/src/booking-wizard/index.tsx +36 -36
  92. package/src/booking-wizard/settings-context.ts +60 -60
  93. package/src/booking-wizard/store.ts +31 -31
  94. package/src/booking-wizard/types.ts +276 -271
  95. package/src/index.ts +4 -5
  96. package/src/shared/components/loader.tsx +16 -16
  97. package/src/shared/translations/en-GB.json +232 -0
  98. package/src/shared/translations/fr-BE.json +233 -233
  99. package/src/shared/translations/nl-BE.json +232 -232
  100. package/src/shared/types.ts +4 -4
  101. package/src/shared/utils/class-util.ts +9 -9
  102. package/src/shared/utils/localization-util.ts +62 -56
  103. package/src/shared/utils/query-string-util.ts +119 -116
  104. package/src/shared/utils/tide-api-utils.ts +36 -36
  105. package/styles/booking-product-variables.scss +394 -288
  106. package/styles/booking-product.scss +446 -440
  107. package/styles/booking-wizard-variables.scss +871 -530
  108. package/styles/booking-wizard.scss +59 -26
  109. package/styles/components/_animations.scss +39 -39
  110. package/styles/components/_base.scss +107 -106
  111. package/styles/components/_booking.scss +879 -1409
  112. package/styles/components/_button.scss +238 -185
  113. package/styles/components/_checkbox.scss +219 -215
  114. package/styles/components/_cta.scss +208 -133
  115. package/styles/components/_date-list.scss +41 -0
  116. package/styles/components/_date-range-picker.scss +225 -225
  117. package/styles/components/_decrement-increment.scss +35 -37
  118. package/styles/components/_dropdown.scss +72 -74
  119. package/styles/components/_flight-option.scss +1429 -1389
  120. package/styles/components/_form.scss +1583 -394
  121. package/styles/components/_info-message.scss +71 -0
  122. package/styles/components/_input.scss +25 -0
  123. package/styles/components/_list.scss +187 -82
  124. package/styles/components/_loader.scss +72 -71
  125. package/styles/components/_mixins.scss +550 -530
  126. package/styles/components/_placeholders.scss +166 -166
  127. package/styles/components/_pricing-summary.scss +155 -117
  128. package/styles/components/_qsm.scss +17 -20
  129. package/styles/components/_radiobutton.scss +170 -0
  130. package/styles/components/_select-wrapper.scss +80 -66
  131. package/styles/components/_spinner.scss +29 -0
  132. package/styles/components/_step-indicators.scss +168 -160
  133. package/styles/components/_table.scss +81 -81
  134. package/styles/components/_tree.scss +530 -540
  135. package/styles/components/_typeahead.scss +281 -0
  136. package/styles/components/_variables.scss +89 -89
  137. package/tsconfig.json +24 -24
@@ -1,314 +1,321 @@
1
- import {
2
- BookingOptionPax,
3
- BookingPackagePax,
4
- BookingPackageRoom,
5
- } from "@qite/tide-client/build/types";
6
- import { compact, first, sortBy, uniqBy } from "lodash";
7
- import React from "react";
8
- import { useSelector } from "react-redux";
9
- import { buildClassName } from "../../../shared/utils/class-util";
10
- import { formatPrice } from "../../../shared/utils/localization-util";
11
- import { selectProductAttributes, selectTranslations } from "../booking/selectors";
12
- import { getDatePeriodText, getDateText } from "../sidebar/sidebar-util";
13
-
14
- interface OptionRoomProps {
15
- packageRoom: BookingPackageRoom;
16
- pax: BookingPackagePax[];
17
- optionPax?: BookingOptionPax[];
18
- onRoomChange: (
19
- index: number,
20
- accommodationCode: string,
21
- regimeCode: string | null
22
- ) => void;
23
- }
24
-
25
- const OptionRoom: React.FC<OptionRoomProps> = ({
26
- packageRoom,
27
- pax,
28
- optionPax,
29
- onRoomChange,
30
- }) => {
31
- const selectedOption = packageRoom?.options.find((x) => x.isSelected);
32
- const translations = useSelector(selectTranslations);
33
-
34
- let daysAndNightsText = "";
35
- let startDate = "";
36
- let endDate = "";
37
- let productName = "";
38
-
39
- if (packageRoom.index === 0) {
40
- const selectedOption = packageRoom.options.find((x) => x.isSelected);
41
-
42
- if (selectedOption) {
43
- startDate = getDateText(selectedOption.from, true) ?? "";
44
- endDate = getDateText(selectedOption.to, true) ?? "";
45
- daysAndNightsText =
46
- getDatePeriodText(selectedOption.from, selectedOption.to) ?? "";
47
-
48
- const productAttributes = useSelector(selectProductAttributes);
49
- productName = productAttributes?.productName ?? "";
50
- }
51
- }
52
-
53
- const accommodations = uniqBy(
54
- compact(
55
- packageRoom &&
56
- packageRoom.options
57
- .filter(x => x.accommodationCode && !x.isLocked)
58
- .map((option) => {
59
- return {
60
- accommodationCode: option.accommodationCode,
61
- accommodationName: option.accommodationName,
62
- };
63
- })
64
- ),
65
- "accommodationCode"
66
- );
67
-
68
- const regimes = uniqBy(
69
- compact(
70
- packageRoom &&
71
- packageRoom.options
72
- .filter(x => !selectedOption || x.accommodationCode == selectedOption.accommodationCode)
73
- .map((option) => {
74
- return {
75
- regimeCode: option.regimeCode,
76
- regimeName: option.regimeName,
77
- };
78
- })
79
- ),
80
- "regimeCode"
81
- );
82
-
83
- const handleAccommodationChange: React.FormEventHandler<HTMLSelectElement> = (
84
- e
85
- ) => {
86
- const accommodationCode = e.currentTarget.value;
87
- var accommodationOptions = packageRoom?.options.filter(
88
- (x) => x.accommodationCode == accommodationCode
89
- );
90
-
91
- if (accommodationOptions) {
92
- const option =
93
- accommodationOptions.find(
94
- (x) => x.regimeCode == selectedOption?.regimeCode
95
- ) ?? accommodationOptions[0];
96
-
97
- if (option) {
98
- onRoomChange(
99
- packageRoom.index,
100
- option.accommodationCode,
101
- option.regimeCode
102
- );
103
- }
104
- }
105
-
106
- e.preventDefault();
107
- };
108
-
109
- const handleRegimeChange: React.FormEventHandler<HTMLSelectElement> = (e) => {
110
- const regime = regimes.find((x) => x.regimeCode == e.currentTarget.value);
111
-
112
- if (selectedOption) {
113
- onRoomChange(
114
- packageRoom.index,
115
- selectedOption.accommodationCode,
116
- regime ? regime.regimeCode : null
117
- );
118
- }
119
-
120
- e.preventDefault();
121
- };
122
-
123
- const getPriceDifferenceText = (price: number) => {
124
- return price > 0
125
- ? `+ ${formatPrice(Math.abs(price))}`
126
- : `- ${formatPrice(Math.abs(price))}`;
127
- };
128
-
129
- const getAccommodationPriceDifference = (accommodation: {
130
- accommodationCode: string;
131
- accommodationName: string;
132
- }) => {
133
- const selectedOption = packageRoom.options.find((x) => x.isSelected);
134
- if (selectedOption?.accommodationCode === accommodation.accommodationCode)
135
- return "";
136
-
137
- var currentPrice = selectedOption?.price;
138
- var accommodationPrice = first(
139
- sortBy(
140
- packageRoom.options.filter(
141
- (x) =>
142
- x.regimeCode === selectedOption?.regimeCode &&
143
- x.accommodationCode === accommodation.accommodationCode
144
- ),
145
- (x) => x.price
146
- )
147
- )?.price;
148
-
149
- var priceDifference = (accommodationPrice ?? 0) - (currentPrice ?? 0);
150
- if (priceDifference !== 0) {
151
- return `(${getPriceDifferenceText(priceDifference)})`;
152
- } else {
153
- return "";
154
- }
155
- };
156
-
157
- const getRegimePriceDifference = (regime: {
158
- regimeCode: string;
159
- regimeName: string;
160
- }) => {
161
- const selectedOption = packageRoom.options.find((x) => x.isSelected);
162
- if (selectedOption?.regimeCode === regime.regimeCode) return "";
163
-
164
- var currentPrice = selectedOption?.price;
165
- var regimePrice = packageRoom.options.find(
166
- (x) =>
167
- x.accommodationCode === selectedOption?.accommodationCode &&
168
- x.regimeCode === regime.regimeCode
169
- )?.price;
170
-
171
- var priceDifference = (regimePrice ?? 0) - (currentPrice ?? 0);
172
- if (priceDifference !== 0) {
173
- return `(${getPriceDifferenceText(priceDifference)})`;
174
- } else {
175
- return "";
176
- }
177
- };
178
-
179
- const getPaxName = (id: number) => {
180
- const item = pax.find((x) => x.id === id);
181
- if (!item?.firstName && !item?.lastName) {
182
- const optionPaxItem = optionPax?.find((x) => x.id === id);
183
- return optionPaxItem?.paxName;
184
- }
185
- return `${item?.firstName} ${item?.lastName[0]}`;
186
- };
187
-
188
- return (
189
- <tr>
190
- <td>
191
- <div className="tree">
192
- <div className="tree__level">
193
- <div className="tree__header">
194
- <div className="tree__description-collapse">
195
- <div
196
- className={buildClassName([
197
- "radiobutton",
198
- "radiobutton--label",
199
- "radiobutton--package-label",
200
- ])}
201
- >
202
- <div className="radiobutton__label">
203
- <span
204
- className={buildClassName([
205
- "radiobutton__input",
206
- "radiobutton__input--parent",
207
- ])}
208
- ></span>
209
- <span className="radiobutton__label-text">
210
- <div className="date-list">
211
- {startDate && endDate && (
212
- <>
213
- <span className="date-list__item">{startDate}</span>
214
- <span className="date-list__item">{endDate}</span>
215
- </>
216
- )}
217
- </div>
218
- <p>{daysAndNightsText}</p>
219
- </span>
220
- <div className="tree__columns-actions">
221
- <div className="tree__columns">
222
- <div className="tree__column">
223
- <span className="tree__product-name">
224
- {productName}
225
- </span>
226
- </div>
227
- <div className="tree__column">
228
- <span className="tree__package-label">
229
- {translations.OPTIONS_FORM.UNIT_TITLE}{" "}
230
- {packageRoom.index + 1}:{" "}
231
- <span className="tree__package-label-pax">
232
- {pax.map((p, i) => (
233
- <span
234
- key={i}
235
- title={`${p.firstName} ${p.lastName}`}
236
- >
237
- {i > 0 && ", "} {getPaxName(p.id)}
238
- </span>
239
- ))}
240
- </span>
241
- </span>
242
- <div className="select-wrapper">
243
- <div className="select-wrapper__select">
244
- <select
245
- defaultValue={selectedOption?.accommodationCode}
246
- onChange={handleAccommodationChange}
247
- >
248
- {accommodations.map((accommodation) => (
249
- <option
250
- key={accommodation.accommodationCode}
251
- value={accommodation.accommodationCode}
252
- >
253
- {accommodation.accommodationName}{" "}
254
- {getAccommodationPriceDifference(
255
- accommodation
256
- )}
257
- </option>
258
- ))}
259
- </select>
260
- </div>
261
- </div>
262
- </div>
263
- <div className="tree__column">
264
- <div className="select-wrapper">
265
- {regimes.length > 1 && (
266
- <div className="select-wrapper__select">
267
- <select
268
- defaultValue={selectedOption?.regimeCode}
269
- onChange={handleRegimeChange}
270
- >
271
- {regimes.map((regime) => (
272
- <option
273
- key={regime.regimeCode}
274
- value={regime.regimeCode}
275
- >
276
- {regime.regimeName}{" "}
277
- {getRegimePriceDifference(regime)}
278
- </option>
279
- ))}
280
- </select>
281
- </div>
282
- )}
283
- {regimes.length === 1 && (
284
- <>
285
- {
286
- regimes.find(
287
- (x) =>
288
- x.regimeCode == selectedOption?.regimeCode
289
- )?.regimeName
290
- }
291
- </>
292
- )}
293
- </div>
294
- </div>
295
- <div
296
- className={buildClassName([
297
- "tree__column",
298
- "tree__column--price",
299
- ])}
300
- ></div>
301
- </div>
302
- </div>
303
- </div>
304
- </div>
305
- </div>
306
- </div>
307
- </div>
308
- </div>
309
- </td>
310
- </tr>
311
- );
312
- };
313
-
314
- export default OptionRoom;
1
+ import {
2
+ BookingOptionPax,
3
+ BookingPackagePax,
4
+ BookingPackageRoom,
5
+ } from "@qite/tide-client/build/types";
6
+ import { compact, first, sortBy, uniqBy } from "lodash";
7
+ import React from "react";
8
+ import { useSelector } from "react-redux";
9
+ import { buildClassName } from "../../../shared/utils/class-util";
10
+ import { formatPrice } from "../../../shared/utils/localization-util";
11
+ import {
12
+ selectProductAttributes,
13
+ selectTranslations,
14
+ } from "../booking/selectors";
15
+ import { getDatePeriodText, getDateText } from "../sidebar/sidebar-util";
16
+
17
+ interface OptionRoomProps {
18
+ packageRoom: BookingPackageRoom;
19
+ pax: BookingPackagePax[];
20
+ optionPax?: BookingOptionPax[];
21
+ onRoomChange: (
22
+ index: number,
23
+ accommodationCode: string,
24
+ regimeCode: string | null
25
+ ) => void;
26
+ }
27
+
28
+ const OptionRoom: React.FC<OptionRoomProps> = ({
29
+ packageRoom,
30
+ pax,
31
+ optionPax,
32
+ onRoomChange,
33
+ }) => {
34
+ const selectedOption = packageRoom?.options.find((x) => x.isSelected);
35
+ const translations = useSelector(selectTranslations);
36
+
37
+ let daysAndNightsText = "";
38
+ let startDate = "";
39
+ let endDate = "";
40
+ let productName = "";
41
+
42
+ if (packageRoom.index === 0) {
43
+ const selectedOption = packageRoom.options.find((x) => x.isSelected);
44
+
45
+ if (selectedOption) {
46
+ startDate = getDateText(selectedOption.from, true) ?? "";
47
+ endDate = getDateText(selectedOption.to, true) ?? "";
48
+ daysAndNightsText =
49
+ getDatePeriodText(selectedOption.from, selectedOption.to) ?? "";
50
+
51
+ const productAttributes = useSelector(selectProductAttributes);
52
+ productName = productAttributes?.productName ?? "";
53
+ }
54
+ }
55
+
56
+ const accommodations = uniqBy(
57
+ compact(
58
+ packageRoom &&
59
+ packageRoom.options
60
+ .filter((x) => x.accommodationCode && !x.isLocked)
61
+ .map((option) => {
62
+ return {
63
+ accommodationCode: option.accommodationCode,
64
+ accommodationName: option.accommodationName,
65
+ };
66
+ })
67
+ ),
68
+ "accommodationCode"
69
+ );
70
+
71
+ const regimes = uniqBy(
72
+ compact(
73
+ packageRoom &&
74
+ packageRoom.options
75
+ .filter(
76
+ (x) =>
77
+ !selectedOption ||
78
+ x.accommodationCode == selectedOption.accommodationCode
79
+ )
80
+ .map((option) => {
81
+ return {
82
+ regimeCode: option.regimeCode,
83
+ regimeName: option.regimeName,
84
+ };
85
+ })
86
+ ),
87
+ "regimeCode"
88
+ );
89
+
90
+ const handleAccommodationChange: React.FormEventHandler<HTMLSelectElement> = (
91
+ e
92
+ ) => {
93
+ const accommodationCode = e.currentTarget.value;
94
+ var accommodationOptions = packageRoom?.options.filter(
95
+ (x) => x.accommodationCode == accommodationCode
96
+ );
97
+
98
+ if (accommodationOptions) {
99
+ const option =
100
+ accommodationOptions.find(
101
+ (x) => x.regimeCode == selectedOption?.regimeCode
102
+ ) ?? accommodationOptions[0];
103
+
104
+ if (option) {
105
+ onRoomChange(
106
+ packageRoom.index,
107
+ option.accommodationCode,
108
+ option.regimeCode
109
+ );
110
+ }
111
+ }
112
+
113
+ e.preventDefault();
114
+ };
115
+
116
+ const handleRegimeChange: React.FormEventHandler<HTMLSelectElement> = (e) => {
117
+ const regime = regimes.find((x) => x.regimeCode == e.currentTarget.value);
118
+
119
+ if (selectedOption) {
120
+ onRoomChange(
121
+ packageRoom.index,
122
+ selectedOption.accommodationCode,
123
+ regime ? regime.regimeCode : null
124
+ );
125
+ }
126
+
127
+ e.preventDefault();
128
+ };
129
+
130
+ const getPriceDifferenceText = (price: number) => {
131
+ return price > 0
132
+ ? `+ ${formatPrice(Math.abs(price))}`
133
+ : `- ${formatPrice(Math.abs(price))}`;
134
+ };
135
+
136
+ const getAccommodationPriceDifference = (accommodation: {
137
+ accommodationCode: string;
138
+ accommodationName: string;
139
+ }) => {
140
+ const selectedOption = packageRoom.options.find((x) => x.isSelected);
141
+ if (selectedOption?.accommodationCode === accommodation.accommodationCode)
142
+ return "";
143
+
144
+ var currentPrice = selectedOption?.price;
145
+ var accommodationPrice = first(
146
+ sortBy(
147
+ packageRoom.options.filter(
148
+ (x) =>
149
+ x.regimeCode === selectedOption?.regimeCode &&
150
+ x.accommodationCode === accommodation.accommodationCode
151
+ ),
152
+ (x) => x.price
153
+ )
154
+ )?.price;
155
+
156
+ var priceDifference = (accommodationPrice ?? 0) - (currentPrice ?? 0);
157
+ if (priceDifference !== 0) {
158
+ return `(${getPriceDifferenceText(priceDifference)})`;
159
+ } else {
160
+ return "";
161
+ }
162
+ };
163
+
164
+ const getRegimePriceDifference = (regime: {
165
+ regimeCode: string;
166
+ regimeName: string;
167
+ }) => {
168
+ const selectedOption = packageRoom.options.find((x) => x.isSelected);
169
+ if (selectedOption?.regimeCode === regime.regimeCode) return "";
170
+
171
+ var currentPrice = selectedOption?.price;
172
+ var regimePrice = packageRoom.options.find(
173
+ (x) =>
174
+ x.accommodationCode === selectedOption?.accommodationCode &&
175
+ x.regimeCode === regime.regimeCode
176
+ )?.price;
177
+
178
+ var priceDifference = (regimePrice ?? 0) - (currentPrice ?? 0);
179
+ if (priceDifference !== 0) {
180
+ return `(${getPriceDifferenceText(priceDifference)})`;
181
+ } else {
182
+ return "";
183
+ }
184
+ };
185
+
186
+ const getPaxName = (id: number) => {
187
+ const item = pax.find((x) => x.id === id);
188
+ if (!item?.firstName && !item?.lastName) {
189
+ const optionPaxItem = optionPax?.find((x) => x.id === id);
190
+ return optionPaxItem?.paxName;
191
+ }
192
+ return `${item?.firstName} ${item?.lastName[0]}`;
193
+ };
194
+
195
+ return (
196
+ <tr>
197
+ <td>
198
+ <div className="tree">
199
+ <div className="tree__level">
200
+ <div className="tree__header">
201
+ <div className="tree__description-collapse">
202
+ <div
203
+ className={buildClassName([
204
+ "radiobutton",
205
+ "radiobutton--label",
206
+ "radiobutton--package-label",
207
+ ])}
208
+ >
209
+ <div className="radiobutton__label">
210
+ <span
211
+ className={buildClassName([
212
+ "radiobutton__input",
213
+ "radiobutton__input--parent",
214
+ ])}
215
+ ></span>
216
+ <span className="radiobutton__label-text">
217
+ <div className="date-list">
218
+ {startDate && endDate && (
219
+ <>
220
+ <span className="date-list__item">{startDate}</span>
221
+ <span className="date-list__item">{endDate}</span>
222
+ </>
223
+ )}
224
+ </div>
225
+ <p>{daysAndNightsText}</p>
226
+ </span>
227
+ <div className="tree__columns-actions">
228
+ <div className="tree__columns">
229
+ <div className="tree__column">
230
+ <span className="tree__product-name">
231
+ {productName}
232
+ </span>
233
+ </div>
234
+ <div className="tree__column">
235
+ <span className="tree__package-label">
236
+ {translations.OPTIONS_FORM.UNIT_TITLE}{" "}
237
+ {packageRoom.index + 1}:{" "}
238
+ <span className="tree__package-label-pax">
239
+ {pax.map((p, i) => (
240
+ <span
241
+ key={i}
242
+ title={`${p.firstName} ${p.lastName}`}
243
+ >
244
+ {i > 0 && ", "} {getPaxName(p.id)}
245
+ </span>
246
+ ))}
247
+ </span>
248
+ </span>
249
+ <div className="select-wrapper">
250
+ <div className="select-wrapper__select">
251
+ <select
252
+ defaultValue={selectedOption?.accommodationCode}
253
+ onChange={handleAccommodationChange}
254
+ >
255
+ {accommodations.map((accommodation) => (
256
+ <option
257
+ key={accommodation.accommodationCode}
258
+ value={accommodation.accommodationCode}
259
+ >
260
+ {accommodation.accommodationName}{" "}
261
+ {getAccommodationPriceDifference(
262
+ accommodation
263
+ )}
264
+ </option>
265
+ ))}
266
+ </select>
267
+ </div>
268
+ </div>
269
+ </div>
270
+ <div className="tree__column">
271
+ <div className="select-wrapper">
272
+ {regimes.length > 1 && (
273
+ <div className="select-wrapper__select">
274
+ <select
275
+ defaultValue={selectedOption?.regimeCode}
276
+ onChange={handleRegimeChange}
277
+ >
278
+ {regimes.map((regime) => (
279
+ <option
280
+ key={regime.regimeCode}
281
+ value={regime.regimeCode}
282
+ >
283
+ {regime.regimeName}{" "}
284
+ {getRegimePriceDifference(regime)}
285
+ </option>
286
+ ))}
287
+ </select>
288
+ </div>
289
+ )}
290
+ {regimes.length === 1 && (
291
+ <>
292
+ {
293
+ regimes.find(
294
+ (x) =>
295
+ x.regimeCode == selectedOption?.regimeCode
296
+ )?.regimeName
297
+ }
298
+ </>
299
+ )}
300
+ </div>
301
+ </div>
302
+ <div
303
+ className={buildClassName([
304
+ "tree__column",
305
+ "tree__column--price",
306
+ ])}
307
+ ></div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+ </div>
312
+ </div>
313
+ </div>
314
+ </div>
315
+ </div>
316
+ </td>
317
+ </tr>
318
+ );
319
+ };
320
+
321
+ export default OptionRoom;