@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,123 +1,123 @@
1
- import React, { useEffect, useState } from 'react';
2
- import { useSelector } from 'react-redux';
3
- import { getPriceDifferenceText } from '../../../shared/utils/localization-util';
4
- import { SelectableRoomAccommodation } from '../../types';
5
- import { selectCurrencyCode, selectTranslations } from '../booking/selectors';
6
- import { getDatePeriodText, getDateText } from '../sidebar/sidebar-util';
7
- import { buildClassName } from '../../../shared/utils/class-util';
8
-
9
- interface RoomOptionProps {
10
- room: SelectableRoomAccommodation;
11
- hasAlternatives?: boolean;
12
- selectedRoomPrice?: number;
13
- onAcommodationChange?: (accommodationCode: string, regimeCode: string) => void;
14
- onRegimeChange?: (code: string) => void;
15
- onToggleAlternatives?: () => void;
16
- }
17
-
18
- const RoomOption: React.FC<RoomOptionProps> = ({ room, hasAlternatives, selectedRoomPrice, onAcommodationChange, onRegimeChange, onToggleAlternatives }) => {
19
- const translations = useSelector(selectTranslations);
20
- const currencyCode = useSelector(selectCurrencyCode);
21
-
22
- const [roomPrice, setRoomPrice] = useState<number>(0);
23
- const [roomRegimeCode, setRoomRegimeCode] = useState<string>(room.regimeCode);
24
-
25
- useEffect(() => {
26
- setRoomPrice(room.price);
27
- }, [room.code, room.regimeCode]);
28
-
29
- const getPriceDifference = (selectedPrice: number, currentPrice: number) => {
30
- const priceDifference = (selectedPrice ?? 0) - currentPrice;
31
- if (priceDifference !== 0) {
32
- return `(${getPriceDifferenceText(priceDifference, currencyCode)})`;
33
- } else {
34
- return '';
35
- }
36
- };
37
-
38
- const selectAccommodation = () => {
39
- if (onAcommodationChange) {
40
- onAcommodationChange(room.code, roomRegimeCode);
41
- }
42
- };
43
-
44
- const handleRegimeChange: React.FormEventHandler<HTMLSelectElement> = (e) => {
45
- let regimeCode = e.currentTarget.value;
46
-
47
- const option = room.regimes.find((x) => x.code === regimeCode || (x.code === null && regimeCode === ''))!;
48
- setRoomRegimeCode(option.code);
49
- setRoomPrice(option.price);
50
-
51
- if (onRegimeChange) {
52
- onRegimeChange(regimeCode);
53
- }
54
-
55
- e.preventDefault();
56
- };
57
-
58
- return (
59
- <>
60
- <div className="form__room">
61
- {room.viewHtml && <div className="form__room__wrapper" dangerouslySetInnerHTML={{ __html: room.viewHtml }} />}
62
- {!room.viewHtml && (
63
- <div className="form__room__wrapper">
64
- {room.image && (
65
- <div className="form__room__image">
66
- <img src={room.image} alt="" className="form__room__img" />
67
- </div>
68
- )}
69
- <div className="form__room__body">
70
- <div className="">
71
- <h3 className="form__room__title">{room.title}</h3>
72
- {room.description && <p className="form__room__text">{room.description}</p>}
73
- <ul className="list--usps form__room__usps">
74
- {room.usps.map((usp, uspIndex) => (
75
- <li key={uspIndex} className="list__item">
76
- {usp}
77
- </li>
78
- ))}
79
- </ul>
80
- </div>
81
- </div>
82
- </div>
83
- )}
84
- <div className="form__room__footer">
85
- <div className="form__room__footer__top">
86
- <p className="form__room__dates">
87
- {getDateText(room.from)} - {getDateText(room.to)}
88
- </p>
89
- <span className="form__room__days">{getDatePeriodText(translations, room.from, room.to)}</span>
90
- </div>
91
- <div className="form__room__footer__bottom">
92
- {selectedRoomPrice != undefined && (
93
- <p className="form__room__price form__room__price--increase">
94
- <span>{getPriceDifference(roomPrice, selectedRoomPrice)}</span>
95
- </p>
96
- )}
97
- {hasAlternatives && onToggleAlternatives && (
98
- <button type="button" onClick={onToggleAlternatives} className="form__room__alternatives__btn">
99
- {translations.ROOM_OPTIONS_FORM.SHOW_ALTERNATIVES}
100
- </button>
101
- )}
102
- <div className="select-wrapper">
103
- <div className="select-wrapper__select">
104
- <select defaultValue={roomRegimeCode} onChange={handleRegimeChange}>
105
- {room.regimes.map((regime) => (
106
- <option key={regime.code} value={regime.code ?? ''}>
107
- {regime.title} {getPriceDifference(regime.price, roomPrice)}
108
- </option>
109
- ))}
110
- </select>
111
- </div>
112
- </div>
113
- <button type="button" onClick={selectAccommodation} className={buildClassName(['cta', selectedRoomPrice ? 'cta--select' : 'cta--selected'])}>
114
- {selectedRoomPrice ? translations.SHARED.SELECT : translations.SHARED.SELECTED}
115
- </button>
116
- </div>
117
- </div>
118
- </div>
119
- </>
120
- );
121
- };
122
-
123
- export default RoomOption;
1
+ import React, { useEffect, useState } from 'react';
2
+ import { useSelector } from 'react-redux';
3
+ import { getPriceDifferenceText } from '../../../shared/utils/localization-util';
4
+ import { SelectableRoomAccommodation } from '../../types';
5
+ import { selectCurrencyCode, selectTranslations } from '../booking/selectors';
6
+ import { getDatePeriodText, getDateText } from '../sidebar/sidebar-util';
7
+ import { buildClassName } from '../../../shared/utils/class-util';
8
+
9
+ interface RoomOptionProps {
10
+ room: SelectableRoomAccommodation;
11
+ hasAlternatives?: boolean;
12
+ selectedRoomPrice?: number;
13
+ onAcommodationChange?: (accommodationCode: string, regimeCode: string) => void;
14
+ onRegimeChange?: (code: string) => void;
15
+ onToggleAlternatives?: () => void;
16
+ }
17
+
18
+ const RoomOption: React.FC<RoomOptionProps> = ({ room, hasAlternatives, selectedRoomPrice, onAcommodationChange, onRegimeChange, onToggleAlternatives }) => {
19
+ const translations = useSelector(selectTranslations);
20
+ const currencyCode = useSelector(selectCurrencyCode);
21
+
22
+ const [roomPrice, setRoomPrice] = useState<number>(0);
23
+ const [roomRegimeCode, setRoomRegimeCode] = useState<string>(room.regimeCode);
24
+
25
+ useEffect(() => {
26
+ setRoomPrice(room.price);
27
+ }, [room.code, room.regimeCode]);
28
+
29
+ const getPriceDifference = (selectedPrice: number, currentPrice: number) => {
30
+ const priceDifference = (selectedPrice ?? 0) - currentPrice;
31
+ if (priceDifference !== 0) {
32
+ return `(${getPriceDifferenceText(priceDifference, currencyCode)})`;
33
+ } else {
34
+ return '';
35
+ }
36
+ };
37
+
38
+ const selectAccommodation = () => {
39
+ if (onAcommodationChange) {
40
+ onAcommodationChange(room.code, roomRegimeCode);
41
+ }
42
+ };
43
+
44
+ const handleRegimeChange: React.FormEventHandler<HTMLSelectElement> = (e) => {
45
+ let regimeCode = e.currentTarget.value;
46
+
47
+ const option = room.regimes.find((x) => x.code === regimeCode || (x.code === null && regimeCode === ''))!;
48
+ setRoomRegimeCode(option.code);
49
+ setRoomPrice(option.price);
50
+
51
+ if (onRegimeChange) {
52
+ onRegimeChange(regimeCode);
53
+ }
54
+
55
+ e.preventDefault();
56
+ };
57
+
58
+ return (
59
+ <>
60
+ <div className="form__room">
61
+ {room.viewHtml && <div className="form__room__wrapper" dangerouslySetInnerHTML={{ __html: room.viewHtml }} />}
62
+ {!room.viewHtml && (
63
+ <div className="form__room__wrapper">
64
+ {room.image && (
65
+ <div className="form__room__image">
66
+ <img src={room.image} alt="" className="form__room__img" />
67
+ </div>
68
+ )}
69
+ <div className="form__room__body">
70
+ <div className="">
71
+ <h3 className="form__room__title">{room.title}</h3>
72
+ {room.description && <p className="form__room__text">{room.description}</p>}
73
+ <ul className="list--usps form__room__usps">
74
+ {room.usps.map((usp, uspIndex) => (
75
+ <li key={uspIndex} className="list__item">
76
+ {usp}
77
+ </li>
78
+ ))}
79
+ </ul>
80
+ </div>
81
+ </div>
82
+ </div>
83
+ )}
84
+ <div className="form__room__footer">
85
+ <div className="form__room__footer__top">
86
+ <p className="form__room__dates">
87
+ {getDateText(room.from)} - {getDateText(room.to)}
88
+ </p>
89
+ <span className="form__room__days">{getDatePeriodText(translations, room.from, room.to)}</span>
90
+ </div>
91
+ <div className="form__room__footer__bottom">
92
+ {selectedRoomPrice != undefined && (
93
+ <p className="form__room__price form__room__price--increase">
94
+ <span>{getPriceDifference(roomPrice, selectedRoomPrice)}</span>
95
+ </p>
96
+ )}
97
+ {hasAlternatives && onToggleAlternatives && (
98
+ <button type="button" onClick={onToggleAlternatives} className="form__room__alternatives__btn">
99
+ {translations.ROOM_OPTIONS_FORM.SHOW_ALTERNATIVES}
100
+ </button>
101
+ )}
102
+ <div className="select-wrapper">
103
+ <div className="select-wrapper__select">
104
+ <select defaultValue={roomRegimeCode} onChange={handleRegimeChange}>
105
+ {room.regimes.map((regime) => (
106
+ <option key={regime.code} value={regime.code ?? ''}>
107
+ {regime.title} {getPriceDifference(regime.price, roomPrice)}
108
+ </option>
109
+ ))}
110
+ </select>
111
+ </div>
112
+ </div>
113
+ <button type="button" onClick={selectAccommodation} className={buildClassName(['cta', selectedRoomPrice ? 'cta--select' : 'cta--selected'])}>
114
+ {selectedRoomPrice ? translations.SHARED.SELECT : translations.SHARED.SELECTED}
115
+ </button>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </>
120
+ );
121
+ };
122
+
123
+ export default RoomOption;
@@ -1,64 +1,64 @@
1
- import React, { useState } from 'react';
2
- import { SelectableRoom } from '../../types';
3
- import { useSelector } from 'react-redux';
4
- import { selectTranslations } from '../booking/selectors';
5
- import RoomOption from './room';
6
- import { isEmpty } from 'lodash';
7
-
8
- interface TravelerRoomsProps {
9
- index: number;
10
- room: SelectableRoom;
11
- onRoomChange: (index: number, accommodationCode: string, regimeCode: string | null) => void;
12
- }
13
-
14
- const TravelerRooms: React.FC<TravelerRoomsProps> = ({ index, room, onRoomChange }) => {
15
- const translations = useSelector(selectTranslations);
16
- const [showAlternatives, setShowAlternatives] = useState<boolean>(false);
17
-
18
- const selectedAccommodationCode = room.selected.code;
19
-
20
- return (
21
- <div key={room.index} className="form__room__container">
22
- <div className="form__room__header">
23
- <h5>
24
- {translations.ROOM_OPTIONS_FORM.TRAVELER_GROUP} {room.index + 1}
25
- </h5>
26
- </div>
27
-
28
- <RoomOption
29
- room={room.selected}
30
- hasAlternatives={!isEmpty(room.alternatives)}
31
- onRegimeChange={(regimeCode) => onRoomChange(index, selectedAccommodationCode, regimeCode)}
32
- onToggleAlternatives={() => setShowAlternatives(!showAlternatives)}
33
- />
34
-
35
- {!isEmpty(room.alternatives) && showAlternatives && (
36
- <div className="form__room__alternatives">
37
- <div className="form__room__alternatives__header">
38
- {translations.ROOM_OPTIONS_FORM.ALTERNATIVES_TRAVELER_GROUP} {room.index + 1}
39
- </div>
40
-
41
- {showAlternatives && (
42
- <>
43
- <div className="form__room__alternatives__content">
44
- {room.alternatives.map((alternative, alternativeIndex) => (
45
- <RoomOption
46
- key={alternativeIndex}
47
- room={alternative}
48
- selectedRoomPrice={room.selected.price}
49
- onAcommodationChange={(accommodationCode, regimeCode) => {
50
- setShowAlternatives(false);
51
- onRoomChange(index, accommodationCode, regimeCode);
52
- }}
53
- />
54
- ))}
55
- </div>
56
- </>
57
- )}
58
- </div>
59
- )}
60
- </div>
61
- );
62
- };
63
-
64
- export default TravelerRooms;
1
+ import React, { useState } from 'react';
2
+ import { SelectableRoom } from '../../types';
3
+ import { useSelector } from 'react-redux';
4
+ import { selectTranslations } from '../booking/selectors';
5
+ import RoomOption from './room';
6
+ import { isEmpty } from 'lodash';
7
+
8
+ interface TravelerRoomsProps {
9
+ index: number;
10
+ room: SelectableRoom;
11
+ onRoomChange: (index: number, accommodationCode: string, regimeCode: string | null) => void;
12
+ }
13
+
14
+ const TravelerRooms: React.FC<TravelerRoomsProps> = ({ index, room, onRoomChange }) => {
15
+ const translations = useSelector(selectTranslations);
16
+ const [showAlternatives, setShowAlternatives] = useState<boolean>(false);
17
+
18
+ const selectedAccommodationCode = room.selected.code;
19
+
20
+ return (
21
+ <div key={room.index} className="form__room__container">
22
+ <div className="form__room__header">
23
+ <h5>
24
+ {translations.ROOM_OPTIONS_FORM.TRAVELER_GROUP} {room.index + 1}
25
+ </h5>
26
+ </div>
27
+
28
+ <RoomOption
29
+ room={room.selected}
30
+ hasAlternatives={!isEmpty(room.alternatives)}
31
+ onRegimeChange={(regimeCode) => onRoomChange(index, selectedAccommodationCode, regimeCode)}
32
+ onToggleAlternatives={() => setShowAlternatives(!showAlternatives)}
33
+ />
34
+
35
+ {!isEmpty(room.alternatives) && showAlternatives && (
36
+ <div className="form__room__alternatives">
37
+ <div className="form__room__alternatives__header">
38
+ {translations.ROOM_OPTIONS_FORM.ALTERNATIVES_TRAVELER_GROUP} {room.index + 1}
39
+ </div>
40
+
41
+ {showAlternatives && (
42
+ <>
43
+ <div className="form__room__alternatives__content">
44
+ {room.alternatives.map((alternative, alternativeIndex) => (
45
+ <RoomOption
46
+ key={alternativeIndex}
47
+ room={alternative}
48
+ selectedRoomPrice={room.selected.price}
49
+ onAcommodationChange={(accommodationCode, regimeCode) => {
50
+ setShowAlternatives(false);
51
+ onRoomChange(index, accommodationCode, regimeCode);
52
+ }}
53
+ />
54
+ ))}
55
+ </div>
56
+ </>
57
+ )}
58
+ </div>
59
+ )}
60
+ </div>
61
+ );
62
+ };
63
+
64
+ export default TravelerRooms;
@@ -14,6 +14,7 @@ import { selectFormRooms } from '../travelers-form/travelers-form-slice';
14
14
  import {
15
15
  selectBasePrice,
16
16
  selectBasePricePerPaxType,
17
+ selectCommission,
17
18
  selectDeposit,
18
19
  selectIsFetchingPriceDetails,
19
20
  selectSeparateExtraPriceDetails,
@@ -61,6 +62,7 @@ const SidebarContainer: React.FC<SidebarProps> = ({ productName, thumbnailUrl })
61
62
  departureFlightMetaData={departureFlightMetaData}
62
63
  returnFlightMetaData={returnFlightMetaData}
63
64
  basePrice={useSelector(selectBasePrice)}
65
+ commission={useSelector(selectCommission)}
64
66
  totalPrice={useSelector(selectTotalPrice)}
65
67
  includedCosts={useSelector(selectSeparatePackagePriceDetails)}
66
68
  extraCosts={useSelector(selectSeparateExtraPriceDetails)}
@@ -1,66 +1,66 @@
1
- import { BookingPackageFlightMetaData } from '@qite/tide-client/build/types';
2
- import { first, last } from 'lodash';
3
- import React from 'react';
4
- import { useSelector } from 'react-redux';
5
- import { selectTranslations } from '../booking/selectors';
6
- import { getAirlines, getDateText, parseFlightLines } from './sidebar-util';
7
-
8
- interface SidebarFlightProps {
9
- title: string;
10
- flightMetaData: BookingPackageFlightMetaData;
11
- }
12
-
13
- const SidebarFlight: React.FC<SidebarFlightProps> = ({ title, flightMetaData }) => {
14
- const flightLines = parseFlightLines(flightMetaData);
15
- const firstFlight = first(flightLines);
16
- const lastFlight = last(flightLines);
17
- const translations = useSelector(selectTranslations);
18
-
19
- return (
20
- <div className="pricing-summary__group">
21
- <h6 className="pricing-summary__title">{title}</h6>
22
- <div className="pricing-summary__row">
23
- <div className="pricing-summary__property">{translations.SIDEBAR.FLIGHT_DEPARTURE}</div>
24
- <div className="pricing-summary__value pricing-summary__value--flight">
25
- {firstFlight?.departureAirportDescription} ({firstFlight?.departureAirportIata})<br />
26
- {getDateText(firstFlight?.departureDate)} {firstFlight?.departureTime}
27
- <br />
28
- {firstFlight?.airlineCode}
29
- {firstFlight?.number}
30
- </div>
31
- </div>
32
-
33
- <div className="pricing-summary__row">
34
- <div className="pricing-summary__property">{translations.SIDEBAR.FLIGHT_ARRIVAL}</div>
35
- <div className="pricing-summary__value pricing-summary__value--flight">
36
- {lastFlight?.arrivalAirportDescription} ({lastFlight?.arrivalAirportIata})<br />
37
- {getDateText(lastFlight?.arrivalDate)} {lastFlight?.arrivalTime}
38
- <br />
39
- {lastFlight?.airlineCode}
40
- {lastFlight?.number}
41
- </div>
42
- </div>
43
-
44
- <div className="pricing-summary__row">
45
- <div className="pricing-summary__property">
46
- {flightMetaData.flightLines.length > 1 && (
47
- <i>
48
- {flightMetaData.flightLines.length - 1}
49
- {'x '}
50
- {translations.SIDEBAR.CHANGES}
51
- </i>
52
- )}
53
- </div>
54
- <div className="pricing-summary__value">{getAirlines(flightLines)}</div>
55
- </div>
56
- {flightMetaData.luggageIncluded && (
57
- <div className="pricing-summary__row">
58
- <div className="pricing-summary__property"></div>
59
- <div className="pricing-summary__value">{translations.SIDEBAR.LUGGAGE_INCLUDED}</div>
60
- </div>
61
- )}
62
- </div>
63
- );
64
- };
65
-
66
- export default SidebarFlight;
1
+ import { BookingPackageFlightMetaData } from '@qite/tide-client/build/types';
2
+ import { first, last } from 'lodash';
3
+ import React from 'react';
4
+ import { useSelector } from 'react-redux';
5
+ import { selectTranslations } from '../booking/selectors';
6
+ import { getAirlines, getDateText, parseFlightLines } from './sidebar-util';
7
+
8
+ interface SidebarFlightProps {
9
+ title: string;
10
+ flightMetaData: BookingPackageFlightMetaData;
11
+ }
12
+
13
+ const SidebarFlight: React.FC<SidebarFlightProps> = ({ title, flightMetaData }) => {
14
+ const flightLines = parseFlightLines(flightMetaData);
15
+ const firstFlight = first(flightLines);
16
+ const lastFlight = last(flightLines);
17
+ const translations = useSelector(selectTranslations);
18
+
19
+ return (
20
+ <div className="pricing-summary__group">
21
+ <h6 className="pricing-summary__title">{title}</h6>
22
+ <div className="pricing-summary__row">
23
+ <div className="pricing-summary__property">{translations.SIDEBAR.FLIGHT_DEPARTURE}</div>
24
+ <div className="pricing-summary__value pricing-summary__value--flight">
25
+ {firstFlight?.departureAirportDescription} ({firstFlight?.departureAirportIata})<br />
26
+ {getDateText(firstFlight?.departureDate)} {firstFlight?.departureTime}
27
+ <br />
28
+ {firstFlight?.airlineCode}
29
+ {firstFlight?.number}
30
+ </div>
31
+ </div>
32
+
33
+ <div className="pricing-summary__row">
34
+ <div className="pricing-summary__property">{translations.SIDEBAR.FLIGHT_ARRIVAL}</div>
35
+ <div className="pricing-summary__value pricing-summary__value--flight">
36
+ {lastFlight?.arrivalAirportDescription} ({lastFlight?.arrivalAirportIata})<br />
37
+ {getDateText(lastFlight?.arrivalDate)} {lastFlight?.arrivalTime}
38
+ <br />
39
+ {lastFlight?.airlineCode}
40
+ {lastFlight?.number}
41
+ </div>
42
+ </div>
43
+
44
+ <div className="pricing-summary__row">
45
+ <div className="pricing-summary__property">
46
+ {flightMetaData.flightLines.length > 1 && (
47
+ <i>
48
+ {flightMetaData.flightLines.length - 1}
49
+ {'x '}
50
+ {translations.SIDEBAR.CHANGES}
51
+ </i>
52
+ )}
53
+ </div>
54
+ <div className="pricing-summary__value">{getAirlines(flightLines)}</div>
55
+ </div>
56
+ {flightMetaData.luggageIncluded && (
57
+ <div className="pricing-summary__row">
58
+ <div className="pricing-summary__property"></div>
59
+ <div className="pricing-summary__value">{translations.SIDEBAR.LUGGAGE_INCLUDED}</div>
60
+ </div>
61
+ )}
62
+ </div>
63
+ );
64
+ };
65
+
66
+ export default SidebarFlight;
@@ -6,10 +6,11 @@ import { useSelector } from 'react-redux';
6
6
  import { buildClassName } from '../../../shared/utils/class-util';
7
7
  import { formatPrice } from '../../../shared/utils/localization-util';
8
8
  import ProductCard from '../../components/product-card';
9
- import { selectCurrencyCode, selectTranslations } from '../booking/selectors';
9
+ import { selectAgentAdressId, selectCurrencyCode, selectTranslations } from '../booking/selectors';
10
10
  import SidebarFlight from './sidebar-flight';
11
11
  import { getDatePeriodText, getPaxTypeTranslation } from './sidebar-util';
12
12
  import { PricePerPaxType } from '../../types';
13
+ import { selectAgentId } from '../travelers-form/travelers-form-slice';
13
14
 
14
15
  interface SidebarProps {
15
16
  productName: string;
@@ -21,6 +22,7 @@ interface SidebarProps {
21
22
  departureFlightMetaData?: BookingPackageFlightMetaData;
22
23
  returnFlightMetaData?: BookingPackageFlightMetaData;
23
24
  basePrice?: number;
25
+ commission?: number;
24
26
  totalPrice?: number;
25
27
  remainingAmountText?: string;
26
28
  includedCosts?: BookingPriceDetail[];
@@ -47,6 +49,7 @@ const Sidebar: React.FC<SidebarProps> = ({
47
49
  departureFlightMetaData,
48
50
  returnFlightMetaData,
49
51
  basePrice,
52
+ commission,
50
53
  totalPrice,
51
54
  includedCosts,
52
55
  extraCosts,
@@ -64,6 +67,7 @@ const Sidebar: React.FC<SidebarProps> = ({
64
67
  const [active, setActive] = useState<boolean>(false);
65
68
  const translations = useSelector(selectTranslations);
66
69
  const currencyCode = useSelector(selectCurrencyCode);
70
+ const isAgent = useSelector(selectAgentAdressId);
67
71
 
68
72
  const canShowPriceBreakdownSection = Boolean(basePrice && basePrice > 0) || !isEmpty(includedCosts) || !isEmpty(extraCosts);
69
73
  const canShowTotalPriceSection = Boolean(totalPrice && totalPrice > 0);
@@ -250,6 +254,18 @@ const Sidebar: React.FC<SidebarProps> = ({
250
254
  <div className={`pricing-summary__region pricing-summary__region--pricing ${!isLoading ? 'pricing-summary__region--fade-in' : ''}`}>
251
255
  {deposit && remainingAmount > 0 ? (
252
256
  <div className="pricing-summary__group">
257
+ {isAgent && (
258
+ <div className="pricing-summary__row pricing-summary__row--total-price">
259
+ <div className="pricing-summary__property">
260
+ <h6 className="pricing-summary__title">{translations.SHARED.COMMISSION}</h6>
261
+ </div>
262
+ <div className="pricing-summary__value">
263
+ <div className="pricing">
264
+ <div className="pricing__price">{formatPrice(commission ?? 0, currencyCode)}</div>
265
+ </div>
266
+ </div>
267
+ </div>
268
+ )}
253
269
  {totalPrice !== undefined && totalPrice > 0 && (
254
270
  <div className="pricing-summary__row pricing-summary__row--total-price">
255
271
  <div className="pricing-summary__property">
@@ -1,23 +1,23 @@
1
- import { BookingOptionPax } from '@qite/tide-client/build/types';
2
- import { isEmpty } from 'lodash';
3
- import React from 'react';
4
- import SummaryPerPaxOptionGroup from './summary-per-pax-option-group';
5
-
6
- interface SummaryBookingOptionPaxProps {
7
- pax: BookingOptionPax;
8
- }
9
-
10
- const SummaryBookingOptionPax: React.FC<SummaryBookingOptionPaxProps> = ({ pax }) => {
11
- return (
12
- <>
13
- {pax.groups.map((y, i) => {
14
- const paxOptions = y.options.filter((y) => y.isSelected);
15
- if (isEmpty(paxOptions)) return;
16
-
17
- return <SummaryPerPaxOptionGroup key={i} group={y} />;
18
- })}
19
- </>
20
- );
21
- };
22
-
23
- export default SummaryBookingOptionPax;
1
+ import { BookingOptionPax } from '@qite/tide-client/build/types';
2
+ import { isEmpty } from 'lodash';
3
+ import React from 'react';
4
+ import SummaryPerPaxOptionGroup from './summary-per-pax-option-group';
5
+
6
+ interface SummaryBookingOptionPaxProps {
7
+ pax: BookingOptionPax;
8
+ }
9
+
10
+ const SummaryBookingOptionPax: React.FC<SummaryBookingOptionPaxProps> = ({ pax }) => {
11
+ return (
12
+ <>
13
+ {pax.groups.map((y, i) => {
14
+ const paxOptions = y.options.filter((y) => y.isSelected);
15
+ if (isEmpty(paxOptions)) return;
16
+
17
+ return <SummaryPerPaxOptionGroup key={i} group={y} />;
18
+ })}
19
+ </>
20
+ );
21
+ };
22
+
23
+ export default SummaryBookingOptionPax;