@qite/tide-booking-component 1.4.122 → 1.4.124

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 (706) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/.husky/pre-commit +22 -1
  3. package/.prettierignore +32 -0
  4. package/.prettierrc +9 -9
  5. package/.vs/ProjectSettings.json +3 -3
  6. package/.vs/VSWorkspaceState.json +5 -5
  7. package/MEMORY.md +97 -0
  8. package/NEXTSTEPS.md +94 -0
  9. package/README.md +26 -24
  10. package/package.json +10 -1
  11. package/rollup.config.js +16 -16
  12. package/src/booking-product/components/age-select.tsx +35 -35
  13. package/src/booking-product/components/amount-input.tsx +51 -51
  14. package/src/booking-product/components/date-range-picker/calendar-day.tsx +46 -46
  15. package/src/booking-product/components/date-range-picker/calendar.tsx +155 -155
  16. package/src/booking-product/components/date-range-picker/index.tsx +185 -185
  17. package/src/booking-product/components/dates.tsx +153 -153
  18. package/src/booking-product/components/footer.tsx +54 -54
  19. package/src/booking-product/components/header.tsx +58 -57
  20. package/src/booking-product/components/list-view.tsx +54 -54
  21. package/src/booking-product/components/product.tsx +447 -379
  22. package/src/booking-product/components/rating.tsx +21 -21
  23. package/src/booking-product/components/rooms.tsx +192 -171
  24. package/src/booking-product/constants.ts +1 -1
  25. package/src/booking-product/index.tsx +21 -21
  26. package/src/booking-product/settings-context.ts +16 -16
  27. package/src/booking-product/types.ts +68 -30
  28. package/src/booking-product/utils/api.ts +26 -26
  29. package/src/booking-product/utils/price.ts +28 -28
  30. package/src/booking-wizard/api-settings-slice.ts +24 -24
  31. package/src/booking-wizard/components/labeled-input.tsx +56 -56
  32. package/src/booking-wizard/components/labeled-select.tsx +54 -54
  33. package/src/booking-wizard/components/message.tsx +21 -21
  34. package/src/booking-wizard/components/multi-range-filter.tsx +99 -99
  35. package/src/booking-wizard/components/phone-input.tsx +146 -146
  36. package/src/booking-wizard/components/print-offer-button.tsx +53 -53
  37. package/src/booking-wizard/components/step-indicator.tsx +36 -36
  38. package/src/booking-wizard/components/step-route.tsx +51 -51
  39. package/src/booking-wizard/declarations.d.ts +4 -4
  40. package/src/booking-wizard/features/booking/api.ts +44 -44
  41. package/src/booking-wizard/features/booking/booking-self-contained.tsx +364 -318
  42. package/src/booking-wizard/features/booking/booking-slice.ts +634 -634
  43. package/src/booking-wizard/features/booking/booking.tsx +388 -344
  44. package/src/booking-wizard/features/booking/constants.ts +16 -16
  45. package/src/booking-wizard/features/booking/selectors.ts +411 -411
  46. package/src/booking-wizard/features/confirmation/confirmation.tsx +46 -46
  47. package/src/booking-wizard/features/error/error.tsx +71 -71
  48. package/src/booking-wizard/features/flight-options/flight-filter.tsx +371 -371
  49. package/src/booking-wizard/features/flight-options/flight-option-flight.tsx +354 -354
  50. package/src/booking-wizard/features/flight-options/flight-option-modal.tsx +211 -211
  51. package/src/booking-wizard/features/flight-options/flight-option.tsx +57 -57
  52. package/src/booking-wizard/features/flight-options/flight-utils.ts +423 -423
  53. package/src/booking-wizard/features/flight-options/index.tsx +170 -170
  54. package/src/booking-wizard/features/price-details/price-details-api.ts +20 -20
  55. package/src/booking-wizard/features/price-details/price-details-slice.ts +79 -79
  56. package/src/booking-wizard/features/price-details/selectors.ts +118 -118
  57. package/src/booking-wizard/features/price-details/util.ts +115 -115
  58. package/src/booking-wizard/features/product-options/no-options.tsx +18 -18
  59. package/src/booking-wizard/features/product-options/none-option.tsx +73 -73
  60. package/src/booking-wizard/features/product-options/option-booking-airline-group.tsx +53 -53
  61. package/src/booking-wizard/features/product-options/option-booking-group.tsx +152 -152
  62. package/src/booking-wizard/features/product-options/option-item.tsx +236 -236
  63. package/src/booking-wizard/features/product-options/option-pax-card.tsx +159 -159
  64. package/src/booking-wizard/features/product-options/option-pax-group.tsx +122 -122
  65. package/src/booking-wizard/features/product-options/option-room.tsx +226 -226
  66. package/src/booking-wizard/features/product-options/option-unit-group.tsx +138 -138
  67. package/src/booking-wizard/features/product-options/option-units-card.tsx +148 -148
  68. package/src/booking-wizard/features/product-options/options-form.tsx +382 -382
  69. package/src/booking-wizard/features/room-options/index.tsx +132 -132
  70. package/src/booking-wizard/features/room-options/room-utils.ts +154 -154
  71. package/src/booking-wizard/features/room-options/room.tsx +123 -123
  72. package/src/booking-wizard/features/room-options/traveler-rooms.tsx +64 -64
  73. package/src/booking-wizard/features/sidebar/index.tsx +89 -89
  74. package/src/booking-wizard/features/sidebar/sidebar-flight.tsx +66 -66
  75. package/src/booking-wizard/features/sidebar/sidebar-util.ts +143 -143
  76. package/src/booking-wizard/features/sidebar/sidebar.tsx +349 -349
  77. package/src/booking-wizard/features/summary/summary-booking-option-pax.tsx +23 -23
  78. package/src/booking-wizard/features/summary/summary-booking-option-unit.tsx +23 -23
  79. package/src/booking-wizard/features/summary/summary-flight.tsx +36 -36
  80. package/src/booking-wizard/features/summary/summary-per-booking-option-group.tsx +60 -60
  81. package/src/booking-wizard/features/summary/summary-per-pax-option-group.tsx +56 -56
  82. package/src/booking-wizard/features/summary/summary-per-unit-option-group.tsx +58 -58
  83. package/src/booking-wizard/features/summary/summary-slice.ts +27 -27
  84. package/src/booking-wizard/features/summary/summary.tsx +19 -3
  85. package/src/booking-wizard/features/travelers-form/controls/gender-control.tsx +60 -60
  86. package/src/booking-wizard/features/travelers-form/travelers-form-slice.ts +157 -157
  87. package/src/booking-wizard/features/travelers-form/travelers-form-util.ts +10 -10
  88. package/src/booking-wizard/features/travelers-form/travelers-form.tsx +181 -175
  89. package/src/booking-wizard/features/travelers-form/type-ahead-input.tsx +85 -85
  90. package/src/booking-wizard/features/travelers-form/validate-form.ts +178 -178
  91. package/src/booking-wizard/index.tsx +27 -27
  92. package/src/booking-wizard/settings-context.ts +64 -64
  93. package/src/booking-wizard/store.ts +26 -26
  94. package/src/booking-wizard/types.ts +17 -0
  95. package/src/booking-wizard/use-offer-printer.ts +108 -108
  96. package/src/content/components/LanguageSwitcher.tsx +158 -158
  97. package/src/content/components/accordion.tsx +30 -30
  98. package/src/content/components/breadcrumb.tsx +67 -67
  99. package/src/content/components/contact.tsx +210 -210
  100. package/src/content/components/faq.tsx +42 -42
  101. package/src/content/components/gallery.tsx +153 -153
  102. package/src/content/components/image-with-text.tsx +119 -119
  103. package/src/content/components/login.tsx +161 -161
  104. package/src/content/components/personal-contact-form.tsx +809 -809
  105. package/src/content/components/slider.tsx +237 -237
  106. package/src/content/error/error.tsx +27 -27
  107. package/src/content/featured-trips/featured-trip-card.tsx +48 -48
  108. package/src/content/featured-trips/index.tsx +19 -19
  109. package/src/content/featured-trips/types.ts +13 -13
  110. package/src/content/features/content-page/content-page-self-contained.tsx +895 -895
  111. package/src/content/footer/index.tsx +159 -159
  112. package/src/content/footer/types.ts +36 -36
  113. package/src/content/header/index.tsx +43 -43
  114. package/src/content/header/types.ts +26 -26
  115. package/src/content/image-card-grid/index.tsx +34 -34
  116. package/src/content/image-card-grid/types.ts +13 -13
  117. package/src/content/image-with-text-section/card.tsx +58 -58
  118. package/src/content/image-with-text-section/index.tsx +22 -22
  119. package/src/content/image-with-text-section/types.ts +20 -20
  120. package/src/content/login/confirm-component.tsx +149 -149
  121. package/src/content/login/index.tsx +70 -70
  122. package/src/content/login/login-component.tsx +159 -159
  123. package/src/content/login/login-services.ts +109 -109
  124. package/src/content/login/reset-password-component.tsx +191 -191
  125. package/src/content/login/types.ts +29 -29
  126. package/src/content/navbar/index.tsx +354 -354
  127. package/src/content/navbar/placeholderData.tsx +173 -173
  128. package/src/content/navbar/types.ts +43 -43
  129. package/src/index.ts +46 -46
  130. package/src/qsm/components/QSMContainer/qsm-container.tsx +671 -671
  131. package/src/qsm/components/date-picker/index.tsx +152 -152
  132. package/src/qsm/components/date-range-picker/calendar-day.tsx +49 -49
  133. package/src/qsm/components/date-range-picker/calendar.tsx +211 -211
  134. package/src/qsm/components/date-range-picker/index.tsx +404 -404
  135. package/src/qsm/components/double-search-input-group/index.tsx +78 -78
  136. package/src/qsm/components/item-picker/index.tsx +65 -65
  137. package/src/qsm/components/mobile-filter-modal/index.tsx +321 -321
  138. package/src/qsm/components/search-input/index.tsx +91 -91
  139. package/src/qsm/components/search-input-group/index.tsx +209 -209
  140. package/src/qsm/components/travel-class-picker/index.tsx +28 -28
  141. package/src/qsm/components/travel-input/index.tsx +241 -241
  142. package/src/qsm/components/travel-input-group/index.tsx +114 -114
  143. package/src/qsm/components/travel-nationality-picker/index.tsx +28 -28
  144. package/src/qsm/components/travel-type-picker/index.tsx +28 -28
  145. package/src/qsm/index.tsx +26 -26
  146. package/src/qsm/qsm-configuration-context.ts +31 -31
  147. package/src/qsm/store/qsm-slice.ts +282 -282
  148. package/src/qsm/store/qsm-store.ts +13 -13
  149. package/src/qsm/types.ts +110 -110
  150. package/src/search-results/components/book-packaging-entry/index.tsx +266 -266
  151. package/src/search-results/components/book-packaging-entry/wl-sidebar.tsx +173 -173
  152. package/src/search-results/components/excursions/day-by-day-excursions.tsx +168 -168
  153. package/src/search-results/components/excursions/excursion-details.tsx +340 -340
  154. package/src/search-results/components/excursions/excursion-results.tsx +186 -186
  155. package/src/search-results/components/filters/filters.tsx +229 -229
  156. package/src/search-results/components/filters/flight-filters.tsx +671 -671
  157. package/src/search-results/components/flight/flight-banner.tsx +35 -35
  158. package/src/search-results/components/flight/flight-card.tsx +38 -38
  159. package/src/search-results/components/flight/flight-leg.tsx +61 -61
  160. package/src/search-results/components/flight/flight-path.tsx +23 -23
  161. package/src/search-results/components/flight/flight-results.tsx +208 -208
  162. package/src/search-results/components/flight/flight-search-context/index.tsx +628 -628
  163. package/src/search-results/components/flight/flight-selection/independent-flight-option.tsx +168 -168
  164. package/src/search-results/components/flight/flight-selection/independent-flight-selection.tsx +184 -184
  165. package/src/search-results/components/flight/flight-selection/index.tsx +19 -19
  166. package/src/search-results/components/flight/flight-selection/paired-flight-option.tsx +255 -255
  167. package/src/search-results/components/flight/flight-selection/paired-flight-selection.tsx +38 -38
  168. package/src/search-results/components/group-tour/group-tour-card.tsx +105 -105
  169. package/src/search-results/components/group-tour/group-tour-results.tsx +62 -62
  170. package/src/search-results/components/hotel/hotel-accommodation-results.tsx +244 -244
  171. package/src/search-results/components/hotel/hotel-card.tsx +110 -110
  172. package/src/search-results/components/item-picker/index.tsx +81 -81
  173. package/src/search-results/components/itinerary/full-itinerary.tsx +374 -374
  174. package/src/search-results/components/itinerary/index.tsx +437 -437
  175. package/src/search-results/components/multi-range-filter.tsx +104 -104
  176. package/src/search-results/components/round-trip/round-trip-results.tsx +199 -199
  177. package/src/search-results/components/search-results-container/flight-search-results.tsx +137 -137
  178. package/src/search-results/components/search-results-container/search-results-container.tsx +1764 -1764
  179. package/src/search-results/components/spinner/spinner.tsx +24 -24
  180. package/src/search-results/components/tab-views/index.tsx +53 -53
  181. package/src/search-results/features/flights/flight-search-results-self-contained.tsx +294 -294
  182. package/src/search-results/features/hotels/hotel-flight-search-results-self-contained.tsx +143 -143
  183. package/src/search-results/features/hotels/hotel-search-results-self-contained.tsx +220 -220
  184. package/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.tsx +65 -65
  185. package/src/search-results/index.tsx +25 -25
  186. package/src/search-results/search-results-configuration-context.ts +6 -6
  187. package/src/search-results/store/search-results-selectors.ts +84 -84
  188. package/src/search-results/store/search-results-slice.ts +351 -351
  189. package/src/search-results/store/search-results-store.ts +13 -13
  190. package/src/search-results/types.ts +266 -266
  191. package/src/search-results/utils/flight-utils.ts +98 -98
  192. package/src/search-results/utils/packaging-utils.ts +75 -75
  193. package/src/search-results/utils/query-utils.ts +153 -153
  194. package/src/search-results/utils/search-results-utils.ts +538 -538
  195. package/src/shared/booking/booking-panel.tsx +25 -25
  196. package/src/shared/booking/product-card.tsx +23 -23
  197. package/src/shared/booking/shared-confirmation.tsx +105 -105
  198. package/src/shared/booking/shared-sidebar.tsx +432 -432
  199. package/src/shared/booking/step-indicators.tsx +30 -30
  200. package/src/shared/booking/summary.tsx +382 -382
  201. package/src/shared/booking/travelers-form.tsx +874 -874
  202. package/src/shared/components/flyin/accommodation-flyin.tsx +424 -424
  203. package/src/shared/components/flyin/flights-flyin.tsx +508 -508
  204. package/src/shared/components/flyin/flyin.tsx +241 -241
  205. package/src/shared/components/flyin/group-tour-flyin.tsx +294 -294
  206. package/src/shared/components/flyin/packaging-flights-flyin.tsx +171 -171
  207. package/src/shared/components/icon.tsx +1114 -1114
  208. package/src/shared/components/loader.tsx +16 -16
  209. package/src/shared/translations/ar-SA.json +398 -398
  210. package/src/shared/translations/da-DK.json +398 -398
  211. package/src/shared/translations/de-DE.json +398 -398
  212. package/src/shared/translations/en-GB.json +402 -402
  213. package/src/shared/translations/es-ES.json +398 -398
  214. package/src/shared/translations/fr-BE.json +402 -402
  215. package/src/shared/translations/fr-FR.json +398 -398
  216. package/src/shared/translations/is-IS.json +398 -398
  217. package/src/shared/translations/it-IT.json +398 -398
  218. package/src/shared/translations/ja-JP.json +398 -398
  219. package/src/shared/translations/nl-BE.json +402 -402
  220. package/src/shared/translations/nl-NL.json +398 -398
  221. package/src/shared/translations/no-NO.json +398 -398
  222. package/src/shared/translations/pl-PL.json +398 -398
  223. package/src/shared/translations/pt-PT.json +398 -398
  224. package/src/shared/translations/sv-SE.json +398 -398
  225. package/src/shared/types.ts +31 -31
  226. package/src/shared/utils/booking-summary.tsx +57 -57
  227. package/src/shared/utils/class-util.ts +7 -7
  228. package/src/shared/utils/localization-util.ts +316 -301
  229. package/src/shared/utils/query-string-util.ts +91 -91
  230. package/src/shared/utils/tide-api-utils.ts +42 -42
  231. package/src/shared/utils/use-media-query-util.ts +19 -19
  232. package/styles/abstracts/_mixins.scss +74 -74
  233. package/styles/abstracts/_variables.scss +57 -57
  234. package/styles/base/_fonts.scss +2 -2
  235. package/styles/base/_normalize.scss +227 -227
  236. package/styles/base/_typography.scss +35 -35
  237. package/styles/booking-joker-variables.scss +596 -596
  238. package/styles/booking-product-variables.scss +330 -330
  239. package/styles/booking-product.scss +438 -438
  240. package/styles/booking-qsm-variables.scss +501 -501
  241. package/styles/booking-qsm.scss +52 -52
  242. package/styles/booking-search-results-variables.scss +728 -728
  243. package/styles/booking-search-results.scss +53 -53
  244. package/styles/booking-wizard-variables.scss +603 -603
  245. package/styles/booking-wizard.scss +61 -61
  246. package/styles/components/_accordion.scss +67 -67
  247. package/styles/components/_animations.scss +39 -39
  248. package/styles/components/_base.scss +107 -107
  249. package/styles/components/_booking.scss +906 -906
  250. package/styles/components/_breadcrumb.scss +92 -92
  251. package/styles/components/_button.scss +238 -238
  252. package/styles/components/_checkbox.scss +230 -230
  253. package/styles/components/_contact.scss +255 -239
  254. package/styles/components/_content.scss +336 -336
  255. package/styles/components/_cta.scss +238 -238
  256. package/styles/components/_date-list.scss +41 -41
  257. package/styles/components/_date-range-picker.scss +223 -223
  258. package/styles/components/_decrement-increment.scss +35 -35
  259. package/styles/components/_dropdown.scss +77 -77
  260. package/styles/components/_error.scss +50 -50
  261. package/styles/components/_faq.scss +30 -30
  262. package/styles/components/_flight-option.scss +1432 -1432
  263. package/styles/components/_flyin.scss +830 -830
  264. package/styles/components/_footer.scss +135 -135
  265. package/styles/components/_form.scss +1693 -1693
  266. package/styles/components/_gallery.scss +317 -317
  267. package/styles/components/_header.scss +113 -113
  268. package/styles/components/_image-with-text.scss +206 -206
  269. package/styles/components/_img-slider.scss +175 -175
  270. package/styles/components/_info-message.scss +75 -75
  271. package/styles/components/_input.scss +35 -35
  272. package/styles/components/_list.scss +185 -185
  273. package/styles/components/_loader.scss +152 -152
  274. package/styles/components/_login.scss +140 -140
  275. package/styles/components/_mixins.scss +579 -579
  276. package/styles/components/_navbar.scss +765 -765
  277. package/styles/components/_passenger-picker.scss +306 -306
  278. package/styles/components/_phone-input.scss +8 -8
  279. package/styles/components/_placeholders.scss +165 -165
  280. package/styles/components/_pricing-summary.scss +163 -163
  281. package/styles/components/_qsm.scss +17 -17
  282. package/styles/components/_radiobutton.scss +170 -170
  283. package/styles/components/_search.scss +2089 -2089
  284. package/styles/components/_select-wrapper.scss +81 -81
  285. package/styles/components/_slider.scss +128 -128
  286. package/styles/components/_spinner.scss +29 -29
  287. package/styles/components/_step-indicators.scss +187 -187
  288. package/styles/components/_table.scss +81 -81
  289. package/styles/components/_tree.scss +648 -648
  290. package/styles/components/_typeahead.scss +275 -275
  291. package/styles/components/_variables.scss +89 -89
  292. package/styles/content-blocks-variables.scss +507 -507
  293. package/styles/content-blocks.scss +65 -65
  294. package/styles/font.scss +2 -2
  295. package/styles/qsm/_calendar.scss +274 -274
  296. package/styles/qsm/_qsm.scss +1097 -1097
  297. package/styles/search.scss +1200 -1200
  298. package/tsconfig.json +24 -24
  299. package/build/build-cjs/index.js +0 -57386
  300. package/build/build-cjs/src/booking-product/components/age-select.d.ts +0 -8
  301. package/build/build-cjs/src/booking-product/components/amount-input.d.ts +0 -10
  302. package/build/build-cjs/src/booking-product/components/date-range-picker/calendar-day.d.ts +0 -13
  303. package/build/build-cjs/src/booking-product/components/date-range-picker/calendar.d.ts +0 -19
  304. package/build/build-cjs/src/booking-product/components/date-range-picker/index.d.ts +0 -22
  305. package/build/build-cjs/src/booking-product/components/dates.d.ts +0 -14
  306. package/build/build-cjs/src/booking-product/components/footer.d.ts +0 -10
  307. package/build/build-cjs/src/booking-product/components/header.d.ts +0 -11
  308. package/build/build-cjs/src/booking-product/components/list-view.d.ts +0 -8
  309. package/build/build-cjs/src/booking-product/components/product.d.ts +0 -9
  310. package/build/build-cjs/src/booking-product/components/rating.d.ts +0 -6
  311. package/build/build-cjs/src/booking-product/components/rooms.d.ts +0 -10
  312. package/build/build-cjs/src/booking-product/constants.d.ts +0 -1
  313. package/build/build-cjs/src/booking-product/index.d.ts +0 -10
  314. package/build/build-cjs/src/booking-product/settings-context.d.ts +0 -5
  315. package/build/build-cjs/src/booking-product/types.d.ts +0 -27
  316. package/build/build-cjs/src/booking-product/utils/api.d.ts +0 -16
  317. package/build/build-cjs/src/booking-product/utils/price.d.ts +0 -10
  318. package/build/build-cjs/src/booking-wizard/api-settings-slice.d.ts +0 -5
  319. package/build/build-cjs/src/booking-wizard/components/labeled-input.d.ts +0 -18
  320. package/build/build-cjs/src/booking-wizard/components/labeled-select.d.ts +0 -21
  321. package/build/build-cjs/src/booking-wizard/components/message.d.ts +0 -9
  322. package/build/build-cjs/src/booking-wizard/components/multi-range-filter.d.ts +0 -11
  323. package/build/build-cjs/src/booking-wizard/components/phone-input.d.ts +0 -17
  324. package/build/build-cjs/src/booking-wizard/components/print-offer-button.d.ts +0 -17
  325. package/build/build-cjs/src/booking-wizard/components/step-indicator.d.ts +0 -6
  326. package/build/build-cjs/src/booking-wizard/components/step-route.d.ts +0 -8
  327. package/build/build-cjs/src/booking-wizard/features/booking/api.d.ts +0 -30
  328. package/build/build-cjs/src/booking-wizard/features/booking/booking-self-contained.d.ts +0 -8
  329. package/build/build-cjs/src/booking-wizard/features/booking/booking-slice.d.ts +0 -121
  330. package/build/build-cjs/src/booking-wizard/features/booking/booking.d.ts +0 -8
  331. package/build/build-cjs/src/booking-wizard/features/booking/constants.d.ts +0 -15
  332. package/build/build-cjs/src/booking-wizard/features/booking/selectors.d.ts +0 -803
  333. package/build/build-cjs/src/booking-wizard/features/confirmation/confirmation.d.ts +0 -4
  334. package/build/build-cjs/src/booking-wizard/features/error/error.d.ts +0 -4
  335. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-filter.d.ts +0 -9
  336. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-option-flight.d.ts +0 -8
  337. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-option-modal.d.ts +0 -3
  338. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-option.d.ts +0 -10
  339. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-utils.d.ts +0 -13
  340. package/build/build-cjs/src/booking-wizard/features/flight-options/index.d.ts +0 -4
  341. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-api.d.ts +0 -11
  342. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-slice.d.ts +0 -28
  343. package/build/build-cjs/src/booking-wizard/features/price-details/selectors.d.ts +0 -393
  344. package/build/build-cjs/src/booking-wizard/features/price-details/util.d.ts +0 -2
  345. package/build/build-cjs/src/booking-wizard/features/product-options/no-options.d.ts +0 -3
  346. package/build/build-cjs/src/booking-wizard/features/product-options/none-option.d.ts +0 -9
  347. package/build/build-cjs/src/booking-wizard/features/product-options/option-booking-airline-group.d.ts +0 -8
  348. package/build/build-cjs/src/booking-wizard/features/product-options/option-booking-group.d.ts +0 -12
  349. package/build/build-cjs/src/booking-wizard/features/product-options/option-item.d.ts +0 -11
  350. package/build/build-cjs/src/booking-wizard/features/product-options/option-pax-card.d.ts +0 -10
  351. package/build/build-cjs/src/booking-wizard/features/product-options/option-pax-group.d.ts +0 -13
  352. package/build/build-cjs/src/booking-wizard/features/product-options/option-room.d.ts +0 -11
  353. package/build/build-cjs/src/booking-wizard/features/product-options/option-unit-group.d.ts +0 -13
  354. package/build/build-cjs/src/booking-wizard/features/product-options/option-units-card.d.ts +0 -9
  355. package/build/build-cjs/src/booking-wizard/features/product-options/options-form.d.ts +0 -4
  356. package/build/build-cjs/src/booking-wizard/features/room-options/index.d.ts +0 -4
  357. package/build/build-cjs/src/booking-wizard/features/room-options/room-utils.d.ts +0 -22
  358. package/build/build-cjs/src/booking-wizard/features/room-options/room.d.ts +0 -12
  359. package/build/build-cjs/src/booking-wizard/features/room-options/traveler-rooms.d.ts +0 -9
  360. package/build/build-cjs/src/booking-wizard/features/sidebar/index.d.ts +0 -7
  361. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar-flight.d.ts +0 -9
  362. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar-util.d.ts +0 -16
  363. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar.d.ts +0 -0
  364. package/build/build-cjs/src/booking-wizard/features/summary/summary-booking-option-pax.d.ts +0 -7
  365. package/build/build-cjs/src/booking-wizard/features/summary/summary-booking-option-unit.d.ts +0 -7
  366. package/build/build-cjs/src/booking-wizard/features/summary/summary-flight.d.ts +0 -8
  367. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-booking-option-group.d.ts +0 -7
  368. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-pax-option-group.d.ts +0 -7
  369. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-unit-option-group.d.ts +0 -7
  370. package/build/build-cjs/src/booking-wizard/features/summary/summary-slice.d.ts +0 -8
  371. package/build/build-cjs/src/booking-wizard/features/summary/summary.d.ts +0 -4
  372. package/build/build-cjs/src/booking-wizard/features/travelers-form/controls/gender-control.d.ts +0 -5
  373. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form-slice.d.ts +0 -104
  374. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form-util.d.ts +0 -7
  375. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form.d.ts +0 -3
  376. package/build/build-cjs/src/booking-wizard/features/travelers-form/type-ahead-input.d.ts +0 -16
  377. package/build/build-cjs/src/booking-wizard/features/travelers-form/validate-form.d.ts +0 -11
  378. package/build/build-cjs/src/booking-wizard/index.d.ts +0 -12
  379. package/build/build-cjs/src/booking-wizard/settings-context.d.ts +0 -5
  380. package/build/build-cjs/src/booking-wizard/store.d.ts +0 -44
  381. package/build/build-cjs/src/booking-wizard/types.d.ts +0 -301
  382. package/build/build-cjs/src/booking-wizard/use-offer-printer.d.ts +0 -13
  383. package/build/build-cjs/src/content/components/LanguageSwitcher.d.ts +0 -12
  384. package/build/build-cjs/src/content/components/accordion.d.ts +0 -9
  385. package/build/build-cjs/src/content/components/breadcrumb.d.ts +0 -14
  386. package/build/build-cjs/src/content/components/contact.d.ts +0 -3
  387. package/build/build-cjs/src/content/components/faq.d.ts +0 -11
  388. package/build/build-cjs/src/content/components/gallery.d.ts +0 -13
  389. package/build/build-cjs/src/content/components/image-with-text.d.ts +0 -29
  390. package/build/build-cjs/src/content/components/login.d.ts +0 -3
  391. package/build/build-cjs/src/content/components/personal-contact-form.d.ts +0 -3
  392. package/build/build-cjs/src/content/components/slider.d.ts +0 -10
  393. package/build/build-cjs/src/content/error/error.d.ts +0 -6
  394. package/build/build-cjs/src/content/featured-trips/featured-trip-card.d.ts +0 -4
  395. package/build/build-cjs/src/content/featured-trips/index.d.ts +0 -4
  396. package/build/build-cjs/src/content/featured-trips/types.d.ts +0 -12
  397. package/build/build-cjs/src/content/features/content-page/content-page-self-contained.d.ts +0 -6
  398. package/build/build-cjs/src/content/footer/index.d.ts +0 -4
  399. package/build/build-cjs/src/content/footer/types.d.ts +0 -27
  400. package/build/build-cjs/src/content/header/index.d.ts +0 -4
  401. package/build/build-cjs/src/content/header/types.d.ts +0 -25
  402. package/build/build-cjs/src/content/image-card-grid/index.d.ts +0 -4
  403. package/build/build-cjs/src/content/image-card-grid/types.d.ts +0 -12
  404. package/build/build-cjs/src/content/image-with-text-section/card.d.ts +0 -4
  405. package/build/build-cjs/src/content/image-with-text-section/index.d.ts +0 -4
  406. package/build/build-cjs/src/content/image-with-text-section/types.d.ts +0 -19
  407. package/build/build-cjs/src/content/login/confirm-component.d.ts +0 -4
  408. package/build/build-cjs/src/content/login/index.d.ts +0 -4
  409. package/build/build-cjs/src/content/login/login-component.d.ts +0 -4
  410. package/build/build-cjs/src/content/login/login-services.d.ts +0 -11
  411. package/build/build-cjs/src/content/login/reset-password-component.d.ts +0 -4
  412. package/build/build-cjs/src/content/login/types.d.ts +0 -24
  413. package/build/build-cjs/src/content/navbar/index.d.ts +0 -4
  414. package/build/build-cjs/src/content/navbar/placeholderData.d.ts +0 -12
  415. package/build/build-cjs/src/content/navbar/types.d.ts +0 -32
  416. package/build/build-cjs/src/index.d.ts +0 -44
  417. package/build/build-cjs/src/qsm/components/QSMContainer/qsm-container.d.ts +0 -3
  418. package/build/build-cjs/src/qsm/components/date-picker/index.d.ts +0 -3
  419. package/build/build-cjs/src/qsm/components/date-range-picker/calendar-day.d.ts +0 -12
  420. package/build/build-cjs/src/qsm/components/date-range-picker/calendar.d.ts +0 -24
  421. package/build/build-cjs/src/qsm/components/date-range-picker/index.d.ts +0 -10
  422. package/build/build-cjs/src/qsm/components/double-search-input-group/index.d.ts +0 -8
  423. package/build/build-cjs/src/qsm/components/item-picker/index.d.ts +0 -13
  424. package/build/build-cjs/src/qsm/components/mobile-filter-modal/index.d.ts +0 -3
  425. package/build/build-cjs/src/qsm/components/search-input/index.d.ts +0 -15
  426. package/build/build-cjs/src/qsm/components/search-input-group/index.d.ts +0 -13
  427. package/build/build-cjs/src/qsm/components/travel-class-picker/index.d.ts +0 -3
  428. package/build/build-cjs/src/qsm/components/travel-input/index.d.ts +0 -3
  429. package/build/build-cjs/src/qsm/components/travel-input-group/index.d.ts +0 -3
  430. package/build/build-cjs/src/qsm/components/travel-nationality-picker/index.d.ts +0 -3
  431. package/build/build-cjs/src/qsm/components/travel-type-picker/index.d.ts +0 -3
  432. package/build/build-cjs/src/qsm/index.d.ts +0 -7
  433. package/build/build-cjs/src/qsm/qsm-configuration-context.d.ts +0 -4
  434. package/build/build-cjs/src/qsm/store/qsm-slice.d.ts +0 -127
  435. package/build/build-cjs/src/qsm/store/qsm-store.d.ts +0 -23
  436. package/build/build-cjs/src/qsm/types.d.ts +0 -82
  437. package/build/build-cjs/src/search-results/components/book-packaging-entry/index.d.ts +0 -9
  438. package/build/build-cjs/src/search-results/components/book-packaging-entry/wl-sidebar.d.ts +0 -9
  439. package/build/build-cjs/src/search-results/components/excursions/day-by-day-excursions.d.ts +0 -4
  440. package/build/build-cjs/src/search-results/components/excursions/excursion-details.d.ts +0 -3
  441. package/build/build-cjs/src/search-results/components/excursions/excursion-results.d.ts +0 -8
  442. package/build/build-cjs/src/search-results/components/filters/filters.d.ts +0 -13
  443. package/build/build-cjs/src/search-results/components/filters/flight-filters.d.ts +0 -8
  444. package/build/build-cjs/src/search-results/components/flight/flight-banner.d.ts +0 -8
  445. package/build/build-cjs/src/search-results/components/flight/flight-card.d.ts +0 -7
  446. package/build/build-cjs/src/search-results/components/flight/flight-leg.d.ts +0 -7
  447. package/build/build-cjs/src/search-results/components/flight/flight-path.d.ts +0 -6
  448. package/build/build-cjs/src/search-results/components/flight/flight-results.d.ts +0 -8
  449. package/build/build-cjs/src/search-results/components/flight/flight-search-context/index.d.ts +0 -39
  450. package/build/build-cjs/src/search-results/components/flight/flight-selection/independent-flight-option.d.ts +0 -14
  451. package/build/build-cjs/src/search-results/components/flight/flight-selection/independent-flight-selection.d.ts +0 -7
  452. package/build/build-cjs/src/search-results/components/flight/flight-selection/index.d.ts +0 -8
  453. package/build/build-cjs/src/search-results/components/flight/flight-selection/paired-flight-option.d.ts +0 -7
  454. package/build/build-cjs/src/search-results/components/flight/flight-selection/paired-flight-selection.d.ts +0 -7
  455. package/build/build-cjs/src/search-results/components/group-tour/group-tour-card.d.ts +0 -9
  456. package/build/build-cjs/src/search-results/components/group-tour/group-tour-results.d.ts +0 -6
  457. package/build/build-cjs/src/search-results/components/hotel/hotel-accommodation-results.d.ts +0 -7
  458. package/build/build-cjs/src/search-results/components/hotel/hotel-card.d.ts +0 -8
  459. package/build/build-cjs/src/search-results/components/item-picker/index.d.ts +0 -15
  460. package/build/build-cjs/src/search-results/components/itinerary/full-itinerary.d.ts +0 -6
  461. package/build/build-cjs/src/search-results/components/itinerary/index.d.ts +0 -10
  462. package/build/build-cjs/src/search-results/components/multi-range-filter.d.ts +0 -11
  463. package/build/build-cjs/src/search-results/components/round-trip/round-trip-results.d.ts +0 -4
  464. package/build/build-cjs/src/search-results/components/search-results-container/flight-search-results.d.ts +0 -6
  465. package/build/build-cjs/src/search-results/components/search-results-container/search-results-container.d.ts +0 -6
  466. package/build/build-cjs/src/search-results/components/spinner/spinner.d.ts +0 -6
  467. package/build/build-cjs/src/search-results/components/tab-views/index.d.ts +0 -4
  468. package/build/build-cjs/src/search-results/features/flights/flight-search-results-self-contained.d.ts +0 -4
  469. package/build/build-cjs/src/search-results/features/hotels/hotel-flight-search-results-self-contained.d.ts +0 -4
  470. package/build/build-cjs/src/search-results/features/hotels/hotel-search-results-self-contained.d.ts +0 -4
  471. package/build/build-cjs/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.d.ts +0 -4
  472. package/build/build-cjs/src/search-results/index.d.ts +0 -8
  473. package/build/build-cjs/src/search-results/search-results-configuration-context.d.ts +0 -4
  474. package/build/build-cjs/src/search-results/store/search-results-selectors.d.ts +0 -546
  475. package/build/build-cjs/src/search-results/store/search-results-slice.d.ts +0 -138
  476. package/build/build-cjs/src/search-results/store/search-results-store.d.ts +0 -23
  477. package/build/build-cjs/src/search-results/types.d.ts +0 -211
  478. package/build/build-cjs/src/search-results/utils/flight-utils.d.ts +0 -16
  479. package/build/build-cjs/src/search-results/utils/packaging-utils.d.ts +0 -7
  480. package/build/build-cjs/src/search-results/utils/query-utils.d.ts +0 -12
  481. package/build/build-cjs/src/search-results/utils/search-results-utils.d.ts +0 -16
  482. package/build/build-cjs/src/shared/booking/booking-panel.d.ts +0 -13
  483. package/build/build-cjs/src/shared/booking/product-card.d.ts +0 -8
  484. package/build/build-cjs/src/shared/booking/shared-confirmation.d.ts +0 -25
  485. package/build/build-cjs/src/shared/booking/shared-sidebar.d.ts +0 -34
  486. package/build/build-cjs/src/shared/booking/step-indicators.d.ts +0 -7
  487. package/build/build-cjs/src/shared/booking/summary.d.ts +0 -44
  488. package/build/build-cjs/src/shared/booking/travelers-form.d.ts +0 -93
  489. package/build/build-cjs/src/shared/components/flyin/accommodation-flyin.d.ts +0 -7
  490. package/build/build-cjs/src/shared/components/flyin/flights-flyin.d.ts +0 -7
  491. package/build/build-cjs/src/shared/components/flyin/flyin.d.ts +0 -20
  492. package/build/build-cjs/src/shared/components/flyin/group-tour-flyin.d.ts +0 -8
  493. package/build/build-cjs/src/shared/components/flyin/packaging-flights-flyin.d.ts +0 -9
  494. package/build/build-cjs/src/shared/components/icon.d.ts +0 -11
  495. package/build/build-cjs/src/shared/components/loader.d.ts +0 -6
  496. package/build/build-cjs/src/shared/types.d.ts +0 -16
  497. package/build/build-cjs/src/shared/utils/booking-summary.d.ts +0 -2
  498. package/build/build-cjs/src/shared/utils/class-util.d.ts +0 -1
  499. package/build/build-cjs/src/shared/utils/localization-util.d.ts +0 -440
  500. package/build/build-cjs/src/shared/utils/query-string-util.d.ts +0 -8
  501. package/build/build-cjs/src/shared/utils/tide-api-utils.d.ts +0 -10
  502. package/build/build-cjs/src/shared/utils/use-media-query-util.d.ts +0 -2
  503. package/build/build-esm/index.js +0 -57136
  504. package/build/build-esm/src/booking-product/components/age-select.d.ts +0 -8
  505. package/build/build-esm/src/booking-product/components/amount-input.d.ts +0 -10
  506. package/build/build-esm/src/booking-product/components/date-range-picker/calendar-day.d.ts +0 -13
  507. package/build/build-esm/src/booking-product/components/date-range-picker/calendar.d.ts +0 -19
  508. package/build/build-esm/src/booking-product/components/date-range-picker/index.d.ts +0 -22
  509. package/build/build-esm/src/booking-product/components/dates.d.ts +0 -14
  510. package/build/build-esm/src/booking-product/components/footer.d.ts +0 -10
  511. package/build/build-esm/src/booking-product/components/header.d.ts +0 -11
  512. package/build/build-esm/src/booking-product/components/list-view.d.ts +0 -8
  513. package/build/build-esm/src/booking-product/components/product.d.ts +0 -9
  514. package/build/build-esm/src/booking-product/components/rating.d.ts +0 -6
  515. package/build/build-esm/src/booking-product/components/rooms.d.ts +0 -10
  516. package/build/build-esm/src/booking-product/constants.d.ts +0 -1
  517. package/build/build-esm/src/booking-product/index.d.ts +0 -10
  518. package/build/build-esm/src/booking-product/settings-context.d.ts +0 -5
  519. package/build/build-esm/src/booking-product/types.d.ts +0 -27
  520. package/build/build-esm/src/booking-product/utils/api.d.ts +0 -16
  521. package/build/build-esm/src/booking-product/utils/price.d.ts +0 -10
  522. package/build/build-esm/src/booking-wizard/api-settings-slice.d.ts +0 -5
  523. package/build/build-esm/src/booking-wizard/components/labeled-input.d.ts +0 -18
  524. package/build/build-esm/src/booking-wizard/components/labeled-select.d.ts +0 -21
  525. package/build/build-esm/src/booking-wizard/components/message.d.ts +0 -9
  526. package/build/build-esm/src/booking-wizard/components/multi-range-filter.d.ts +0 -11
  527. package/build/build-esm/src/booking-wizard/components/phone-input.d.ts +0 -17
  528. package/build/build-esm/src/booking-wizard/components/print-offer-button.d.ts +0 -17
  529. package/build/build-esm/src/booking-wizard/components/step-indicator.d.ts +0 -6
  530. package/build/build-esm/src/booking-wizard/components/step-route.d.ts +0 -8
  531. package/build/build-esm/src/booking-wizard/features/booking/api.d.ts +0 -30
  532. package/build/build-esm/src/booking-wizard/features/booking/booking-self-contained.d.ts +0 -8
  533. package/build/build-esm/src/booking-wizard/features/booking/booking-slice.d.ts +0 -121
  534. package/build/build-esm/src/booking-wizard/features/booking/booking.d.ts +0 -8
  535. package/build/build-esm/src/booking-wizard/features/booking/constants.d.ts +0 -15
  536. package/build/build-esm/src/booking-wizard/features/booking/selectors.d.ts +0 -803
  537. package/build/build-esm/src/booking-wizard/features/confirmation/confirmation.d.ts +0 -4
  538. package/build/build-esm/src/booking-wizard/features/error/error.d.ts +0 -4
  539. package/build/build-esm/src/booking-wizard/features/flight-options/flight-filter.d.ts +0 -9
  540. package/build/build-esm/src/booking-wizard/features/flight-options/flight-option-flight.d.ts +0 -8
  541. package/build/build-esm/src/booking-wizard/features/flight-options/flight-option-modal.d.ts +0 -3
  542. package/build/build-esm/src/booking-wizard/features/flight-options/flight-option.d.ts +0 -10
  543. package/build/build-esm/src/booking-wizard/features/flight-options/flight-utils.d.ts +0 -13
  544. package/build/build-esm/src/booking-wizard/features/flight-options/index.d.ts +0 -4
  545. package/build/build-esm/src/booking-wizard/features/price-details/price-details-api.d.ts +0 -11
  546. package/build/build-esm/src/booking-wizard/features/price-details/price-details-slice.d.ts +0 -28
  547. package/build/build-esm/src/booking-wizard/features/price-details/selectors.d.ts +0 -393
  548. package/build/build-esm/src/booking-wizard/features/price-details/util.d.ts +0 -2
  549. package/build/build-esm/src/booking-wizard/features/product-options/no-options.d.ts +0 -3
  550. package/build/build-esm/src/booking-wizard/features/product-options/none-option.d.ts +0 -9
  551. package/build/build-esm/src/booking-wizard/features/product-options/option-booking-airline-group.d.ts +0 -8
  552. package/build/build-esm/src/booking-wizard/features/product-options/option-booking-group.d.ts +0 -12
  553. package/build/build-esm/src/booking-wizard/features/product-options/option-item.d.ts +0 -11
  554. package/build/build-esm/src/booking-wizard/features/product-options/option-pax-card.d.ts +0 -10
  555. package/build/build-esm/src/booking-wizard/features/product-options/option-pax-group.d.ts +0 -13
  556. package/build/build-esm/src/booking-wizard/features/product-options/option-room.d.ts +0 -11
  557. package/build/build-esm/src/booking-wizard/features/product-options/option-unit-group.d.ts +0 -13
  558. package/build/build-esm/src/booking-wizard/features/product-options/option-units-card.d.ts +0 -9
  559. package/build/build-esm/src/booking-wizard/features/product-options/options-form.d.ts +0 -4
  560. package/build/build-esm/src/booking-wizard/features/room-options/index.d.ts +0 -4
  561. package/build/build-esm/src/booking-wizard/features/room-options/room-utils.d.ts +0 -22
  562. package/build/build-esm/src/booking-wizard/features/room-options/room.d.ts +0 -12
  563. package/build/build-esm/src/booking-wizard/features/room-options/traveler-rooms.d.ts +0 -9
  564. package/build/build-esm/src/booking-wizard/features/sidebar/index.d.ts +0 -7
  565. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar-flight.d.ts +0 -9
  566. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar-util.d.ts +0 -16
  567. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar.d.ts +0 -0
  568. package/build/build-esm/src/booking-wizard/features/summary/summary-booking-option-pax.d.ts +0 -7
  569. package/build/build-esm/src/booking-wizard/features/summary/summary-booking-option-unit.d.ts +0 -7
  570. package/build/build-esm/src/booking-wizard/features/summary/summary-flight.d.ts +0 -8
  571. package/build/build-esm/src/booking-wizard/features/summary/summary-per-booking-option-group.d.ts +0 -7
  572. package/build/build-esm/src/booking-wizard/features/summary/summary-per-pax-option-group.d.ts +0 -7
  573. package/build/build-esm/src/booking-wizard/features/summary/summary-per-unit-option-group.d.ts +0 -7
  574. package/build/build-esm/src/booking-wizard/features/summary/summary-slice.d.ts +0 -8
  575. package/build/build-esm/src/booking-wizard/features/summary/summary.d.ts +0 -4
  576. package/build/build-esm/src/booking-wizard/features/travelers-form/controls/gender-control.d.ts +0 -5
  577. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form-slice.d.ts +0 -104
  578. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form-util.d.ts +0 -7
  579. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form.d.ts +0 -3
  580. package/build/build-esm/src/booking-wizard/features/travelers-form/type-ahead-input.d.ts +0 -16
  581. package/build/build-esm/src/booking-wizard/features/travelers-form/validate-form.d.ts +0 -11
  582. package/build/build-esm/src/booking-wizard/index.d.ts +0 -12
  583. package/build/build-esm/src/booking-wizard/settings-context.d.ts +0 -5
  584. package/build/build-esm/src/booking-wizard/store.d.ts +0 -44
  585. package/build/build-esm/src/booking-wizard/types.d.ts +0 -301
  586. package/build/build-esm/src/booking-wizard/use-offer-printer.d.ts +0 -13
  587. package/build/build-esm/src/content/components/LanguageSwitcher.d.ts +0 -12
  588. package/build/build-esm/src/content/components/accordion.d.ts +0 -9
  589. package/build/build-esm/src/content/components/breadcrumb.d.ts +0 -14
  590. package/build/build-esm/src/content/components/contact.d.ts +0 -3
  591. package/build/build-esm/src/content/components/faq.d.ts +0 -11
  592. package/build/build-esm/src/content/components/gallery.d.ts +0 -13
  593. package/build/build-esm/src/content/components/image-with-text.d.ts +0 -29
  594. package/build/build-esm/src/content/components/login.d.ts +0 -3
  595. package/build/build-esm/src/content/components/personal-contact-form.d.ts +0 -3
  596. package/build/build-esm/src/content/components/slider.d.ts +0 -10
  597. package/build/build-esm/src/content/error/error.d.ts +0 -6
  598. package/build/build-esm/src/content/featured-trips/featured-trip-card.d.ts +0 -4
  599. package/build/build-esm/src/content/featured-trips/index.d.ts +0 -4
  600. package/build/build-esm/src/content/featured-trips/types.d.ts +0 -12
  601. package/build/build-esm/src/content/features/content-page/content-page-self-contained.d.ts +0 -6
  602. package/build/build-esm/src/content/footer/index.d.ts +0 -4
  603. package/build/build-esm/src/content/footer/types.d.ts +0 -27
  604. package/build/build-esm/src/content/header/index.d.ts +0 -4
  605. package/build/build-esm/src/content/header/types.d.ts +0 -25
  606. package/build/build-esm/src/content/image-card-grid/index.d.ts +0 -4
  607. package/build/build-esm/src/content/image-card-grid/types.d.ts +0 -12
  608. package/build/build-esm/src/content/image-with-text-section/card.d.ts +0 -4
  609. package/build/build-esm/src/content/image-with-text-section/index.d.ts +0 -4
  610. package/build/build-esm/src/content/image-with-text-section/types.d.ts +0 -19
  611. package/build/build-esm/src/content/login/confirm-component.d.ts +0 -4
  612. package/build/build-esm/src/content/login/index.d.ts +0 -4
  613. package/build/build-esm/src/content/login/login-component.d.ts +0 -4
  614. package/build/build-esm/src/content/login/login-services.d.ts +0 -11
  615. package/build/build-esm/src/content/login/reset-password-component.d.ts +0 -4
  616. package/build/build-esm/src/content/login/types.d.ts +0 -24
  617. package/build/build-esm/src/content/navbar/index.d.ts +0 -4
  618. package/build/build-esm/src/content/navbar/placeholderData.d.ts +0 -12
  619. package/build/build-esm/src/content/navbar/types.d.ts +0 -32
  620. package/build/build-esm/src/index.d.ts +0 -44
  621. package/build/build-esm/src/qsm/components/QSMContainer/qsm-container.d.ts +0 -3
  622. package/build/build-esm/src/qsm/components/date-picker/index.d.ts +0 -3
  623. package/build/build-esm/src/qsm/components/date-range-picker/calendar-day.d.ts +0 -12
  624. package/build/build-esm/src/qsm/components/date-range-picker/calendar.d.ts +0 -24
  625. package/build/build-esm/src/qsm/components/date-range-picker/index.d.ts +0 -10
  626. package/build/build-esm/src/qsm/components/double-search-input-group/index.d.ts +0 -8
  627. package/build/build-esm/src/qsm/components/item-picker/index.d.ts +0 -13
  628. package/build/build-esm/src/qsm/components/mobile-filter-modal/index.d.ts +0 -3
  629. package/build/build-esm/src/qsm/components/search-input/index.d.ts +0 -15
  630. package/build/build-esm/src/qsm/components/search-input-group/index.d.ts +0 -13
  631. package/build/build-esm/src/qsm/components/travel-class-picker/index.d.ts +0 -3
  632. package/build/build-esm/src/qsm/components/travel-input/index.d.ts +0 -3
  633. package/build/build-esm/src/qsm/components/travel-input-group/index.d.ts +0 -3
  634. package/build/build-esm/src/qsm/components/travel-nationality-picker/index.d.ts +0 -3
  635. package/build/build-esm/src/qsm/components/travel-type-picker/index.d.ts +0 -3
  636. package/build/build-esm/src/qsm/index.d.ts +0 -7
  637. package/build/build-esm/src/qsm/qsm-configuration-context.d.ts +0 -4
  638. package/build/build-esm/src/qsm/store/qsm-slice.d.ts +0 -127
  639. package/build/build-esm/src/qsm/store/qsm-store.d.ts +0 -23
  640. package/build/build-esm/src/qsm/types.d.ts +0 -82
  641. package/build/build-esm/src/search-results/components/book-packaging-entry/index.d.ts +0 -9
  642. package/build/build-esm/src/search-results/components/book-packaging-entry/wl-sidebar.d.ts +0 -9
  643. package/build/build-esm/src/search-results/components/excursions/day-by-day-excursions.d.ts +0 -4
  644. package/build/build-esm/src/search-results/components/excursions/excursion-details.d.ts +0 -3
  645. package/build/build-esm/src/search-results/components/excursions/excursion-results.d.ts +0 -8
  646. package/build/build-esm/src/search-results/components/filters/filters.d.ts +0 -13
  647. package/build/build-esm/src/search-results/components/filters/flight-filters.d.ts +0 -8
  648. package/build/build-esm/src/search-results/components/flight/flight-banner.d.ts +0 -8
  649. package/build/build-esm/src/search-results/components/flight/flight-card.d.ts +0 -7
  650. package/build/build-esm/src/search-results/components/flight/flight-leg.d.ts +0 -7
  651. package/build/build-esm/src/search-results/components/flight/flight-path.d.ts +0 -6
  652. package/build/build-esm/src/search-results/components/flight/flight-results.d.ts +0 -8
  653. package/build/build-esm/src/search-results/components/flight/flight-search-context/index.d.ts +0 -39
  654. package/build/build-esm/src/search-results/components/flight/flight-selection/independent-flight-option.d.ts +0 -14
  655. package/build/build-esm/src/search-results/components/flight/flight-selection/independent-flight-selection.d.ts +0 -7
  656. package/build/build-esm/src/search-results/components/flight/flight-selection/index.d.ts +0 -8
  657. package/build/build-esm/src/search-results/components/flight/flight-selection/paired-flight-option.d.ts +0 -7
  658. package/build/build-esm/src/search-results/components/flight/flight-selection/paired-flight-selection.d.ts +0 -7
  659. package/build/build-esm/src/search-results/components/group-tour/group-tour-card.d.ts +0 -9
  660. package/build/build-esm/src/search-results/components/group-tour/group-tour-results.d.ts +0 -6
  661. package/build/build-esm/src/search-results/components/hotel/hotel-accommodation-results.d.ts +0 -7
  662. package/build/build-esm/src/search-results/components/hotel/hotel-card.d.ts +0 -8
  663. package/build/build-esm/src/search-results/components/item-picker/index.d.ts +0 -15
  664. package/build/build-esm/src/search-results/components/itinerary/full-itinerary.d.ts +0 -6
  665. package/build/build-esm/src/search-results/components/itinerary/index.d.ts +0 -10
  666. package/build/build-esm/src/search-results/components/multi-range-filter.d.ts +0 -11
  667. package/build/build-esm/src/search-results/components/round-trip/round-trip-results.d.ts +0 -4
  668. package/build/build-esm/src/search-results/components/search-results-container/flight-search-results.d.ts +0 -6
  669. package/build/build-esm/src/search-results/components/search-results-container/search-results-container.d.ts +0 -6
  670. package/build/build-esm/src/search-results/components/spinner/spinner.d.ts +0 -6
  671. package/build/build-esm/src/search-results/components/tab-views/index.d.ts +0 -4
  672. package/build/build-esm/src/search-results/features/flights/flight-search-results-self-contained.d.ts +0 -4
  673. package/build/build-esm/src/search-results/features/hotels/hotel-flight-search-results-self-contained.d.ts +0 -4
  674. package/build/build-esm/src/search-results/features/hotels/hotel-search-results-self-contained.d.ts +0 -4
  675. package/build/build-esm/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.d.ts +0 -4
  676. package/build/build-esm/src/search-results/index.d.ts +0 -8
  677. package/build/build-esm/src/search-results/search-results-configuration-context.d.ts +0 -4
  678. package/build/build-esm/src/search-results/store/search-results-selectors.d.ts +0 -546
  679. package/build/build-esm/src/search-results/store/search-results-slice.d.ts +0 -138
  680. package/build/build-esm/src/search-results/store/search-results-store.d.ts +0 -23
  681. package/build/build-esm/src/search-results/types.d.ts +0 -211
  682. package/build/build-esm/src/search-results/utils/flight-utils.d.ts +0 -16
  683. package/build/build-esm/src/search-results/utils/packaging-utils.d.ts +0 -7
  684. package/build/build-esm/src/search-results/utils/query-utils.d.ts +0 -12
  685. package/build/build-esm/src/search-results/utils/search-results-utils.d.ts +0 -16
  686. package/build/build-esm/src/shared/booking/booking-panel.d.ts +0 -13
  687. package/build/build-esm/src/shared/booking/product-card.d.ts +0 -8
  688. package/build/build-esm/src/shared/booking/shared-confirmation.d.ts +0 -25
  689. package/build/build-esm/src/shared/booking/shared-sidebar.d.ts +0 -34
  690. package/build/build-esm/src/shared/booking/step-indicators.d.ts +0 -7
  691. package/build/build-esm/src/shared/booking/summary.d.ts +0 -44
  692. package/build/build-esm/src/shared/booking/travelers-form.d.ts +0 -93
  693. package/build/build-esm/src/shared/components/flyin/accommodation-flyin.d.ts +0 -7
  694. package/build/build-esm/src/shared/components/flyin/flights-flyin.d.ts +0 -7
  695. package/build/build-esm/src/shared/components/flyin/flyin.d.ts +0 -20
  696. package/build/build-esm/src/shared/components/flyin/group-tour-flyin.d.ts +0 -8
  697. package/build/build-esm/src/shared/components/flyin/packaging-flights-flyin.d.ts +0 -9
  698. package/build/build-esm/src/shared/components/icon.d.ts +0 -11
  699. package/build/build-esm/src/shared/components/loader.d.ts +0 -6
  700. package/build/build-esm/src/shared/types.d.ts +0 -16
  701. package/build/build-esm/src/shared/utils/booking-summary.d.ts +0 -2
  702. package/build/build-esm/src/shared/utils/class-util.d.ts +0 -1
  703. package/build/build-esm/src/shared/utils/localization-util.d.ts +0 -440
  704. package/build/build-esm/src/shared/utils/query-string-util.d.ts +0 -8
  705. package/build/build-esm/src/shared/utils/tide-api-utils.d.ts +0 -10
  706. package/build/build-esm/src/shared/utils/use-media-query-util.d.ts +0 -2
@@ -1,874 +1,874 @@
1
- import { compact, get, sortBy } from 'lodash';
2
- import React, { ReactNode, useMemo, useState } from 'react';
3
- import { FormikProps } from 'formik';
4
- import flat from 'flat';
5
- import { format, parse } from 'date-fns';
6
- import { Country, RoomTraveler, Traveler, TravelersFormValues } from '../../booking-wizard/types';
7
- import LabeledInput from '../../booking-wizard/components/labeled-input';
8
- import LabeledSelect from '../../booking-wizard/components/labeled-select';
9
- import PhoneInput from '../../booking-wizard/components/phone-input';
10
- import GenderControl from '../../booking-wizard/features/travelers-form/controls/gender-control';
11
- import TypeAheadInput from '../../booking-wizard/features/travelers-form/type-ahead-input';
12
- import { buildClassName } from '../utils/class-util';
13
- import { CountryItem, PackagingEntry, PackagingEntryPax } from '@qite/tide-client';
14
-
15
- export type TravelersFormField = { type: string };
16
- export type AgentOption = { id: number | string; name: string; postalCode?: string; location?: string };
17
- export type TypeAheadOption = { key: string; value: string; text: string };
18
-
19
- export interface SharedTravelersSettings {
20
- countries?: Country[];
21
- formFields?: TravelersFormField[];
22
- mainBookerFormFields?: TravelersFormField[];
23
- }
24
-
25
- export interface SharedTravelersFormProps {
26
- formik: FormikProps<TravelersFormValues>;
27
- translations: any;
28
- travellersSettings?: SharedTravelersSettings;
29
- countries?: CountryItem[];
30
- agents?: AgentOption[];
31
- bookingType?: string;
32
- agentAdressId?: number;
33
- travelersFirstStep?: boolean;
34
- isUnavailable?: boolean;
35
- useCompactForm?: boolean;
36
- showAllCountries?: boolean;
37
- showAgentSelection?: boolean;
38
- initialShowAgents?: boolean;
39
- renderPreviousButton?: () => ReactNode;
40
- onBookingTypeChange?: (bookingType: string) => void;
41
- }
42
-
43
- export function createTraveler(traveler: RoomTraveler, followNumber: { number: number }, personTranslation?: string, isCompact?: boolean): Traveler {
44
- if (isCompact) {
45
- return {
46
- id: traveler.id,
47
- firstName: personTranslation,
48
- lastName: `${followNumber.number++}`,
49
- birthDate: '',
50
- gender: '',
51
- age: traveler.age || 30
52
- } as Traveler;
53
- }
54
-
55
- return {
56
- id: traveler.id,
57
- firstName: '',
58
- lastName: '',
59
- birthDate: '',
60
- gender: ''
61
- } as Traveler;
62
- }
63
-
64
- export function createInitialValuesFromRooms(
65
- formRooms: { adults: RoomTraveler[]; children: RoomTraveler[] }[],
66
- startDate?: string,
67
- agentAdressId?: number,
68
- personTranslation?: string,
69
- isCompact?: boolean
70
- ): TravelersFormValues {
71
- const followNumber = { number: 1 };
72
-
73
- const initialValues = {
74
- startDate,
75
- rooms: formRooms.map((room) => ({
76
- adults: room.adults.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact)),
77
- children: room.children.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact))
78
- })),
79
- mainBookerId: -1,
80
- street: '',
81
- houseNumber: '',
82
- box: '',
83
- zipCode: '',
84
- place: '',
85
- country: '',
86
- phone: '',
87
- email: '',
88
- emailConfirmation: '',
89
- travelAgentId: agentAdressId ?? 0,
90
- travelAgentName: ''
91
- } as TravelersFormValues;
92
-
93
- if (initialValues.rooms?.[0]?.adults?.[0]) {
94
- initialValues.mainBookerId = initialValues.rooms[0].adults[0].id;
95
- }
96
-
97
- return initialValues;
98
- }
99
-
100
- export function createInitialValuesFromEditablePackagingEntry(editablePackagingEntry: PackagingEntry, agentAdressId?: number): TravelersFormValues {
101
- const pax = editablePackagingEntry?.pax ?? [];
102
- const rooms = editablePackagingEntry.rooms.map((room) => {
103
- const roomPax = pax.filter((x: PackagingEntryPax) => room.paxIds.includes(x.id));
104
- const adults = roomPax.filter((x: PackagingEntryPax) => x.age! >= 18);
105
- const children = roomPax.filter((x: PackagingEntryPax) => x.age! < 18);
106
- return {
107
- adults: adults.map((roomTraveler: PackagingEntryPax) => {
108
- return {
109
- id: roomTraveler.id,
110
- firstName: roomTraveler.firstName ?? '',
111
- lastName: roomTraveler.lastName ?? '',
112
- birthDate: roomTraveler.dateOfBirth ? format(new Date(roomTraveler.dateOfBirth), 'yyyy-MM-dd') : '',
113
- gender: ''
114
- } as Traveler;
115
- }),
116
- children: children.map((roomTraveler: PackagingEntryPax) => {
117
- return {
118
- id: roomTraveler.id,
119
- firstName: roomTraveler.firstName ?? '',
120
- lastName: roomTraveler.lastName ?? '',
121
- birthDate: roomTraveler.dateOfBirth ? format(new Date(roomTraveler.dateOfBirth), 'yyyy-MM-dd') : '',
122
- gender: ''
123
- } as Traveler;
124
- })
125
- };
126
- });
127
-
128
- const values = createInitialValuesFromRooms(
129
- rooms.map((room) => ({ adults: room.adults as RoomTraveler[], children: room.children as RoomTraveler[] })),
130
- editablePackagingEntry?.lines?.[0]?.from,
131
- agentAdressId
132
- );
133
-
134
- values.rooms = rooms;
135
- values.mainBookerId = pax.find((x: any) => x.isMainBooker)?.id ?? rooms[0]?.adults?.[0]?.id ?? -1;
136
-
137
- const address = editablePackagingEntry?.address;
138
-
139
- values.street = address?.street ?? '';
140
- values.houseNumber = address?.houseNumber ?? '';
141
- values.box = address?.box ?? '';
142
- values.zipCode = address?.zipCode ?? '';
143
- values.place = address?.place ?? '';
144
- values.country = address?.country ?? '';
145
- values.phone = address?.phone ?? '';
146
- values.email = address?.email ?? '';
147
- values.emailConfirmation = address?.email ?? '';
148
- values.travelAgentId = address?.travelAgentId ?? agentAdressId ?? 0;
149
-
150
- return values;
151
- }
152
-
153
- export function applyTravelersFormValuesToEditablePackagingEntry(editablePackagingEntry: PackagingEntry, values: TravelersFormValues) {
154
- const travelers = values.rooms.flatMap((room) => [...room.adults, ...room.children]);
155
-
156
- return {
157
- ...editablePackagingEntry,
158
- pax: (editablePackagingEntry.pax ?? []).map((pax) => {
159
- const traveler = travelers.find((x) => x.id === pax.id);
160
- if (!traveler) return pax;
161
-
162
- return {
163
- ...pax,
164
- firstName: traveler.firstName ?? '',
165
- lastName: traveler.lastName ?? '',
166
- dateOfBirth: traveler.birthDate || null,
167
- isMainBooker: traveler.id === values.mainBookerId
168
- };
169
- }),
170
- address: {
171
- ...editablePackagingEntry.address,
172
- street: values.street,
173
- houseNumber: values.houseNumber,
174
- box: values.box,
175
- zipCode: values.zipCode,
176
- place: values.place,
177
- country: values.country,
178
- travelAgentId: values.travelAgentId,
179
- phone: values.phone,
180
- email: values.email
181
- }
182
- };
183
- }
184
-
185
- const SharedTravelersForm: React.FC<SharedTravelersFormProps> = ({
186
- formik,
187
- translations,
188
- travellersSettings,
189
- countries,
190
- agents,
191
- bookingType,
192
- agentAdressId,
193
- travelersFirstStep = false,
194
- isUnavailable = false,
195
- useCompactForm = false,
196
- showAllCountries = false,
197
- showAgentSelection = false,
198
- initialShowAgents = false,
199
- renderPreviousButton,
200
- onBookingTypeChange
201
- }) => {
202
- const [showAgents, setShowAgents] = useState<boolean>(initialShowAgents);
203
-
204
- const typeaheadAgents = useMemo<TypeAheadOption[]>(
205
- () =>
206
- sortBy(
207
- agents?.map((agent) => ({
208
- key: `${agent.id}`,
209
- value: `${agent.name}${agent.postalCode || agent.location ? ` (${compact([agent.postalCode, agent.location]).join(' ')})` : ''}`,
210
- text: `${agent.name}${agent.postalCode || agent.location ? ` (${compact([agent.postalCode, agent.location]).join(' ')})` : ''}`
211
- })),
212
- 'value'
213
- ) ?? [],
214
- [agents]
215
- );
216
-
217
- const [filteredAgents, setFilteredAgents] = useState<TypeAheadOption[]>(typeaheadAgents);
218
-
219
- const flatErrors: Record<string, string> = flat(formik.errors);
220
- const errorKeys = Object.keys(flatErrors).filter((key) => get(formik.touched, key));
221
- const hasVisibleError = (key: string) => get(formik.errors, key) && get(formik.touched, key);
222
-
223
- const mainBooker = formik.values.rooms
224
- .find((room) => room.adults.find((traveler) => traveler.id === formik.values.mainBookerId))
225
- ?.adults.find((traveler) => traveler.id === formik.values.mainBookerId);
226
-
227
- const countryOptions = [
228
- { key: 'empty', value: undefined, label: translations.TRAVELERS_FORM.SELECT_COUNTRY },
229
- ...(showAllCountries
230
- ? countries?.map((country) => ({ key: country.iso2, value: country.iso2, label: country.name })) ?? []
231
- : travellersSettings?.countries?.map((country) => ({ key: country.iso2, value: country.iso2, label: country.name })) ?? [
232
- { key: 'be', value: 'be', label: translations.TRAVELERS_FORM.COUNTRIES.BELGIUM },
233
- { key: 'nl', value: 'nl', label: translations.TRAVELERS_FORM.COUNTRIES.NETHERLANDS },
234
- { key: 'fr', value: 'fr', label: translations.TRAVELERS_FORM.COUNTRIES.FRANCE }
235
- ])
236
- ];
237
-
238
- const handleMainBookerChange: React.FormEventHandler<HTMLInputElement> = (event) => {
239
- formik.setFieldValue('mainBookerId', parseInt(event.currentTarget.value, 10));
240
- };
241
-
242
- const handleAgentChange = (value: string) => {
243
- setFilteredAgents(typeaheadAgents.filter((x) => x.value.toLocaleLowerCase().indexOf(value.toLocaleLowerCase()) > -1));
244
- formik.setFieldValue('travelAgentName', value);
245
- };
246
-
247
- const handleAgentSelect = (key: string) => {
248
- const agent = typeaheadAgents.find((x) => x.key === key);
249
-
250
- formik.setValues({
251
- ...formik.values,
252
- travelAgentId: Number(agent?.key),
253
- travelAgentName: agent?.value ?? ''
254
- });
255
-
256
- onBookingTypeChange?.(agentAdressId && agentAdressId !== 0 ? 'b2b' : 'b2b2c');
257
- };
258
-
259
- const handleAgentClear = () => {
260
- formik.setValues({ ...formik.values, travelAgentId: 0, travelAgentName: '' });
261
- onBookingTypeChange?.('b2c');
262
- };
263
-
264
- const toggleAgent = (value: boolean) => {
265
- setShowAgents(value);
266
- if (!value) {
267
- handleAgentClear();
268
- setFilteredAgents([]);
269
- }
270
- };
271
-
272
- const handleAddTraveler = (roomIndex: number) => {
273
- const rooms = [...formik.values.rooms];
274
- const newAdult = { id: Date.now(), firstName: '', lastName: '', birthDate: '', gender: '' } as Traveler;
275
- rooms[roomIndex] = { ...rooms[roomIndex], adults: [...rooms[roomIndex].adults, newAdult] };
276
- formik.setFieldValue('rooms', rooms);
277
- };
278
-
279
- const handleRemoveTraveler = (roomIndex: number, travelerIndex: number) => {
280
- const rooms = [...formik.values.rooms];
281
- const adults = [...rooms[roomIndex].adults];
282
- if (adults.length <= 1) return;
283
-
284
- adults.splice(travelerIndex, 1);
285
- rooms[roomIndex] = { ...rooms[roomIndex], adults };
286
- formik.setFieldValue('rooms', rooms);
287
- };
288
-
289
- const handleAddRoom = () => {
290
- const rooms = [...formik.values.rooms];
291
- rooms.push({ adults: [{ id: Date.now(), firstName: '', lastName: '', birthDate: '', gender: '' } as Traveler], children: [] });
292
- formik.setFieldValue('rooms', rooms);
293
- };
294
-
295
- const handleRemoveRoom = (roomIndex: number) => {
296
- const rooms = [...formik.values.rooms];
297
- rooms.splice(roomIndex, 1);
298
- formik.setFieldValue('rooms', rooms);
299
- };
300
-
301
- const renderGenderControl = (name: string, value: Traveler) => (
302
- <div className={buildClassName(['form__group', hasVisibleError(name) && 'form__group--error'])}>
303
- <label className="form__label">{translations.TRAVELERS_FORM.GENDER_ID} *</label>
304
- <div className="radiobutton-group">
305
- {[
306
- ['m', translations.TRAVELERS_FORM.MALE_GENDER],
307
- ['f', translations.TRAVELERS_FORM.FEMALE_GENDER]
308
- ].map(([gender, label]) => (
309
- <div className="radiobutton" key={gender}>
310
- <label className="radiobutton__label">
311
- <input
312
- type="radio"
313
- className="radiobutton__input"
314
- name={name}
315
- onChange={formik.handleChange}
316
- onBlur={formik.handleBlur}
317
- value={gender}
318
- checked={value.gender === gender}
319
- />
320
- {label}
321
- </label>
322
- </div>
323
- ))}
324
- </div>
325
- </div>
326
- );
327
-
328
- const getControl = (type: string, value: Traveler, name: string) => {
329
- switch (type) {
330
- case 'gender':
331
- return <GenderControl translations={translations} value={value} formik={formik} name={name} />;
332
- case 'firstName':
333
- return (
334
- <LabeledInput
335
- hasError={hasVisibleError(name)}
336
- extraClassName="form__group--md-33"
337
- label={translations.TRAVELERS_FORM.FIRST_NAME}
338
- required
339
- name={name}
340
- onChange={formik.handleChange}
341
- onBlur={formik.handleBlur}
342
- value={value.firstName}
343
- />
344
- );
345
- case 'lastName':
346
- return (
347
- <LabeledInput
348
- hasError={hasVisibleError(name)}
349
- extraClassName="form__group--md-33"
350
- label={translations.TRAVELERS_FORM.LAST_NAME}
351
- required
352
- name={name}
353
- onChange={formik.handleChange}
354
- onBlur={formik.handleBlur}
355
- value={value.lastName}
356
- />
357
- );
358
- case 'birthDate':
359
- return (
360
- <LabeledInput
361
- type="date"
362
- hasError={hasVisibleError(name)}
363
- extraClassName="form__group--md-33"
364
- label={translations.TRAVELERS_FORM.BIRTHDATE}
365
- required
366
- name={name}
367
- onChange={formik.handleChange}
368
- onBlur={formik.handleBlur}
369
- value={value.birthDate}
370
- />
371
- );
372
- case 'country':
373
- return (
374
- <LabeledSelect
375
- hasError={hasVisibleError('country')}
376
- label={translations.TRAVELERS_FORM.COUNTRY}
377
- required
378
- name="country"
379
- onChange={formik.handleChange}
380
- onBlur={formik.handleBlur}
381
- value={formik.values.country}
382
- options={countryOptions}
383
- />
384
- );
385
- case 'phone':
386
- return (
387
- <PhoneInput
388
- countries={travellersSettings?.countries ?? []}
389
- countryIso2={formik.values.country}
390
- hasError={hasVisibleError('phone')}
391
- label={translations.TRAVELERS_FORM.PHONE}
392
- required
393
- name="phone"
394
- onChange={formik.handleChange}
395
- onBlur={formik.handleBlur}
396
- value={formik.values.phone}
397
- />
398
- );
399
- case 'email':
400
- return (
401
- <>
402
- <LabeledInput
403
- type="email"
404
- hasError={hasVisibleError('email')}
405
- extraClassName="form__group--md-33"
406
- label={translations.TRAVELERS_FORM.EMAIL}
407
- required
408
- name="email"
409
- onChange={formik.handleChange}
410
- onBlur={formik.handleBlur}
411
- value={formik.values.email}
412
- />
413
- <LabeledInput
414
- type="email"
415
- hasError={hasVisibleError('emailConfirmation')}
416
- extraClassName="form__group--md-33"
417
- label={translations.TRAVELERS_FORM.REPEAT_EMAIL}
418
- required
419
- name="emailConfirmation"
420
- onChange={formik.handleChange}
421
- onBlur={formik.handleBlur}
422
- value={formik.values.emailConfirmation}
423
- />
424
- </>
425
- );
426
- case 'street':
427
- return (
428
- <LabeledInput
429
- hasError={hasVisibleError('street')}
430
- extraClassName="form__group--50 form__group--sm-60"
431
- label={translations.TRAVELERS_FORM.STREET}
432
- required
433
- name="street"
434
- onChange={formik.handleChange}
435
- onBlur={formik.handleBlur}
436
- value={formik.values.street}
437
- />
438
- );
439
-
440
- case 'houseNumber':
441
- return (
442
- <LabeledInput
443
- hasError={hasVisibleError('houseNumber')}
444
- extraClassName="form__group--30 form__group--sm-20"
445
- label={translations.TRAVELERS_FORM.HOUSE_NUMBER}
446
- required
447
- name="houseNumber"
448
- onChange={formik.handleChange}
449
- onBlur={formik.handleBlur}
450
- value={formik.values.houseNumber}
451
- />
452
- );
453
-
454
- case 'box':
455
- return (
456
- <LabeledInput
457
- hasError={hasVisibleError('box')}
458
- extraClassName="form__group--20"
459
- label={translations.TRAVELERS_FORM.POST_BOX}
460
- name="box"
461
- onChange={formik.handleChange}
462
- onBlur={formik.handleBlur}
463
- value={formik.values.box}
464
- />
465
- );
466
-
467
- case 'zipCode':
468
- return (
469
- <LabeledInput
470
- hasError={hasVisibleError('zipCode')}
471
- extraClassName="form__group--40 form__group--sm-20"
472
- label={translations.TRAVELERS_FORM.ZIPCODE}
473
- required
474
- name="zipCode"
475
- onChange={formik.handleChange}
476
- onBlur={formik.handleBlur}
477
- value={formik.values.zipCode}
478
- />
479
- );
480
-
481
- case 'place':
482
- return (
483
- <LabeledInput
484
- hasError={hasVisibleError('place')}
485
- extraClassName="form__group--60 form__group--sm-40"
486
- label={translations.TRAVELERS_FORM.CITY}
487
- required
488
- name="place"
489
- onChange={formik.handleChange}
490
- onBlur={formik.handleBlur}
491
- value={formik.values.place}
492
- />
493
- );
494
- default:
495
- return null;
496
- }
497
- };
498
-
499
- const renderRoomLabel = (room: TravelersFormValues['rooms'][number]) =>
500
- compact([
501
- room.adults.length,
502
- room.adults.length === 1 && ` ${translations.TRAVELERS_FORM.ADULT}`,
503
- room.adults.length > 1 && ` ${translations.TRAVELERS_FORM.ADULTS}`,
504
- room.adults?.length && room.children?.length && ', ',
505
- room.children.length,
506
- room.children.length === 1 && ` ${translations.TRAVELERS_FORM.CHILD}`,
507
- room.children.length > 1 && ` ${translations.TRAVELERS_FORM.CHILDREN}`
508
- ]).join('');
509
-
510
- const renderTravelerFields = (travelerValues: Traveler, namePrefix: string, isAdult: boolean, roomIndex: number, travelerIndex: number) => {
511
- if (useCompactForm) {
512
- return (
513
- <div className="form__row">
514
- <LabeledInput
515
- hasError={hasVisibleError(`${namePrefix}.age`)}
516
- extraClassName="form__group--md-33"
517
- label={translations.TRAVELERS_FORM.AGE}
518
- required
519
- name={`${namePrefix}.age`}
520
- onChange={formik.handleChange}
521
- onBlur={formik.handleBlur}
522
- value={travelerValues.age}
523
- />
524
- </div>
525
- );
526
- }
527
-
528
- if (travellersSettings?.formFields?.length) {
529
- return (
530
- <div className="travelers-form__grid">
531
- {travellersSettings.formFields.map((field, index) => (
532
- <div key={index} className={`control control--${field.type}`}>
533
- {getControl(field.type, travelerValues, `${namePrefix}.${field.type}`)}
534
- </div>
535
- ))}
536
- </div>
537
- );
538
- }
539
-
540
- return (
541
- <>
542
- <div className="form__row">{renderGenderControl(`${namePrefix}.gender`, travelerValues)}</div>
543
- <div className="form__row">
544
- <LabeledInput
545
- hasError={hasVisibleError(`${namePrefix}.firstName`)}
546
- extraClassName="form__group--md-33"
547
- label={translations.TRAVELERS_FORM.FIRST_NAME}
548
- required
549
- name={`${namePrefix}.firstName`}
550
- onChange={formik.handleChange}
551
- onBlur={formik.handleBlur}
552
- value={travelerValues.firstName}
553
- />
554
- <LabeledInput
555
- hasError={hasVisibleError(`${namePrefix}.lastName`)}
556
- extraClassName="form__group--md-33"
557
- label={translations.TRAVELERS_FORM.LAST_NAME}
558
- required
559
- name={`${namePrefix}.lastName`}
560
- onChange={formik.handleChange}
561
- onBlur={formik.handleBlur}
562
- value={travelerValues.lastName}
563
- />
564
- <LabeledInput
565
- type="date"
566
- hasError={hasVisibleError(`${namePrefix}.birthDate`)}
567
- extraClassName="form__group--md-33"
568
- label={translations.TRAVELERS_FORM.BIRTHDATE}
569
- required
570
- name={`${namePrefix}.birthDate`}
571
- onChange={formik.handleChange}
572
- onBlur={formik.handleBlur}
573
- value={travelerValues.birthDate}
574
- />
575
- </div>
576
- {travelersFirstStep && isAdult && formik.values.rooms[roomIndex].adults.length > 1 && (
577
- <button type="button" className="cta cta--secondary" onClick={() => handleRemoveTraveler(roomIndex, travelerIndex)}>
578
- {translations.TRAVELERS_FORM.REMOVE_TRAVELER}
579
- </button>
580
- )}
581
- </>
582
- );
583
- };
584
-
585
- return (
586
- <form
587
- className="form form__travelers"
588
- name="booking--travellers"
589
- id="booking--travellers"
590
- noValidate
591
- onSubmit={formik.handleSubmit}
592
- onReset={formik.handleReset}>
593
- <div className="form__travelers__wrapper">
594
- {formik.values.rooms.map((room, roomIndex) => (
595
- <div key={roomIndex}>
596
- {formik.values.rooms.length > 1 && (
597
- <div className="form__region">
598
- <div className="form__region-header">
599
- <h5 className="form__region-heading">
600
- {translations.SHARED.ROOM} {roomIndex + 1}
601
- </h5>
602
- <p className="form__region-label">{renderRoomLabel(room)}</p>
603
- </div>
604
- {!useCompactForm && travelersFirstStep && formik.values.rooms.length > 1 && (
605
- <button type="button" className="cta cta--secondary" onClick={() => handleRemoveRoom(roomIndex)}>
606
- Verwijder reisgezelschap
607
- </button>
608
- )}
609
- </div>
610
- )}
611
-
612
- {room.adults.map((travelerValues, index) => (
613
- <div className="form__region" key={travelerValues.id}>
614
- <div className="form__region-header">
615
- <h5 className="form__region-heading">
616
- {translations.TRAVELERS_FORM.TRAVELER} {index + 1}
617
- </h5>
618
- <p className="form__region-label">{translations.TRAVELERS_FORM.ADULT}</p>
619
- <div className="radiobutton">
620
- <label className="radiobutton__label">
621
- <input
622
- type="radio"
623
- name="mainBookerId"
624
- onChange={handleMainBookerChange}
625
- onBlur={formik.handleBlur}
626
- value={travelerValues.id}
627
- checked={formik.values.mainBookerId === travelerValues.id}
628
- className="radiobutton__input"
629
- />
630
- {translations.TRAVELERS_FORM.MAIN_BOOKER}
631
- </label>
632
- </div>
633
- </div>
634
- {renderTravelerFields(travelerValues, `rooms[${roomIndex}].adults[${index}]`, true, roomIndex, index)}
635
- </div>
636
- ))}
637
-
638
- {room.children.map((travelerValues, index) => (
639
- <div className="form__region" key={travelerValues.id}>
640
- <div className="form__region-header">
641
- <h5 className="form__region-heading">
642
- {translations.TRAVELERS_FORM.TRAVELER} {room.adults.length + index + 1}
643
- </h5>
644
- <p className="form__region-label">{translations.TRAVELERS_FORM.CHILD}</p>
645
- </div>
646
- {renderTravelerFields(travelerValues, `rooms[${roomIndex}].children[${index}]`, false, roomIndex, index)}
647
- </div>
648
- ))}
649
-
650
- {!useCompactForm && travelersFirstStep && (
651
- <div className="form__region">
652
- <button type="button" className="cta cta--select" onClick={() => handleAddTraveler(roomIndex)}>
653
- {translations.TRAVELERS_FORM.ADD_TRAVELER}
654
- </button>
655
- </div>
656
- )}
657
- </div>
658
- ))}
659
-
660
- {!useCompactForm && (bookingType !== 'b2b' || travellersSettings?.mainBookerFormFields?.length) ? (
661
- <div className="form__region">
662
- <div className="form__region-header">
663
- <h5 className="form__region-heading">{translations.TRAVELERS_FORM.MAIN_BOOKER}</h5>
664
- <p className="form__region-label">
665
- {compact([
666
- compact([mainBooker?.firstName, mainBooker?.lastName]).join(' '),
667
- mainBooker?.birthDate && format(parse(mainBooker.birthDate, 'yyyy-MM-dd', new Date()), 'dd-MM-yyyy')
668
- ]).join(', ')}
669
- </p>
670
- </div>
671
- {travellersSettings?.mainBookerFormFields?.length ? (
672
- <div className="main-booker-form__grid">
673
- {travellersSettings.mainBookerFormFields.map((field, index) => (
674
- <div key={index} className={`control control--${field.type}`}>
675
- {getControl(field.type, {} as Traveler, field.type)}
676
- </div>
677
- ))}
678
- </div>
679
- ) : (
680
- <>
681
- <div className="form__twocolumn">
682
- <div className="form__twocolumn-column">
683
- <div className="form__row">
684
- <LabeledInput
685
- hasError={hasVisibleError('street')}
686
- extraClassName="form__group--50 form__group--sm-60"
687
- label={translations.TRAVELERS_FORM.STREET}
688
- required
689
- name="street"
690
- onChange={formik.handleChange}
691
- onBlur={formik.handleBlur}
692
- value={formik.values.street}
693
- />
694
- <LabeledInput
695
- hasError={hasVisibleError('houseNumber')}
696
- extraClassName="form__group--30 form__group--sm-20"
697
- label={translations.TRAVELERS_FORM.HOUSE_NUMBER}
698
- required
699
- name="houseNumber"
700
- onChange={formik.handleChange}
701
- onBlur={formik.handleBlur}
702
- value={formik.values.houseNumber}
703
- />
704
- <LabeledInput
705
- hasError={hasVisibleError('box')}
706
- extraClassName="form__group--20"
707
- label={translations.TRAVELERS_FORM.POST_BOX}
708
- name="box"
709
- onChange={formik.handleChange}
710
- onBlur={formik.handleBlur}
711
- value={formik.values.box}
712
- />
713
- </div>
714
- </div>
715
- <div className="form__twocolumn-column">
716
- <div className="form__row">
717
- <LabeledInput
718
- hasError={hasVisibleError('zipCode')}
719
- extraClassName="form__group--40 form__group--sm-20"
720
- label={translations.TRAVELERS_FORM.ZIPCODE}
721
- required
722
- name="zipCode"
723
- onChange={formik.handleChange}
724
- onBlur={formik.handleBlur}
725
- value={formik.values.zipCode}
726
- />
727
- <LabeledInput
728
- hasError={hasVisibleError('place')}
729
- extraClassName="form__group--60 form__group--sm-40"
730
- label={translations.TRAVELERS_FORM.CITY}
731
- required
732
- name="place"
733
- onChange={formik.handleChange}
734
- onBlur={formik.handleBlur}
735
- value={formik.values.place}
736
- />
737
- <LabeledSelect
738
- hasError={hasVisibleError('country')}
739
- extraClassName="form__group--sm-40"
740
- label={translations.TRAVELERS_FORM.COUNTRY}
741
- required
742
- name="country"
743
- onChange={formik.handleChange}
744
- onBlur={formik.handleBlur}
745
- value={formik.values.country}
746
- options={countryOptions}
747
- />
748
- </div>
749
- </div>
750
- </div>
751
- <div className="form__row">
752
- <LabeledInput
753
- hasError={hasVisibleError('phone')}
754
- extraClassName="form__group--md-33"
755
- label={translations.TRAVELERS_FORM.PHONE}
756
- required
757
- name="phone"
758
- onChange={formik.handleChange}
759
- onBlur={formik.handleBlur}
760
- value={formik.values.phone}
761
- />
762
- <LabeledInput
763
- type="email"
764
- hasError={hasVisibleError('email')}
765
- extraClassName="form__group--md-33"
766
- label={translations.TRAVELERS_FORM.EMAIL}
767
- required
768
- name="email"
769
- onChange={formik.handleChange}
770
- onBlur={formik.handleBlur}
771
- value={formik.values.email}
772
- />
773
- <LabeledInput
774
- type="email"
775
- hasError={hasVisibleError('emailConfirmation')}
776
- extraClassName="form__group--md-33"
777
- label={translations.TRAVELERS_FORM.REPEAT_EMAIL}
778
- required
779
- name="emailConfirmation"
780
- onChange={formik.handleChange}
781
- onBlur={formik.handleBlur}
782
- value={formik.values.emailConfirmation}
783
- />
784
- </div>
785
- </>
786
- )}
787
- </div>
788
- ) : !useCompactForm ? (
789
- <div className="form__region">
790
- <div className="form__row">
791
- <LabeledInput
792
- hasError={hasVisibleError('phone')}
793
- extraClassName="form__group--md-33"
794
- label={translations.TRAVELERS_FORM.PHONE}
795
- required
796
- name="phone"
797
- onChange={formik.handleChange}
798
- onBlur={formik.handleBlur}
799
- value={formik.values.phone}
800
- />
801
- </div>
802
- </div>
803
- ) : null}
804
-
805
- {!useCompactForm && showAgentSelection && (
806
- <div className="form__region">
807
- <div className="form__region-header">
808
- <h5 className="form__region-heading">{translations.TRAVELERS_FORM.BOOK_WITH_AGENT}</h5>
809
- <div className="checkbox" id="cbxChooseOffice">
810
- <label className="checkbox__label">
811
- <input
812
- type="checkbox"
813
- name="booking--mainbooker"
814
- checked={showAgents}
815
- onChange={() => toggleAgent(!showAgents)}
816
- className="checkbox__input"
817
- />
818
- {translations.TRAVELERS_FORM.CHOOSE_OFFICE}
819
- </label>
820
- </div>
821
- </div>
822
- {showAgents && (
823
- <div className="form__row form__row--choose-office">
824
- <div className={buildClassName(['form__group', 'form__group--icon', hasVisibleError('travelAgentId') && 'form__group--error'])}>
825
- <TypeAheadInput
826
- value={formik.values.travelAgentName}
827
- options={filteredAgents}
828
- onChange={handleAgentChange}
829
- onSelect={handleAgentSelect}
830
- onClear={handleAgentClear}
831
- name="travelAgentName"
832
- placeholder={translations.TRAVELERS_FORM.CHOOSE_AGENT_PLACEHOLDER}
833
- />
834
- </div>
835
- </div>
836
- )}
837
- </div>
838
- )}
839
- </div>
840
-
841
- {!useCompactForm && errorKeys.length > 0 && (
842
- <div className="form__region form__region--errors">
843
- <div className="form__row">
844
- <div className="form__group">
845
- <p className="form__error-heading">{translations.TRAVELERS_FORM.VALIDATION_MESSAGE}:</p>
846
- <ul className="list">
847
- {errorKeys.map((key) => (
848
- <li key={key}>{get(flatErrors, key)}</li>
849
- ))}
850
- </ul>
851
- </div>
852
- </div>
853
- </div>
854
- )}
855
-
856
- {travelersFirstStep && (
857
- <div className="booking__navigator">
858
- <button type="button" className="cta cta--select" onClick={handleAddRoom}>
859
- {translations.TRAVELERS_FORM.ADD_ROOM}
860
- </button>
861
- </div>
862
- )}
863
-
864
- <div className="booking__navigator">
865
- {renderPreviousButton?.()}
866
- <button type="submit" title={translations.STEPS.NEXT} className={'cta' + (isUnavailable ? ' cta--disabled' : '')}>
867
- {translations.STEPS.NEXT}
868
- </button>
869
- </div>
870
- </form>
871
- );
872
- };
873
-
874
- export default SharedTravelersForm;
1
+ import { compact, get, sortBy } from 'lodash';
2
+ import React, { ReactNode, useMemo, useState } from 'react';
3
+ import { FormikProps } from 'formik';
4
+ import flat from 'flat';
5
+ import { format, parse } from 'date-fns';
6
+ import { Country, RoomTraveler, Traveler, TravelersFormValues } from '../../booking-wizard/types';
7
+ import LabeledInput from '../../booking-wizard/components/labeled-input';
8
+ import LabeledSelect from '../../booking-wizard/components/labeled-select';
9
+ import PhoneInput from '../../booking-wizard/components/phone-input';
10
+ import GenderControl from '../../booking-wizard/features/travelers-form/controls/gender-control';
11
+ import TypeAheadInput from '../../booking-wizard/features/travelers-form/type-ahead-input';
12
+ import { buildClassName } from '../utils/class-util';
13
+ import { CountryItem, PackagingEntry, PackagingEntryPax } from '@qite/tide-client';
14
+
15
+ export type TravelersFormField = { type: string };
16
+ export type AgentOption = { id: number | string; name: string; postalCode?: string; location?: string };
17
+ export type TypeAheadOption = { key: string; value: string; text: string };
18
+
19
+ export interface SharedTravelersSettings {
20
+ countries?: Country[];
21
+ formFields?: TravelersFormField[];
22
+ mainBookerFormFields?: TravelersFormField[];
23
+ }
24
+
25
+ export interface SharedTravelersFormProps {
26
+ formik: FormikProps<TravelersFormValues>;
27
+ translations: any;
28
+ travellersSettings?: SharedTravelersSettings;
29
+ countries?: CountryItem[];
30
+ agents?: AgentOption[];
31
+ bookingType?: string;
32
+ agentAdressId?: number;
33
+ travelersFirstStep?: boolean;
34
+ isUnavailable?: boolean;
35
+ useCompactForm?: boolean;
36
+ showAllCountries?: boolean;
37
+ showAgentSelection?: boolean;
38
+ initialShowAgents?: boolean;
39
+ renderPreviousButton?: () => ReactNode;
40
+ onBookingTypeChange?: (bookingType: string) => void;
41
+ }
42
+
43
+ export function createTraveler(traveler: RoomTraveler, followNumber: { number: number }, personTranslation?: string, isCompact?: boolean): Traveler {
44
+ if (isCompact) {
45
+ return {
46
+ id: traveler.id,
47
+ firstName: personTranslation,
48
+ lastName: `${followNumber.number++}`,
49
+ birthDate: '',
50
+ gender: '',
51
+ age: traveler.age || 30
52
+ } as Traveler;
53
+ }
54
+
55
+ return {
56
+ id: traveler.id,
57
+ firstName: '',
58
+ lastName: '',
59
+ birthDate: '',
60
+ gender: ''
61
+ } as Traveler;
62
+ }
63
+
64
+ export function createInitialValuesFromRooms(
65
+ formRooms: { adults: RoomTraveler[]; children: RoomTraveler[] }[],
66
+ startDate?: string,
67
+ agentAdressId?: number,
68
+ personTranslation?: string,
69
+ isCompact?: boolean
70
+ ): TravelersFormValues {
71
+ const followNumber = { number: 1 };
72
+
73
+ const initialValues = {
74
+ startDate,
75
+ rooms: formRooms.map((room) => ({
76
+ adults: room.adults.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact)),
77
+ children: room.children.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact))
78
+ })),
79
+ mainBookerId: -1,
80
+ street: '',
81
+ houseNumber: '',
82
+ box: '',
83
+ zipCode: '',
84
+ place: '',
85
+ country: '',
86
+ phone: '',
87
+ email: '',
88
+ emailConfirmation: '',
89
+ travelAgentId: agentAdressId ?? 0,
90
+ travelAgentName: ''
91
+ } as TravelersFormValues;
92
+
93
+ if (initialValues.rooms?.[0]?.adults?.[0]) {
94
+ initialValues.mainBookerId = initialValues.rooms[0].adults[0].id;
95
+ }
96
+
97
+ return initialValues;
98
+ }
99
+
100
+ export function createInitialValuesFromEditablePackagingEntry(editablePackagingEntry: PackagingEntry, agentAdressId?: number): TravelersFormValues {
101
+ const pax = editablePackagingEntry?.pax ?? [];
102
+ const rooms = editablePackagingEntry.rooms.map((room) => {
103
+ const roomPax = pax.filter((x: PackagingEntryPax) => room.paxIds.includes(x.id));
104
+ const adults = roomPax.filter((x: PackagingEntryPax) => x.age! >= 18);
105
+ const children = roomPax.filter((x: PackagingEntryPax) => x.age! < 18);
106
+ return {
107
+ adults: adults.map((roomTraveler: PackagingEntryPax) => {
108
+ return {
109
+ id: roomTraveler.id,
110
+ firstName: roomTraveler.firstName ?? '',
111
+ lastName: roomTraveler.lastName ?? '',
112
+ birthDate: roomTraveler.dateOfBirth ? format(new Date(roomTraveler.dateOfBirth), 'yyyy-MM-dd') : '',
113
+ gender: ''
114
+ } as Traveler;
115
+ }),
116
+ children: children.map((roomTraveler: PackagingEntryPax) => {
117
+ return {
118
+ id: roomTraveler.id,
119
+ firstName: roomTraveler.firstName ?? '',
120
+ lastName: roomTraveler.lastName ?? '',
121
+ birthDate: roomTraveler.dateOfBirth ? format(new Date(roomTraveler.dateOfBirth), 'yyyy-MM-dd') : '',
122
+ gender: ''
123
+ } as Traveler;
124
+ })
125
+ };
126
+ });
127
+
128
+ const values = createInitialValuesFromRooms(
129
+ rooms.map((room) => ({ adults: room.adults as RoomTraveler[], children: room.children as RoomTraveler[] })),
130
+ editablePackagingEntry?.lines?.[0]?.from,
131
+ agentAdressId
132
+ );
133
+
134
+ values.rooms = rooms;
135
+ values.mainBookerId = pax.find((x: any) => x.isMainBooker)?.id ?? rooms[0]?.adults?.[0]?.id ?? -1;
136
+
137
+ const address = editablePackagingEntry?.address;
138
+
139
+ values.street = address?.street ?? '';
140
+ values.houseNumber = address?.houseNumber ?? '';
141
+ values.box = address?.box ?? '';
142
+ values.zipCode = address?.zipCode ?? '';
143
+ values.place = address?.place ?? '';
144
+ values.country = address?.country ?? '';
145
+ values.phone = address?.phone ?? '';
146
+ values.email = address?.email ?? '';
147
+ values.emailConfirmation = address?.email ?? '';
148
+ values.travelAgentId = address?.travelAgentId ?? agentAdressId ?? 0;
149
+
150
+ return values;
151
+ }
152
+
153
+ export function applyTravelersFormValuesToEditablePackagingEntry(editablePackagingEntry: PackagingEntry, values: TravelersFormValues) {
154
+ const travelers = values.rooms.flatMap((room) => [...room.adults, ...room.children]);
155
+
156
+ return {
157
+ ...editablePackagingEntry,
158
+ pax: (editablePackagingEntry.pax ?? []).map((pax) => {
159
+ const traveler = travelers.find((x) => x.id === pax.id);
160
+ if (!traveler) return pax;
161
+
162
+ return {
163
+ ...pax,
164
+ firstName: traveler.firstName ?? '',
165
+ lastName: traveler.lastName ?? '',
166
+ dateOfBirth: traveler.birthDate || null,
167
+ isMainBooker: traveler.id === values.mainBookerId
168
+ };
169
+ }),
170
+ address: {
171
+ ...editablePackagingEntry.address,
172
+ street: values.street,
173
+ houseNumber: values.houseNumber,
174
+ box: values.box,
175
+ zipCode: values.zipCode,
176
+ place: values.place,
177
+ country: values.country,
178
+ travelAgentId: values.travelAgentId,
179
+ phone: values.phone,
180
+ email: values.email
181
+ }
182
+ };
183
+ }
184
+
185
+ const SharedTravelersForm: React.FC<SharedTravelersFormProps> = ({
186
+ formik,
187
+ translations,
188
+ travellersSettings,
189
+ countries,
190
+ agents,
191
+ bookingType,
192
+ agentAdressId,
193
+ travelersFirstStep = false,
194
+ isUnavailable = false,
195
+ useCompactForm = false,
196
+ showAllCountries = false,
197
+ showAgentSelection = false,
198
+ initialShowAgents = false,
199
+ renderPreviousButton,
200
+ onBookingTypeChange
201
+ }) => {
202
+ const [showAgents, setShowAgents] = useState<boolean>(initialShowAgents);
203
+
204
+ const typeaheadAgents = useMemo<TypeAheadOption[]>(
205
+ () =>
206
+ sortBy(
207
+ agents?.map((agent) => ({
208
+ key: `${agent.id}`,
209
+ value: `${agent.name}${agent.postalCode || agent.location ? ` (${compact([agent.postalCode, agent.location]).join(' ')})` : ''}`,
210
+ text: `${agent.name}${agent.postalCode || agent.location ? ` (${compact([agent.postalCode, agent.location]).join(' ')})` : ''}`
211
+ })),
212
+ 'value'
213
+ ) ?? [],
214
+ [agents]
215
+ );
216
+
217
+ const [filteredAgents, setFilteredAgents] = useState<TypeAheadOption[]>(typeaheadAgents);
218
+
219
+ const flatErrors: Record<string, string> = flat(formik.errors);
220
+ const errorKeys = Object.keys(flatErrors).filter((key) => get(formik.touched, key));
221
+ const hasVisibleError = (key: string) => get(formik.errors, key) && get(formik.touched, key);
222
+
223
+ const mainBooker = formik.values.rooms
224
+ .find((room) => room.adults.find((traveler) => traveler.id === formik.values.mainBookerId))
225
+ ?.adults.find((traveler) => traveler.id === formik.values.mainBookerId);
226
+
227
+ const countryOptions = [
228
+ { key: 'empty', value: undefined, label: translations.TRAVELERS_FORM.SELECT_COUNTRY },
229
+ ...(showAllCountries
230
+ ? countries?.map((country) => ({ key: country.iso2, value: country.iso2, label: country.name })) ?? []
231
+ : travellersSettings?.countries?.map((country) => ({ key: country.iso2, value: country.iso2, label: country.name })) ?? [
232
+ { key: 'be', value: 'be', label: translations.TRAVELERS_FORM.COUNTRIES.BELGIUM },
233
+ { key: 'nl', value: 'nl', label: translations.TRAVELERS_FORM.COUNTRIES.NETHERLANDS },
234
+ { key: 'fr', value: 'fr', label: translations.TRAVELERS_FORM.COUNTRIES.FRANCE }
235
+ ])
236
+ ];
237
+
238
+ const handleMainBookerChange: React.FormEventHandler<HTMLInputElement> = (event) => {
239
+ formik.setFieldValue('mainBookerId', parseInt(event.currentTarget.value, 10));
240
+ };
241
+
242
+ const handleAgentChange = (value: string) => {
243
+ setFilteredAgents(typeaheadAgents.filter((x) => x.value.toLocaleLowerCase().indexOf(value.toLocaleLowerCase()) > -1));
244
+ formik.setFieldValue('travelAgentName', value);
245
+ };
246
+
247
+ const handleAgentSelect = (key: string) => {
248
+ const agent = typeaheadAgents.find((x) => x.key === key);
249
+
250
+ formik.setValues({
251
+ ...formik.values,
252
+ travelAgentId: Number(agent?.key),
253
+ travelAgentName: agent?.value ?? ''
254
+ });
255
+
256
+ onBookingTypeChange?.(agentAdressId && agentAdressId !== 0 ? 'b2b' : 'b2b2c');
257
+ };
258
+
259
+ const handleAgentClear = () => {
260
+ formik.setValues({ ...formik.values, travelAgentId: 0, travelAgentName: '' });
261
+ onBookingTypeChange?.('b2c');
262
+ };
263
+
264
+ const toggleAgent = (value: boolean) => {
265
+ setShowAgents(value);
266
+ if (!value) {
267
+ handleAgentClear();
268
+ setFilteredAgents([]);
269
+ }
270
+ };
271
+
272
+ const handleAddTraveler = (roomIndex: number) => {
273
+ const rooms = [...formik.values.rooms];
274
+ const newAdult = { id: Date.now(), firstName: '', lastName: '', birthDate: '', gender: '' } as Traveler;
275
+ rooms[roomIndex] = { ...rooms[roomIndex], adults: [...rooms[roomIndex].adults, newAdult] };
276
+ formik.setFieldValue('rooms', rooms);
277
+ };
278
+
279
+ const handleRemoveTraveler = (roomIndex: number, travelerIndex: number) => {
280
+ const rooms = [...formik.values.rooms];
281
+ const adults = [...rooms[roomIndex].adults];
282
+ if (adults.length <= 1) return;
283
+
284
+ adults.splice(travelerIndex, 1);
285
+ rooms[roomIndex] = { ...rooms[roomIndex], adults };
286
+ formik.setFieldValue('rooms', rooms);
287
+ };
288
+
289
+ const handleAddRoom = () => {
290
+ const rooms = [...formik.values.rooms];
291
+ rooms.push({ adults: [{ id: Date.now(), firstName: '', lastName: '', birthDate: '', gender: '' } as Traveler], children: [] });
292
+ formik.setFieldValue('rooms', rooms);
293
+ };
294
+
295
+ const handleRemoveRoom = (roomIndex: number) => {
296
+ const rooms = [...formik.values.rooms];
297
+ rooms.splice(roomIndex, 1);
298
+ formik.setFieldValue('rooms', rooms);
299
+ };
300
+
301
+ const renderGenderControl = (name: string, value: Traveler) => (
302
+ <div className={buildClassName(['form__group', hasVisibleError(name) && 'form__group--error'])}>
303
+ <label className="form__label">{translations.TRAVELERS_FORM.GENDER_ID} *</label>
304
+ <div className="radiobutton-group">
305
+ {[
306
+ ['m', translations.TRAVELERS_FORM.MALE_GENDER],
307
+ ['f', translations.TRAVELERS_FORM.FEMALE_GENDER]
308
+ ].map(([gender, label]) => (
309
+ <div className="radiobutton" key={gender}>
310
+ <label className="radiobutton__label">
311
+ <input
312
+ type="radio"
313
+ className="radiobutton__input"
314
+ name={name}
315
+ onChange={formik.handleChange}
316
+ onBlur={formik.handleBlur}
317
+ value={gender}
318
+ checked={value.gender === gender}
319
+ />
320
+ {label}
321
+ </label>
322
+ </div>
323
+ ))}
324
+ </div>
325
+ </div>
326
+ );
327
+
328
+ const getControl = (type: string, value: Traveler, name: string) => {
329
+ switch (type) {
330
+ case 'gender':
331
+ return <GenderControl translations={translations} value={value} formik={formik} name={name} />;
332
+ case 'firstName':
333
+ return (
334
+ <LabeledInput
335
+ hasError={hasVisibleError(name)}
336
+ extraClassName="form__group--md-33"
337
+ label={translations.TRAVELERS_FORM.FIRST_NAME}
338
+ required
339
+ name={name}
340
+ onChange={formik.handleChange}
341
+ onBlur={formik.handleBlur}
342
+ value={value.firstName}
343
+ />
344
+ );
345
+ case 'lastName':
346
+ return (
347
+ <LabeledInput
348
+ hasError={hasVisibleError(name)}
349
+ extraClassName="form__group--md-33"
350
+ label={translations.TRAVELERS_FORM.LAST_NAME}
351
+ required
352
+ name={name}
353
+ onChange={formik.handleChange}
354
+ onBlur={formik.handleBlur}
355
+ value={value.lastName}
356
+ />
357
+ );
358
+ case 'birthDate':
359
+ return (
360
+ <LabeledInput
361
+ type="date"
362
+ hasError={hasVisibleError(name)}
363
+ extraClassName="form__group--md-33"
364
+ label={translations.TRAVELERS_FORM.BIRTHDATE}
365
+ required
366
+ name={name}
367
+ onChange={formik.handleChange}
368
+ onBlur={formik.handleBlur}
369
+ value={value.birthDate}
370
+ />
371
+ );
372
+ case 'country':
373
+ return (
374
+ <LabeledSelect
375
+ hasError={hasVisibleError('country')}
376
+ label={translations.TRAVELERS_FORM.COUNTRY}
377
+ required
378
+ name="country"
379
+ onChange={formik.handleChange}
380
+ onBlur={formik.handleBlur}
381
+ value={formik.values.country}
382
+ options={countryOptions}
383
+ />
384
+ );
385
+ case 'phone':
386
+ return (
387
+ <PhoneInput
388
+ countries={travellersSettings?.countries ?? []}
389
+ countryIso2={formik.values.country}
390
+ hasError={hasVisibleError('phone')}
391
+ label={translations.TRAVELERS_FORM.PHONE}
392
+ required
393
+ name="phone"
394
+ onChange={formik.handleChange}
395
+ onBlur={formik.handleBlur}
396
+ value={formik.values.phone}
397
+ />
398
+ );
399
+ case 'email':
400
+ return (
401
+ <>
402
+ <LabeledInput
403
+ type="email"
404
+ hasError={hasVisibleError('email')}
405
+ extraClassName="form__group--md-33"
406
+ label={translations.TRAVELERS_FORM.EMAIL}
407
+ required
408
+ name="email"
409
+ onChange={formik.handleChange}
410
+ onBlur={formik.handleBlur}
411
+ value={formik.values.email}
412
+ />
413
+ <LabeledInput
414
+ type="email"
415
+ hasError={hasVisibleError('emailConfirmation')}
416
+ extraClassName="form__group--md-33"
417
+ label={translations.TRAVELERS_FORM.REPEAT_EMAIL}
418
+ required
419
+ name="emailConfirmation"
420
+ onChange={formik.handleChange}
421
+ onBlur={formik.handleBlur}
422
+ value={formik.values.emailConfirmation}
423
+ />
424
+ </>
425
+ );
426
+ case 'street':
427
+ return (
428
+ <LabeledInput
429
+ hasError={hasVisibleError('street')}
430
+ extraClassName="form__group--50 form__group--sm-60"
431
+ label={translations.TRAVELERS_FORM.STREET}
432
+ required
433
+ name="street"
434
+ onChange={formik.handleChange}
435
+ onBlur={formik.handleBlur}
436
+ value={formik.values.street}
437
+ />
438
+ );
439
+
440
+ case 'houseNumber':
441
+ return (
442
+ <LabeledInput
443
+ hasError={hasVisibleError('houseNumber')}
444
+ extraClassName="form__group--30 form__group--sm-20"
445
+ label={translations.TRAVELERS_FORM.HOUSE_NUMBER}
446
+ required
447
+ name="houseNumber"
448
+ onChange={formik.handleChange}
449
+ onBlur={formik.handleBlur}
450
+ value={formik.values.houseNumber}
451
+ />
452
+ );
453
+
454
+ case 'box':
455
+ return (
456
+ <LabeledInput
457
+ hasError={hasVisibleError('box')}
458
+ extraClassName="form__group--20"
459
+ label={translations.TRAVELERS_FORM.POST_BOX}
460
+ name="box"
461
+ onChange={formik.handleChange}
462
+ onBlur={formik.handleBlur}
463
+ value={formik.values.box}
464
+ />
465
+ );
466
+
467
+ case 'zipCode':
468
+ return (
469
+ <LabeledInput
470
+ hasError={hasVisibleError('zipCode')}
471
+ extraClassName="form__group--40 form__group--sm-20"
472
+ label={translations.TRAVELERS_FORM.ZIPCODE}
473
+ required
474
+ name="zipCode"
475
+ onChange={formik.handleChange}
476
+ onBlur={formik.handleBlur}
477
+ value={formik.values.zipCode}
478
+ />
479
+ );
480
+
481
+ case 'place':
482
+ return (
483
+ <LabeledInput
484
+ hasError={hasVisibleError('place')}
485
+ extraClassName="form__group--60 form__group--sm-40"
486
+ label={translations.TRAVELERS_FORM.CITY}
487
+ required
488
+ name="place"
489
+ onChange={formik.handleChange}
490
+ onBlur={formik.handleBlur}
491
+ value={formik.values.place}
492
+ />
493
+ );
494
+ default:
495
+ return null;
496
+ }
497
+ };
498
+
499
+ const renderRoomLabel = (room: TravelersFormValues['rooms'][number]) =>
500
+ compact([
501
+ room.adults.length,
502
+ room.adults.length === 1 && ` ${translations.TRAVELERS_FORM.ADULT}`,
503
+ room.adults.length > 1 && ` ${translations.TRAVELERS_FORM.ADULTS}`,
504
+ room.adults?.length && room.children?.length && ', ',
505
+ room.children.length,
506
+ room.children.length === 1 && ` ${translations.TRAVELERS_FORM.CHILD}`,
507
+ room.children.length > 1 && ` ${translations.TRAVELERS_FORM.CHILDREN}`
508
+ ]).join('');
509
+
510
+ const renderTravelerFields = (travelerValues: Traveler, namePrefix: string, isAdult: boolean, roomIndex: number, travelerIndex: number) => {
511
+ if (useCompactForm) {
512
+ return (
513
+ <div className="form__row">
514
+ <LabeledInput
515
+ hasError={hasVisibleError(`${namePrefix}.age`)}
516
+ extraClassName="form__group--md-33"
517
+ label={translations.TRAVELERS_FORM.AGE}
518
+ required
519
+ name={`${namePrefix}.age`}
520
+ onChange={formik.handleChange}
521
+ onBlur={formik.handleBlur}
522
+ value={travelerValues.age}
523
+ />
524
+ </div>
525
+ );
526
+ }
527
+
528
+ if (travellersSettings?.formFields?.length) {
529
+ return (
530
+ <div className="travelers-form__grid">
531
+ {travellersSettings.formFields.map((field, index) => (
532
+ <div key={index} className={`control control--${field.type}`}>
533
+ {getControl(field.type, travelerValues, `${namePrefix}.${field.type}`)}
534
+ </div>
535
+ ))}
536
+ </div>
537
+ );
538
+ }
539
+
540
+ return (
541
+ <>
542
+ <div className="form__row">{renderGenderControl(`${namePrefix}.gender`, travelerValues)}</div>
543
+ <div className="form__row">
544
+ <LabeledInput
545
+ hasError={hasVisibleError(`${namePrefix}.firstName`)}
546
+ extraClassName="form__group--md-33"
547
+ label={translations.TRAVELERS_FORM.FIRST_NAME}
548
+ required
549
+ name={`${namePrefix}.firstName`}
550
+ onChange={formik.handleChange}
551
+ onBlur={formik.handleBlur}
552
+ value={travelerValues.firstName}
553
+ />
554
+ <LabeledInput
555
+ hasError={hasVisibleError(`${namePrefix}.lastName`)}
556
+ extraClassName="form__group--md-33"
557
+ label={translations.TRAVELERS_FORM.LAST_NAME}
558
+ required
559
+ name={`${namePrefix}.lastName`}
560
+ onChange={formik.handleChange}
561
+ onBlur={formik.handleBlur}
562
+ value={travelerValues.lastName}
563
+ />
564
+ <LabeledInput
565
+ type="date"
566
+ hasError={hasVisibleError(`${namePrefix}.birthDate`)}
567
+ extraClassName="form__group--md-33"
568
+ label={translations.TRAVELERS_FORM.BIRTHDATE}
569
+ required
570
+ name={`${namePrefix}.birthDate`}
571
+ onChange={formik.handleChange}
572
+ onBlur={formik.handleBlur}
573
+ value={travelerValues.birthDate}
574
+ />
575
+ </div>
576
+ {travelersFirstStep && isAdult && formik.values.rooms[roomIndex].adults.length > 1 && (
577
+ <button type="button" className="cta cta--secondary" onClick={() => handleRemoveTraveler(roomIndex, travelerIndex)}>
578
+ {translations.TRAVELERS_FORM.REMOVE_TRAVELER}
579
+ </button>
580
+ )}
581
+ </>
582
+ );
583
+ };
584
+
585
+ return (
586
+ <form
587
+ className="form form__travelers"
588
+ name="booking--travellers"
589
+ id="booking--travellers"
590
+ noValidate
591
+ onSubmit={formik.handleSubmit}
592
+ onReset={formik.handleReset}>
593
+ <div className="form__travelers__wrapper">
594
+ {formik.values.rooms.map((room, roomIndex) => (
595
+ <div key={roomIndex}>
596
+ {formik.values.rooms.length > 1 && (
597
+ <div className="form__region">
598
+ <div className="form__region-header">
599
+ <h5 className="form__region-heading">
600
+ {translations.SHARED.ROOM} {roomIndex + 1}
601
+ </h5>
602
+ <p className="form__region-label">{renderRoomLabel(room)}</p>
603
+ </div>
604
+ {!useCompactForm && travelersFirstStep && formik.values.rooms.length > 1 && (
605
+ <button type="button" className="cta cta--secondary" onClick={() => handleRemoveRoom(roomIndex)}>
606
+ Verwijder reisgezelschap
607
+ </button>
608
+ )}
609
+ </div>
610
+ )}
611
+
612
+ {room.adults.map((travelerValues, index) => (
613
+ <div className="form__region" key={travelerValues.id}>
614
+ <div className="form__region-header">
615
+ <h5 className="form__region-heading">
616
+ {translations.TRAVELERS_FORM.TRAVELER} {index + 1}
617
+ </h5>
618
+ <p className="form__region-label">{translations.TRAVELERS_FORM.ADULT}</p>
619
+ <div className="radiobutton">
620
+ <label className="radiobutton__label">
621
+ <input
622
+ type="radio"
623
+ name="mainBookerId"
624
+ onChange={handleMainBookerChange}
625
+ onBlur={formik.handleBlur}
626
+ value={travelerValues.id}
627
+ checked={formik.values.mainBookerId === travelerValues.id}
628
+ className="radiobutton__input"
629
+ />
630
+ {translations.TRAVELERS_FORM.MAIN_BOOKER}
631
+ </label>
632
+ </div>
633
+ </div>
634
+ {renderTravelerFields(travelerValues, `rooms[${roomIndex}].adults[${index}]`, true, roomIndex, index)}
635
+ </div>
636
+ ))}
637
+
638
+ {room.children.map((travelerValues, index) => (
639
+ <div className="form__region" key={travelerValues.id}>
640
+ <div className="form__region-header">
641
+ <h5 className="form__region-heading">
642
+ {translations.TRAVELERS_FORM.TRAVELER} {room.adults.length + index + 1}
643
+ </h5>
644
+ <p className="form__region-label">{translations.TRAVELERS_FORM.CHILD}</p>
645
+ </div>
646
+ {renderTravelerFields(travelerValues, `rooms[${roomIndex}].children[${index}]`, false, roomIndex, index)}
647
+ </div>
648
+ ))}
649
+
650
+ {!useCompactForm && travelersFirstStep && (
651
+ <div className="form__region">
652
+ <button type="button" className="cta cta--select" onClick={() => handleAddTraveler(roomIndex)}>
653
+ {translations.TRAVELERS_FORM.ADD_TRAVELER}
654
+ </button>
655
+ </div>
656
+ )}
657
+ </div>
658
+ ))}
659
+
660
+ {!useCompactForm && (bookingType !== 'b2b' || travellersSettings?.mainBookerFormFields?.length) ? (
661
+ <div className="form__region">
662
+ <div className="form__region-header">
663
+ <h5 className="form__region-heading">{translations.TRAVELERS_FORM.MAIN_BOOKER}</h5>
664
+ <p className="form__region-label">
665
+ {compact([
666
+ compact([mainBooker?.firstName, mainBooker?.lastName]).join(' '),
667
+ mainBooker?.birthDate && format(parse(mainBooker.birthDate, 'yyyy-MM-dd', new Date()), 'dd-MM-yyyy')
668
+ ]).join(', ')}
669
+ </p>
670
+ </div>
671
+ {travellersSettings?.mainBookerFormFields?.length ? (
672
+ <div className="main-booker-form__grid">
673
+ {travellersSettings.mainBookerFormFields.map((field, index) => (
674
+ <div key={index} className={`control control--${field.type}`}>
675
+ {getControl(field.type, {} as Traveler, field.type)}
676
+ </div>
677
+ ))}
678
+ </div>
679
+ ) : (
680
+ <>
681
+ <div className="form__twocolumn">
682
+ <div className="form__twocolumn-column">
683
+ <div className="form__row">
684
+ <LabeledInput
685
+ hasError={hasVisibleError('street')}
686
+ extraClassName="form__group--50 form__group--sm-60"
687
+ label={translations.TRAVELERS_FORM.STREET}
688
+ required
689
+ name="street"
690
+ onChange={formik.handleChange}
691
+ onBlur={formik.handleBlur}
692
+ value={formik.values.street}
693
+ />
694
+ <LabeledInput
695
+ hasError={hasVisibleError('houseNumber')}
696
+ extraClassName="form__group--30 form__group--sm-20"
697
+ label={translations.TRAVELERS_FORM.HOUSE_NUMBER}
698
+ required
699
+ name="houseNumber"
700
+ onChange={formik.handleChange}
701
+ onBlur={formik.handleBlur}
702
+ value={formik.values.houseNumber}
703
+ />
704
+ <LabeledInput
705
+ hasError={hasVisibleError('box')}
706
+ extraClassName="form__group--20"
707
+ label={translations.TRAVELERS_FORM.POST_BOX}
708
+ name="box"
709
+ onChange={formik.handleChange}
710
+ onBlur={formik.handleBlur}
711
+ value={formik.values.box}
712
+ />
713
+ </div>
714
+ </div>
715
+ <div className="form__twocolumn-column">
716
+ <div className="form__row">
717
+ <LabeledInput
718
+ hasError={hasVisibleError('zipCode')}
719
+ extraClassName="form__group--40 form__group--sm-20"
720
+ label={translations.TRAVELERS_FORM.ZIPCODE}
721
+ required
722
+ name="zipCode"
723
+ onChange={formik.handleChange}
724
+ onBlur={formik.handleBlur}
725
+ value={formik.values.zipCode}
726
+ />
727
+ <LabeledInput
728
+ hasError={hasVisibleError('place')}
729
+ extraClassName="form__group--60 form__group--sm-40"
730
+ label={translations.TRAVELERS_FORM.CITY}
731
+ required
732
+ name="place"
733
+ onChange={formik.handleChange}
734
+ onBlur={formik.handleBlur}
735
+ value={formik.values.place}
736
+ />
737
+ <LabeledSelect
738
+ hasError={hasVisibleError('country')}
739
+ extraClassName="form__group--sm-40"
740
+ label={translations.TRAVELERS_FORM.COUNTRY}
741
+ required
742
+ name="country"
743
+ onChange={formik.handleChange}
744
+ onBlur={formik.handleBlur}
745
+ value={formik.values.country}
746
+ options={countryOptions}
747
+ />
748
+ </div>
749
+ </div>
750
+ </div>
751
+ <div className="form__row">
752
+ <LabeledInput
753
+ hasError={hasVisibleError('phone')}
754
+ extraClassName="form__group--md-33"
755
+ label={translations.TRAVELERS_FORM.PHONE}
756
+ required
757
+ name="phone"
758
+ onChange={formik.handleChange}
759
+ onBlur={formik.handleBlur}
760
+ value={formik.values.phone}
761
+ />
762
+ <LabeledInput
763
+ type="email"
764
+ hasError={hasVisibleError('email')}
765
+ extraClassName="form__group--md-33"
766
+ label={translations.TRAVELERS_FORM.EMAIL}
767
+ required
768
+ name="email"
769
+ onChange={formik.handleChange}
770
+ onBlur={formik.handleBlur}
771
+ value={formik.values.email}
772
+ />
773
+ <LabeledInput
774
+ type="email"
775
+ hasError={hasVisibleError('emailConfirmation')}
776
+ extraClassName="form__group--md-33"
777
+ label={translations.TRAVELERS_FORM.REPEAT_EMAIL}
778
+ required
779
+ name="emailConfirmation"
780
+ onChange={formik.handleChange}
781
+ onBlur={formik.handleBlur}
782
+ value={formik.values.emailConfirmation}
783
+ />
784
+ </div>
785
+ </>
786
+ )}
787
+ </div>
788
+ ) : !useCompactForm ? (
789
+ <div className="form__region">
790
+ <div className="form__row">
791
+ <LabeledInput
792
+ hasError={hasVisibleError('phone')}
793
+ extraClassName="form__group--md-33"
794
+ label={translations.TRAVELERS_FORM.PHONE}
795
+ required
796
+ name="phone"
797
+ onChange={formik.handleChange}
798
+ onBlur={formik.handleBlur}
799
+ value={formik.values.phone}
800
+ />
801
+ </div>
802
+ </div>
803
+ ) : null}
804
+
805
+ {!useCompactForm && showAgentSelection && (
806
+ <div className="form__region">
807
+ <div className="form__region-header">
808
+ <h5 className="form__region-heading">{translations.TRAVELERS_FORM.BOOK_WITH_AGENT}</h5>
809
+ <div className="checkbox" id="cbxChooseOffice">
810
+ <label className="checkbox__label">
811
+ <input
812
+ type="checkbox"
813
+ name="booking--mainbooker"
814
+ checked={showAgents}
815
+ onChange={() => toggleAgent(!showAgents)}
816
+ className="checkbox__input"
817
+ />
818
+ {translations.TRAVELERS_FORM.CHOOSE_OFFICE}
819
+ </label>
820
+ </div>
821
+ </div>
822
+ {showAgents && (
823
+ <div className="form__row form__row--choose-office">
824
+ <div className={buildClassName(['form__group', 'form__group--icon', hasVisibleError('travelAgentId') && 'form__group--error'])}>
825
+ <TypeAheadInput
826
+ value={formik.values.travelAgentName}
827
+ options={filteredAgents}
828
+ onChange={handleAgentChange}
829
+ onSelect={handleAgentSelect}
830
+ onClear={handleAgentClear}
831
+ name="travelAgentName"
832
+ placeholder={translations.TRAVELERS_FORM.CHOOSE_AGENT_PLACEHOLDER}
833
+ />
834
+ </div>
835
+ </div>
836
+ )}
837
+ </div>
838
+ )}
839
+ </div>
840
+
841
+ {!useCompactForm && errorKeys.length > 0 && (
842
+ <div className="form__region form__region--errors">
843
+ <div className="form__row">
844
+ <div className="form__group">
845
+ <p className="form__error-heading">{translations.TRAVELERS_FORM.VALIDATION_MESSAGE}:</p>
846
+ <ul className="list">
847
+ {errorKeys.map((key) => (
848
+ <li key={key}>{get(flatErrors, key)}</li>
849
+ ))}
850
+ </ul>
851
+ </div>
852
+ </div>
853
+ </div>
854
+ )}
855
+
856
+ {travelersFirstStep && (
857
+ <div className="booking__navigator">
858
+ <button type="button" className="cta cta--select" onClick={handleAddRoom}>
859
+ {translations.TRAVELERS_FORM.ADD_ROOM}
860
+ </button>
861
+ </div>
862
+ )}
863
+
864
+ <div className="booking__navigator">
865
+ {renderPreviousButton?.()}
866
+ <button type="submit" title={translations.STEPS.NEXT} className={'cta' + (isUnavailable ? ' cta--disabled' : '')}>
867
+ {translations.STEPS.NEXT}
868
+ </button>
869
+ </div>
870
+ </form>
871
+ );
872
+ };
873
+
874
+ export default SharedTravelersForm;