@qite/tide-booking-component 1.4.95 → 1.4.97

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 (453) hide show
  1. package/README.md +24 -24
  2. package/build/build-cjs/index.js +48813 -29709
  3. package/build/build-cjs/src/booking-product/components/age-select.d.ts +3 -3
  4. package/build/build-cjs/src/booking-product/components/amount-input.d.ts +5 -5
  5. package/build/build-cjs/src/booking-product/components/date-range-picker/calendar-day.d.ts +8 -8
  6. package/build/build-cjs/src/booking-product/components/date-range-picker/calendar.d.ts +14 -14
  7. package/build/build-cjs/src/booking-product/components/date-range-picker/index.d.ts +16 -19
  8. package/build/build-cjs/src/booking-product/components/dates.d.ts +8 -8
  9. package/build/build-cjs/src/booking-product/components/footer.d.ts +5 -5
  10. package/build/build-cjs/src/booking-product/components/header.d.ts +6 -6
  11. package/build/build-cjs/src/booking-product/components/icon.d.ts +5 -5
  12. package/build/build-cjs/src/booking-product/components/list-view.d.ts +2 -2
  13. package/build/build-cjs/src/booking-product/components/product.d.ts +4 -4
  14. package/build/build-cjs/src/booking-product/components/rating.d.ts +1 -1
  15. package/build/build-cjs/src/booking-product/components/rooms.d.ts +4 -4
  16. package/build/build-cjs/src/booking-product/constants.d.ts +1 -1
  17. package/build/build-cjs/src/booking-product/index.d.ts +4 -4
  18. package/build/build-cjs/src/booking-product/settings-context.d.ts +1 -2
  19. package/build/build-cjs/src/booking-product/types.d.ts +21 -21
  20. package/build/build-cjs/src/booking-product/utils/api.d.ts +11 -2
  21. package/build/build-cjs/src/booking-product/utils/price.d.ts +10 -1
  22. package/build/build-cjs/src/booking-wizard/api-settings-slice.d.ts +3 -2
  23. package/build/build-cjs/src/booking-wizard/components/icon.d.ts +5 -5
  24. package/build/build-cjs/src/booking-wizard/components/labeled-input.d.ts +13 -13
  25. package/build/build-cjs/src/booking-wizard/components/labeled-select.d.ts +16 -16
  26. package/build/build-cjs/src/booking-wizard/components/message.d.ts +4 -4
  27. package/build/build-cjs/src/booking-wizard/components/multi-range-filter.d.ts +6 -6
  28. package/build/build-cjs/src/booking-wizard/components/phone-input.d.ts +11 -11
  29. package/build/build-cjs/src/booking-wizard/components/print-offer-button.d.ts +11 -11
  30. package/build/build-cjs/src/booking-wizard/components/product-card.d.ts +3 -3
  31. package/build/build-cjs/src/booking-wizard/components/step-indicator.d.ts +1 -1
  32. package/build/build-cjs/src/booking-wizard/components/step-route.d.ts +3 -3
  33. package/build/build-cjs/src/booking-wizard/features/booking/api.d.ts +26 -7
  34. package/build/build-cjs/src/booking-wizard/features/booking/booking-self-contained.d.ts +3 -3
  35. package/build/build-cjs/src/booking-wizard/features/booking/booking-slice.d.ts +102 -43
  36. package/build/build-cjs/src/booking-wizard/features/booking/booking.d.ts +3 -3
  37. package/build/build-cjs/src/booking-wizard/features/booking/constants.d.ts +8 -1
  38. package/build/build-cjs/src/booking-wizard/features/booking/selectors.d.ts +644 -479
  39. package/build/build-cjs/src/booking-wizard/features/confirmation/confirmation.d.ts +1 -2
  40. package/build/build-cjs/src/booking-wizard/features/error/error.d.ts +1 -2
  41. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-filter.d.ts +3 -3
  42. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-option-flight.d.ts +2 -2
  43. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-option.d.ts +4 -4
  44. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-utils.d.ts +9 -2
  45. package/build/build-cjs/src/booking-wizard/features/flight-options/index.d.ts +1 -2
  46. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-api.d.ts +6 -1
  47. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-slice.d.ts +15 -10
  48. package/build/build-cjs/src/booking-wizard/features/price-details/selectors.d.ts +302 -287
  49. package/build/build-cjs/src/booking-wizard/features/product-options/none-option.d.ts +3 -3
  50. package/build/build-cjs/src/booking-wizard/features/product-options/option-booking-airline-group.d.ts +2 -2
  51. package/build/build-cjs/src/booking-wizard/features/product-options/option-booking-group.d.ts +6 -6
  52. package/build/build-cjs/src/booking-wizard/features/product-options/option-item.d.ts +5 -5
  53. package/build/build-cjs/src/booking-wizard/features/product-options/option-pax-card.d.ts +4 -4
  54. package/build/build-cjs/src/booking-wizard/features/product-options/option-pax-group.d.ts +7 -7
  55. package/build/build-cjs/src/booking-wizard/features/product-options/option-room.d.ts +5 -5
  56. package/build/build-cjs/src/booking-wizard/features/product-options/option-unit-group.d.ts +7 -7
  57. package/build/build-cjs/src/booking-wizard/features/product-options/option-units-card.d.ts +3 -3
  58. package/build/build-cjs/src/booking-wizard/features/product-options/options-form.d.ts +1 -2
  59. package/build/build-cjs/src/booking-wizard/features/room-options/index.d.ts +1 -2
  60. package/build/build-cjs/src/booking-wizard/features/room-options/room-utils.d.ts +19 -6
  61. package/build/build-cjs/src/booking-wizard/features/room-options/room.d.ts +6 -6
  62. package/build/build-cjs/src/booking-wizard/features/room-options/traveler-rooms.d.ts +3 -3
  63. package/build/build-cjs/src/booking-wizard/features/sidebar/index.d.ts +2 -2
  64. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar-flight.d.ts +2 -2
  65. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar-util.d.ts +4 -2
  66. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar.d.ts +24 -24
  67. package/build/build-cjs/src/booking-wizard/features/summary/summary-booking-option-pax.d.ts +1 -1
  68. package/build/build-cjs/src/booking-wizard/features/summary/summary-booking-option-unit.d.ts +1 -1
  69. package/build/build-cjs/src/booking-wizard/features/summary/summary-flight.d.ts +2 -2
  70. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-booking-option-group.d.ts +1 -1
  71. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-pax-option-group.d.ts +1 -1
  72. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-unit-option-group.d.ts +1 -1
  73. package/build/build-cjs/src/booking-wizard/features/summary/summary-slice.d.ts +3 -3
  74. package/build/build-cjs/src/booking-wizard/features/summary/summary.d.ts +1 -2
  75. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form-slice.d.ts +75 -75
  76. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form-util.d.ts +4 -4
  77. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form.d.ts +1 -2
  78. package/build/build-cjs/src/booking-wizard/features/travelers-form/type-ahead-input.d.ts +11 -11
  79. package/build/build-cjs/src/booking-wizard/features/travelers-form/validate-form.d.ts +8 -1
  80. package/build/build-cjs/src/booking-wizard/index.d.ts +6 -6
  81. package/build/build-cjs/src/booking-wizard/settings-context.d.ts +1 -2
  82. package/build/build-cjs/src/booking-wizard/store.d.ts +40 -22
  83. package/build/build-cjs/src/booking-wizard/types.d.ts +240 -240
  84. package/build/build-cjs/src/booking-wizard/use-offer-printer.d.ts +8 -8
  85. package/build/build-cjs/src/content/components/LanguageSwitcher.d.ts +5 -5
  86. package/build/build-cjs/src/content/components/accordion.d.ts +4 -4
  87. package/build/build-cjs/src/content/components/breadcrumb.d.ts +7 -7
  88. package/build/build-cjs/src/content/components/faq.d.ts +4 -4
  89. package/build/build-cjs/src/content/components/gallery.d.ts +6 -6
  90. package/build/build-cjs/src/content/components/icon.d.ts +5 -5
  91. package/build/build-cjs/src/content/components/image-with-text.d.ts +18 -18
  92. package/build/build-cjs/src/content/components/slider.d.ts +5 -5
  93. package/build/build-cjs/src/content/featured-trips/types.d.ts +8 -8
  94. package/build/build-cjs/src/content/features/content-page/content-page-self-contained.d.ts +1 -1
  95. package/build/build-cjs/src/content/footer/types.d.ts +17 -17
  96. package/build/build-cjs/src/content/header/types.d.ts +23 -20
  97. package/build/build-cjs/src/content/image-card-grid/types.d.ts +8 -8
  98. package/build/build-cjs/src/content/image-with-text-section/types.d.ts +15 -15
  99. package/build/build-cjs/src/content/login/login-services.d.ts +6 -1
  100. package/build/build-cjs/src/content/login/types.d.ts +19 -19
  101. package/build/build-cjs/src/content/navbar/placeholderData.d.ts +2 -2
  102. package/build/build-cjs/src/content/navbar/types.d.ts +22 -22
  103. package/build/build-cjs/src/index.d.ts +17 -1
  104. package/build/build-cjs/src/qsm/components/date-range-picker/calendar-day.d.ts +7 -7
  105. package/build/build-cjs/src/qsm/components/date-range-picker/calendar.d.ts +18 -18
  106. package/build/build-cjs/src/qsm/components/date-range-picker/index.d.ts +5 -5
  107. package/build/build-cjs/src/qsm/components/double-search-input-group/index.d.ts +2 -2
  108. package/build/build-cjs/src/qsm/components/icon.d.ts +5 -5
  109. package/build/build-cjs/src/qsm/components/item-picker/index.d.ts +7 -7
  110. package/build/build-cjs/src/qsm/components/search-input/index.d.ts +9 -9
  111. package/build/build-cjs/src/qsm/components/search-input-group/index.d.ts +7 -7
  112. package/build/build-cjs/src/qsm/index.d.ts +1 -1
  113. package/build/build-cjs/src/qsm/store/qsm-slice.d.ts +110 -58
  114. package/build/build-cjs/src/qsm/store/qsm-store.d.ts +20 -7
  115. package/build/build-cjs/src/qsm/types.d.ts +59 -59
  116. package/build/build-cjs/src/search-results/components/filters/filters.d.ts +5 -5
  117. package/build/build-cjs/src/search-results/components/filters/flight-filters.d.ts +3 -3
  118. package/build/build-cjs/src/search-results/components/flight/flight-banner.d.ts +2 -2
  119. package/build/build-cjs/src/search-results/components/flight/flight-card.d.ts +1 -1
  120. package/build/build-cjs/src/search-results/components/flight/flight-leg.d.ts +1 -1
  121. package/build/build-cjs/src/search-results/components/flight/flight-path.d.ts +1 -1
  122. package/build/build-cjs/src/search-results/components/flight/flight-results.d.ts +2 -2
  123. package/build/build-cjs/src/search-results/components/flight/flight-search-context/index.d.ts +29 -29
  124. package/build/build-cjs/src/search-results/components/flight/flight-selection/independent-flight-option.d.ts +5 -5
  125. package/build/build-cjs/src/search-results/components/flight/flight-selection/independent-flight-selection.d.ts +1 -1
  126. package/build/build-cjs/src/search-results/components/flight/flight-selection/index.d.ts +2 -2
  127. package/build/build-cjs/src/search-results/components/flight/flight-selection/paired-flight-option.d.ts +1 -1
  128. package/build/build-cjs/src/search-results/components/flight/flight-selection/paired-flight-selection.d.ts +1 -1
  129. package/build/build-cjs/src/search-results/components/group-tour/group-tour-card.d.ts +3 -3
  130. package/build/build-cjs/src/search-results/components/group-tour/group-tour-results.d.ts +1 -1
  131. package/build/build-cjs/src/search-results/components/hotel/hotel-accommodation-results.d.ts +1 -1
  132. package/build/build-cjs/src/search-results/components/hotel/hotel-card.d.ts +2 -2
  133. package/build/build-cjs/src/search-results/components/icon.d.ts +6 -6
  134. package/build/build-cjs/src/search-results/components/item-picker/index.d.ts +8 -8
  135. package/build/build-cjs/src/search-results/components/itinerary/index.d.ts +3 -3
  136. package/build/build-cjs/src/search-results/components/multi-range-filter.d.ts +6 -6
  137. package/build/build-cjs/src/search-results/components/round-trip/round-trip-results.d.ts +1 -2
  138. package/build/build-cjs/src/search-results/components/search-results-container/flight-search-results.d.ts +1 -1
  139. package/build/build-cjs/src/search-results/components/tab-views/index.d.ts +1 -2
  140. package/build/build-cjs/src/search-results/features/flights/flight-search-results-self-contained.d.ts +1 -2
  141. package/build/build-cjs/src/search-results/features/hotels/hotel-flight-search-results-self-contained.d.ts +1 -2
  142. package/build/build-cjs/src/search-results/features/hotels/hotel-search-results-self-contained.d.ts +1 -2
  143. package/build/build-cjs/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.d.ts +1 -2
  144. package/build/build-cjs/src/search-results/index.d.ts +1 -1
  145. package/build/build-cjs/src/search-results/store/search-results-slice.d.ts +63 -26
  146. package/build/build-cjs/src/search-results/store/search-results-store.d.ts +20 -7
  147. package/build/build-cjs/src/search-results/types.d.ts +104 -104
  148. package/build/build-cjs/src/search-results/utils/flight-utils.d.ts +6 -1
  149. package/build/build-cjs/src/search-results/utils/search-results-utils.d.ts +10 -2
  150. package/build/build-cjs/src/shared/components/flyin/accommodation-flyin.d.ts +3 -3
  151. package/build/build-cjs/src/shared/components/flyin/flights-flyin.d.ts +2 -2
  152. package/build/build-cjs/src/shared/components/flyin/flyin.d.ts +7 -7
  153. package/build/build-cjs/src/shared/components/flyin/group-tour-flyin.d.ts +3 -3
  154. package/build/build-cjs/src/shared/components/icon.d.ts +5 -5
  155. package/build/build-cjs/src/shared/components/loader.d.ts +1 -1
  156. package/build/build-cjs/src/shared/types.d.ts +9 -9
  157. package/build/build-cjs/src/shared/utils/localization-util.d.ts +395 -396
  158. package/build/build-esm/index.js +48531 -29650
  159. package/build/build-esm/src/booking-product/components/age-select.d.ts +3 -3
  160. package/build/build-esm/src/booking-product/components/amount-input.d.ts +5 -5
  161. package/build/build-esm/src/booking-product/components/date-range-picker/calendar-day.d.ts +8 -8
  162. package/build/build-esm/src/booking-product/components/date-range-picker/calendar.d.ts +14 -14
  163. package/build/build-esm/src/booking-product/components/date-range-picker/index.d.ts +16 -19
  164. package/build/build-esm/src/booking-product/components/dates.d.ts +8 -8
  165. package/build/build-esm/src/booking-product/components/footer.d.ts +5 -5
  166. package/build/build-esm/src/booking-product/components/header.d.ts +6 -6
  167. package/build/build-esm/src/booking-product/components/icon.d.ts +5 -5
  168. package/build/build-esm/src/booking-product/components/list-view.d.ts +2 -2
  169. package/build/build-esm/src/booking-product/components/product.d.ts +4 -4
  170. package/build/build-esm/src/booking-product/components/rating.d.ts +1 -1
  171. package/build/build-esm/src/booking-product/components/rooms.d.ts +4 -4
  172. package/build/build-esm/src/booking-product/constants.d.ts +1 -1
  173. package/build/build-esm/src/booking-product/index.d.ts +4 -4
  174. package/build/build-esm/src/booking-product/settings-context.d.ts +1 -2
  175. package/build/build-esm/src/booking-product/types.d.ts +21 -21
  176. package/build/build-esm/src/booking-product/utils/api.d.ts +11 -2
  177. package/build/build-esm/src/booking-product/utils/price.d.ts +10 -1
  178. package/build/build-esm/src/booking-wizard/api-settings-slice.d.ts +3 -2
  179. package/build/build-esm/src/booking-wizard/components/icon.d.ts +5 -5
  180. package/build/build-esm/src/booking-wizard/components/labeled-input.d.ts +13 -13
  181. package/build/build-esm/src/booking-wizard/components/labeled-select.d.ts +16 -16
  182. package/build/build-esm/src/booking-wizard/components/message.d.ts +4 -4
  183. package/build/build-esm/src/booking-wizard/components/multi-range-filter.d.ts +6 -6
  184. package/build/build-esm/src/booking-wizard/components/phone-input.d.ts +11 -11
  185. package/build/build-esm/src/booking-wizard/components/print-offer-button.d.ts +11 -11
  186. package/build/build-esm/src/booking-wizard/components/product-card.d.ts +3 -3
  187. package/build/build-esm/src/booking-wizard/components/step-indicator.d.ts +1 -1
  188. package/build/build-esm/src/booking-wizard/components/step-route.d.ts +3 -3
  189. package/build/build-esm/src/booking-wizard/features/booking/api.d.ts +26 -7
  190. package/build/build-esm/src/booking-wizard/features/booking/booking-self-contained.d.ts +3 -3
  191. package/build/build-esm/src/booking-wizard/features/booking/booking-slice.d.ts +102 -43
  192. package/build/build-esm/src/booking-wizard/features/booking/booking.d.ts +3 -3
  193. package/build/build-esm/src/booking-wizard/features/booking/constants.d.ts +8 -1
  194. package/build/build-esm/src/booking-wizard/features/booking/selectors.d.ts +644 -479
  195. package/build/build-esm/src/booking-wizard/features/confirmation/confirmation.d.ts +1 -2
  196. package/build/build-esm/src/booking-wizard/features/error/error.d.ts +1 -2
  197. package/build/build-esm/src/booking-wizard/features/flight-options/flight-filter.d.ts +3 -3
  198. package/build/build-esm/src/booking-wizard/features/flight-options/flight-option-flight.d.ts +2 -2
  199. package/build/build-esm/src/booking-wizard/features/flight-options/flight-option.d.ts +4 -4
  200. package/build/build-esm/src/booking-wizard/features/flight-options/flight-utils.d.ts +9 -2
  201. package/build/build-esm/src/booking-wizard/features/flight-options/index.d.ts +1 -2
  202. package/build/build-esm/src/booking-wizard/features/price-details/price-details-api.d.ts +6 -1
  203. package/build/build-esm/src/booking-wizard/features/price-details/price-details-slice.d.ts +15 -10
  204. package/build/build-esm/src/booking-wizard/features/price-details/selectors.d.ts +302 -287
  205. package/build/build-esm/src/booking-wizard/features/product-options/none-option.d.ts +3 -3
  206. package/build/build-esm/src/booking-wizard/features/product-options/option-booking-airline-group.d.ts +2 -2
  207. package/build/build-esm/src/booking-wizard/features/product-options/option-booking-group.d.ts +6 -6
  208. package/build/build-esm/src/booking-wizard/features/product-options/option-item.d.ts +5 -5
  209. package/build/build-esm/src/booking-wizard/features/product-options/option-pax-card.d.ts +4 -4
  210. package/build/build-esm/src/booking-wizard/features/product-options/option-pax-group.d.ts +7 -7
  211. package/build/build-esm/src/booking-wizard/features/product-options/option-room.d.ts +5 -5
  212. package/build/build-esm/src/booking-wizard/features/product-options/option-unit-group.d.ts +7 -7
  213. package/build/build-esm/src/booking-wizard/features/product-options/option-units-card.d.ts +3 -3
  214. package/build/build-esm/src/booking-wizard/features/product-options/options-form.d.ts +1 -2
  215. package/build/build-esm/src/booking-wizard/features/room-options/index.d.ts +1 -2
  216. package/build/build-esm/src/booking-wizard/features/room-options/room-utils.d.ts +19 -6
  217. package/build/build-esm/src/booking-wizard/features/room-options/room.d.ts +6 -6
  218. package/build/build-esm/src/booking-wizard/features/room-options/traveler-rooms.d.ts +3 -3
  219. package/build/build-esm/src/booking-wizard/features/sidebar/index.d.ts +2 -2
  220. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar-flight.d.ts +2 -2
  221. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar-util.d.ts +4 -2
  222. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar.d.ts +24 -24
  223. package/build/build-esm/src/booking-wizard/features/summary/summary-booking-option-pax.d.ts +1 -1
  224. package/build/build-esm/src/booking-wizard/features/summary/summary-booking-option-unit.d.ts +1 -1
  225. package/build/build-esm/src/booking-wizard/features/summary/summary-flight.d.ts +2 -2
  226. package/build/build-esm/src/booking-wizard/features/summary/summary-per-booking-option-group.d.ts +1 -1
  227. package/build/build-esm/src/booking-wizard/features/summary/summary-per-pax-option-group.d.ts +1 -1
  228. package/build/build-esm/src/booking-wizard/features/summary/summary-per-unit-option-group.d.ts +1 -1
  229. package/build/build-esm/src/booking-wizard/features/summary/summary-slice.d.ts +3 -3
  230. package/build/build-esm/src/booking-wizard/features/summary/summary.d.ts +1 -2
  231. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form-slice.d.ts +75 -75
  232. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form-util.d.ts +4 -4
  233. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form.d.ts +1 -2
  234. package/build/build-esm/src/booking-wizard/features/travelers-form/type-ahead-input.d.ts +11 -11
  235. package/build/build-esm/src/booking-wizard/features/travelers-form/validate-form.d.ts +8 -1
  236. package/build/build-esm/src/booking-wizard/index.d.ts +6 -6
  237. package/build/build-esm/src/booking-wizard/settings-context.d.ts +1 -2
  238. package/build/build-esm/src/booking-wizard/store.d.ts +40 -22
  239. package/build/build-esm/src/booking-wizard/types.d.ts +240 -240
  240. package/build/build-esm/src/booking-wizard/use-offer-printer.d.ts +8 -8
  241. package/build/build-esm/src/content/components/LanguageSwitcher.d.ts +5 -5
  242. package/build/build-esm/src/content/components/accordion.d.ts +4 -4
  243. package/build/build-esm/src/content/components/breadcrumb.d.ts +7 -7
  244. package/build/build-esm/src/content/components/faq.d.ts +4 -4
  245. package/build/build-esm/src/content/components/gallery.d.ts +6 -6
  246. package/build/build-esm/src/content/components/icon.d.ts +5 -5
  247. package/build/build-esm/src/content/components/image-with-text.d.ts +18 -18
  248. package/build/build-esm/src/content/components/slider.d.ts +5 -5
  249. package/build/build-esm/src/content/featured-trips/types.d.ts +8 -8
  250. package/build/build-esm/src/content/features/content-page/content-page-self-contained.d.ts +1 -1
  251. package/build/build-esm/src/content/footer/types.d.ts +17 -17
  252. package/build/build-esm/src/content/header/types.d.ts +23 -20
  253. package/build/build-esm/src/content/image-card-grid/types.d.ts +8 -8
  254. package/build/build-esm/src/content/image-with-text-section/types.d.ts +15 -15
  255. package/build/build-esm/src/content/login/login-services.d.ts +6 -1
  256. package/build/build-esm/src/content/login/types.d.ts +19 -19
  257. package/build/build-esm/src/content/navbar/placeholderData.d.ts +2 -2
  258. package/build/build-esm/src/content/navbar/types.d.ts +22 -22
  259. package/build/build-esm/src/index.d.ts +17 -1
  260. package/build/build-esm/src/qsm/components/date-range-picker/calendar-day.d.ts +7 -7
  261. package/build/build-esm/src/qsm/components/date-range-picker/calendar.d.ts +18 -18
  262. package/build/build-esm/src/qsm/components/date-range-picker/index.d.ts +5 -5
  263. package/build/build-esm/src/qsm/components/double-search-input-group/index.d.ts +2 -2
  264. package/build/build-esm/src/qsm/components/icon.d.ts +5 -5
  265. package/build/build-esm/src/qsm/components/item-picker/index.d.ts +7 -7
  266. package/build/build-esm/src/qsm/components/search-input/index.d.ts +9 -9
  267. package/build/build-esm/src/qsm/components/search-input-group/index.d.ts +7 -7
  268. package/build/build-esm/src/qsm/index.d.ts +1 -1
  269. package/build/build-esm/src/qsm/store/qsm-slice.d.ts +110 -58
  270. package/build/build-esm/src/qsm/store/qsm-store.d.ts +20 -7
  271. package/build/build-esm/src/qsm/types.d.ts +59 -59
  272. package/build/build-esm/src/search-results/components/filters/filters.d.ts +5 -5
  273. package/build/build-esm/src/search-results/components/filters/flight-filters.d.ts +3 -3
  274. package/build/build-esm/src/search-results/components/flight/flight-banner.d.ts +2 -2
  275. package/build/build-esm/src/search-results/components/flight/flight-card.d.ts +1 -1
  276. package/build/build-esm/src/search-results/components/flight/flight-leg.d.ts +1 -1
  277. package/build/build-esm/src/search-results/components/flight/flight-path.d.ts +1 -1
  278. package/build/build-esm/src/search-results/components/flight/flight-results.d.ts +2 -2
  279. package/build/build-esm/src/search-results/components/flight/flight-search-context/index.d.ts +29 -29
  280. package/build/build-esm/src/search-results/components/flight/flight-selection/independent-flight-option.d.ts +5 -5
  281. package/build/build-esm/src/search-results/components/flight/flight-selection/independent-flight-selection.d.ts +1 -1
  282. package/build/build-esm/src/search-results/components/flight/flight-selection/index.d.ts +2 -2
  283. package/build/build-esm/src/search-results/components/flight/flight-selection/paired-flight-option.d.ts +1 -1
  284. package/build/build-esm/src/search-results/components/flight/flight-selection/paired-flight-selection.d.ts +1 -1
  285. package/build/build-esm/src/search-results/components/group-tour/group-tour-card.d.ts +3 -3
  286. package/build/build-esm/src/search-results/components/group-tour/group-tour-results.d.ts +1 -1
  287. package/build/build-esm/src/search-results/components/hotel/hotel-accommodation-results.d.ts +1 -1
  288. package/build/build-esm/src/search-results/components/hotel/hotel-card.d.ts +2 -2
  289. package/build/build-esm/src/search-results/components/icon.d.ts +6 -6
  290. package/build/build-esm/src/search-results/components/item-picker/index.d.ts +8 -8
  291. package/build/build-esm/src/search-results/components/itinerary/index.d.ts +3 -3
  292. package/build/build-esm/src/search-results/components/multi-range-filter.d.ts +6 -6
  293. package/build/build-esm/src/search-results/components/round-trip/round-trip-results.d.ts +1 -2
  294. package/build/build-esm/src/search-results/components/search-results-container/flight-search-results.d.ts +1 -1
  295. package/build/build-esm/src/search-results/components/tab-views/index.d.ts +1 -2
  296. package/build/build-esm/src/search-results/features/flights/flight-search-results-self-contained.d.ts +1 -2
  297. package/build/build-esm/src/search-results/features/hotels/hotel-flight-search-results-self-contained.d.ts +1 -2
  298. package/build/build-esm/src/search-results/features/hotels/hotel-search-results-self-contained.d.ts +1 -2
  299. package/build/build-esm/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.d.ts +1 -2
  300. package/build/build-esm/src/search-results/index.d.ts +1 -1
  301. package/build/build-esm/src/search-results/store/search-results-slice.d.ts +63 -26
  302. package/build/build-esm/src/search-results/store/search-results-store.d.ts +20 -7
  303. package/build/build-esm/src/search-results/types.d.ts +104 -104
  304. package/build/build-esm/src/search-results/utils/flight-utils.d.ts +6 -1
  305. package/build/build-esm/src/search-results/utils/search-results-utils.d.ts +10 -2
  306. package/build/build-esm/src/shared/components/flyin/accommodation-flyin.d.ts +3 -3
  307. package/build/build-esm/src/shared/components/flyin/flights-flyin.d.ts +2 -2
  308. package/build/build-esm/src/shared/components/flyin/flyin.d.ts +7 -7
  309. package/build/build-esm/src/shared/components/flyin/group-tour-flyin.d.ts +3 -3
  310. package/build/build-esm/src/shared/components/icon.d.ts +5 -5
  311. package/build/build-esm/src/shared/components/loader.d.ts +1 -1
  312. package/build/build-esm/src/shared/types.d.ts +9 -9
  313. package/build/build-esm/src/shared/utils/localization-util.d.ts +395 -396
  314. package/package.json +83 -83
  315. package/rollup.config.js +16 -16
  316. package/src/booking-product/components/date-range-picker/calendar-day.tsx +46 -46
  317. package/src/booking-product/components/date-range-picker/index.tsx +185 -185
  318. package/src/booking-product/components/dates.tsx +153 -153
  319. package/src/booking-product/components/product.tsx +379 -379
  320. package/src/booking-wizard/components/step-indicator.tsx +57 -57
  321. package/src/booking-wizard/components/step-route.tsx +26 -26
  322. package/src/booking-wizard/features/booking/api.ts +44 -44
  323. package/src/booking-wizard/features/booking/booking-self-contained.tsx +318 -318
  324. package/src/booking-wizard/features/booking/booking-slice.ts +633 -633
  325. package/src/booking-wizard/features/booking/booking.tsx +342 -342
  326. package/src/booking-wizard/features/booking/constants.ts +16 -16
  327. package/src/booking-wizard/features/booking/selectors.ts +411 -411
  328. package/src/booking-wizard/features/confirmation/confirmation.tsx +90 -90
  329. package/src/booking-wizard/features/error/error.tsx +71 -71
  330. package/src/booking-wizard/features/flight-options/index.tsx +166 -166
  331. package/src/booking-wizard/features/price-details/price-details-slice.ts +79 -79
  332. package/src/booking-wizard/features/price-details/selectors.ts +118 -118
  333. package/src/booking-wizard/features/product-options/option-units-card.tsx +148 -148
  334. package/src/booking-wizard/features/product-options/options-form.tsx +382 -382
  335. package/src/booking-wizard/features/room-options/index.tsx +132 -132
  336. package/src/booking-wizard/features/sidebar/index.tsx +83 -83
  337. package/src/booking-wizard/features/sidebar/sidebar-util.ts +147 -147
  338. package/src/booking-wizard/features/sidebar/sidebar.tsx +344 -332
  339. package/src/booking-wizard/features/summary/summary.tsx +562 -562
  340. package/src/booking-wizard/features/travelers-form/controls/gender-control.tsx +60 -60
  341. package/src/booking-wizard/features/travelers-form/travelers-form.tsx +1101 -1101
  342. package/src/booking-wizard/settings-context.ts +64 -64
  343. package/src/booking-wizard/types.ts +332 -332
  344. package/src/content/components/breadcrumb.tsx +67 -67
  345. package/src/content/components/faq.tsx +42 -42
  346. package/src/content/components/gallery.tsx +153 -153
  347. package/src/content/components/icon.tsx +695 -695
  348. package/src/content/components/image-with-text.tsx +120 -120
  349. package/src/content/components/login.tsx +162 -162
  350. package/src/content/components/slider.tsx +237 -237
  351. package/src/content/featured-trips/featured-trip-card.tsx +48 -48
  352. package/src/content/featured-trips/index.tsx +19 -19
  353. package/src/content/featured-trips/types.ts +13 -13
  354. package/src/content/features/content-page/content-page-self-contained.tsx +895 -895
  355. package/src/content/footer/index.tsx +159 -159
  356. package/src/content/footer/types.ts +36 -36
  357. package/src/content/image-card-grid/index.tsx +34 -34
  358. package/src/content/image-card-grid/types.ts +13 -13
  359. package/src/content/image-with-text-section/card.tsx +58 -58
  360. package/src/content/image-with-text-section/index.tsx +22 -22
  361. package/src/content/image-with-text-section/types.ts +20 -20
  362. package/src/content/login/confirm-component.tsx +149 -149
  363. package/src/content/login/index.tsx +70 -70
  364. package/src/content/login/login-component.tsx +159 -159
  365. package/src/content/login/login-services.ts +109 -109
  366. package/src/content/login/reset-password-component.tsx +191 -191
  367. package/src/content/login/types.ts +29 -29
  368. package/src/content/navbar/index.tsx +354 -354
  369. package/src/content/navbar/placeholderData.tsx +173 -173
  370. package/src/content/navbar/types.ts +43 -43
  371. package/src/index.ts +44 -44
  372. package/src/qsm/components/QSMContainer/qsm-container.tsx +512 -512
  373. package/src/qsm/components/double-search-input-group/index.tsx +78 -78
  374. package/src/qsm/components/icon.tsx +354 -354
  375. package/src/qsm/components/item-picker/index.tsx +69 -69
  376. package/src/qsm/components/mobile-filter-modal/index.tsx +307 -307
  377. package/src/qsm/components/search-input/index.tsx +91 -91
  378. package/src/qsm/components/search-input-group/index.tsx +199 -199
  379. package/src/qsm/components/travel-class-picker/index.tsx +28 -28
  380. package/src/qsm/components/travel-input/index.tsx +243 -243
  381. package/src/qsm/components/travel-input-group/index.tsx +114 -114
  382. package/src/qsm/components/travel-nationality-picker/index.tsx +28 -28
  383. package/src/qsm/components/travel-type-picker/index.tsx +28 -28
  384. package/src/qsm/qsm-configuration-context.ts +31 -31
  385. package/src/qsm/store/qsm-slice.ts +275 -275
  386. package/src/qsm/types.ts +110 -110
  387. package/src/search-results/components/filters/filters.tsx +230 -230
  388. package/src/search-results/components/filters/flight-filters.tsx +671 -671
  389. package/src/search-results/components/flight/flight-banner.tsx +35 -35
  390. package/src/search-results/components/flight/flight-results.tsx +208 -208
  391. package/src/search-results/components/flight/flight-search-context/index.tsx +628 -628
  392. package/src/search-results/components/flight/flight-selection/independent-flight-option.tsx +147 -147
  393. package/src/search-results/components/flight/flight-selection/independent-flight-selection.tsx +172 -172
  394. package/src/search-results/components/flight/flight-selection/index.tsx +19 -19
  395. package/src/search-results/components/flight/flight-selection/paired-flight-option.tsx +255 -255
  396. package/src/search-results/components/flight/flight-selection/paired-flight-selection.tsx +38 -38
  397. package/src/search-results/components/group-tour/group-tour-card.tsx +105 -105
  398. package/src/search-results/components/group-tour/group-tour-results.tsx +62 -62
  399. package/src/search-results/components/hotel/hotel-accommodation-results.tsx +176 -176
  400. package/src/search-results/components/hotel/hotel-card.tsx +113 -113
  401. package/src/search-results/components/icon.tsx +680 -680
  402. package/src/search-results/components/item-picker/index.tsx +81 -81
  403. package/src/search-results/components/itinerary/index.tsx +310 -310
  404. package/src/search-results/components/round-trip/round-trip-results.tsx +199 -199
  405. package/src/search-results/components/search-results-container/flight-search-results.tsx +137 -137
  406. package/src/search-results/components/search-results-container/search-results-container.tsx +893 -893
  407. package/src/search-results/components/spinner/spinner.tsx +16 -16
  408. package/src/search-results/components/tab-views/index.tsx +53 -53
  409. package/src/search-results/features/flights/flight-search-results-self-contained.tsx +294 -294
  410. package/src/search-results/features/hotels/hotel-flight-search-results-self-contained.tsx +143 -143
  411. package/src/search-results/features/hotels/hotel-search-results-self-contained.tsx +220 -220
  412. package/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.tsx +65 -65
  413. package/src/search-results/store/search-results-slice.ts +158 -158
  414. package/src/search-results/types.ts +181 -181
  415. package/src/search-results/utils/flight-utils.ts +93 -93
  416. package/src/search-results/utils/search-results-utils.ts +251 -251
  417. package/src/shared/components/flyin/accommodation-flyin.tsx +422 -422
  418. package/src/shared/components/flyin/flights-flyin.tsx +503 -503
  419. package/src/shared/components/flyin/flyin.tsx +82 -82
  420. package/src/shared/components/flyin/group-tour-flyin.tsx +293 -293
  421. package/src/shared/components/icon.tsx +826 -826
  422. package/src/shared/translations/ar-SA.json +382 -382
  423. package/src/shared/translations/da-DK.json +382 -382
  424. package/src/shared/translations/de-DE.json +382 -382
  425. package/src/shared/translations/en-GB.json +386 -386
  426. package/src/shared/translations/es-ES.json +382 -382
  427. package/src/shared/translations/fr-BE.json +386 -386
  428. package/src/shared/translations/fr-FR.json +382 -382
  429. package/src/shared/translations/is-IS.json +382 -382
  430. package/src/shared/translations/it-IT.json +382 -382
  431. package/src/shared/translations/ja-JP.json +382 -382
  432. package/src/shared/translations/nl-BE.json +386 -386
  433. package/src/shared/translations/nl-NL.json +382 -382
  434. package/src/shared/translations/no-NO.json +382 -382
  435. package/src/shared/translations/pl-PL.json +382 -382
  436. package/src/shared/translations/pt-PT.json +382 -382
  437. package/src/shared/translations/sv-SE.json +382 -382
  438. package/src/shared/types.ts +31 -31
  439. package/src/shared/utils/localization-util.ts +275 -275
  440. package/styles/booking-search-results-variables.scss +728 -728
  441. package/styles/booking-search-results.scss +53 -53
  442. package/styles/components/_booking.scss +872 -872
  443. package/styles/components/_content.scss +336 -336
  444. package/styles/components/_flyin.scss +727 -727
  445. package/styles/components/_footer.scss +141 -141
  446. package/styles/components/_form.scss +1634 -1634
  447. package/styles/components/_image-with-text.scss +206 -206
  448. package/styles/components/_login.scss +140 -140
  449. package/styles/components/_navbar.scss +765 -765
  450. package/styles/components/_pricing-summary.scss +163 -163
  451. package/styles/components/_search.scss +2009 -2009
  452. package/styles/components/_tree.scss +648 -648
  453. package/styles/content-blocks.scss +64 -64
@@ -1,512 +1,512 @@
1
- import React, { useContext, useEffect, useMemo } from 'react';
2
- import { useDispatch, useSelector } from 'react-redux';
3
- import { QSMRootState } from '../../store/qsm-store';
4
- import QSMConfigurationContext from '../../qsm-configuration-context';
5
- import useMediaQuery from '../../../shared/utils/use-media-query-util';
6
- import MobileFilterModal from '../mobile-filter-modal';
7
- import SearchInputGroup from '../search-input-group';
8
- import DoubleSearchInputGroup from '../double-search-input-group';
9
- import Dates from '../../../booking-product/components/dates';
10
- import TravelInputGroup from '../travel-input-group';
11
- import TravelClassPicker from '../travel-class-picker';
12
- import TravelTypePicker from '../travel-type-picker';
13
- import Icon from '../icon';
14
- import TravelNationalityPicker from '../travel-nationality-picker';
15
- import { addDays, addMonths, addYears, format } from 'date-fns';
16
- import { DateRange } from '../../../booking-product/types';
17
- import { QSMState, setFromDate, setSelectedQsmType, setToDate, setTripType } from '../../store/qsm-slice';
18
- import { BaseFieldConfig, DoubleFieldConfig } from '../../types';
19
- import { getTranslations } from '../../../shared/utils/localization-util';
20
- import { DateAmountType, PortalQsmType } from '@qite/tide-client';
21
- import { first } from 'lodash';
22
-
23
- const QSMContainer: React.FC = () => {
24
- const dispatch = useDispatch();
25
- const isMobile = useMediaQuery('(max-width: 768px)');
26
- const qsmState = useSelector((state: QSMRootState) => state.qsm);
27
- const { qsmType, mobileFilterType, fromDate, toDate, tripType } = qsmState;
28
- const {
29
- askTravelers,
30
- askRooms,
31
- askNationality,
32
- askTravelClass,
33
- askTravelType,
34
- submitIcon,
35
- onSubmit,
36
- travelTypes,
37
- languageCode,
38
- departureAirport,
39
- destinationAirport,
40
- returnAirport,
41
- destination,
42
- allowOneWay,
43
- allowRoundtrip,
44
- allowOpenJaw,
45
- searchConfigurations
46
- } = useContext(QSMConfigurationContext);
47
- const translations = getTranslations(languageCode ?? 'en-GB');
48
-
49
- useEffect(() => {
50
- const defaultQsmType = first(searchConfigurations)?.qsmType;
51
- console.log('Available search configurations:', searchConfigurations);
52
- if (!defaultQsmType) return;
53
- console.log('set default qsmType:', defaultQsmType);
54
- handleQsmTypeChange(defaultQsmType);
55
- }, [searchConfigurations]);
56
-
57
- useEffect(() => {
58
- if (fromDate || toDate) return;
59
-
60
- let startDate = addMonths(new Date(), 1);
61
- let endDate = addDays(startDate, 7);
62
-
63
- if (qsmType === PortalQsmType.GroupTour) {
64
- startDate = new Date();
65
- endDate = addYears(startDate, 1);
66
- }
67
-
68
- dispatch(setFromDate(startDate.toISOString()));
69
- dispatch(setToDate(endDate.toISOString()));
70
- }, [fromDate, toDate, dispatch]);
71
-
72
- const dateRange = useMemo<DateRange | undefined>(() => {
73
- if (!fromDate || !toDate) return undefined;
74
-
75
- return {
76
- fromDate: new Date(fromDate),
77
- toDate: new Date(toDate)
78
- };
79
- }, [fromDate, toDate]);
80
-
81
- const handleDateChange = (value: DateRange) => {
82
- dispatch(setFromDate(value.fromDate ? format(value.fromDate, 'yyyy-MM-dd') : undefined));
83
- dispatch(setToDate(value.toDate ? format(value.toDate, 'yyyy-MM-dd') : undefined));
84
- };
85
-
86
- const handleTripTypeChange = (value: 'oneway' | 'roundtrip' | 'openjaw') => {
87
- dispatch(setTripType(value));
88
- };
89
-
90
- const handleQsmTypeChange = (value: PortalQsmType) => {
91
- dispatch(setSelectedQsmType(value));
92
-
93
- const now = new Date();
94
-
95
- // Default fallback
96
- let startDate = addMonths(now, 1);
97
- let endDate = addDays(startDate, 7);
98
- if (value === PortalQsmType.GroupTour) {
99
- startDate = now;
100
- endDate = addYears(startDate, 1);
101
- }
102
-
103
- const searchConfig = searchConfigurations.find((config) => config.qsmType === value);
104
-
105
- if (searchConfig) {
106
- const applyAmount = (baseDate: Date, type: DateAmountType, amount?: number) => {
107
- if (!amount || type == null) return baseDate;
108
-
109
- switch (type) {
110
- case DateAmountType.days:
111
- return addDays(baseDate, amount);
112
- case DateAmountType.months:
113
- return addMonths(baseDate, amount);
114
- default:
115
- return baseDate;
116
- }
117
- };
118
-
119
- if (searchConfig.fromDateAmount) {
120
- startDate = applyAmount(now, searchConfig.fromDateAmountType, searchConfig.fromDateAmount);
121
- }
122
-
123
- if (searchConfig.toDateAmount) {
124
- endDate = applyAmount(startDate, searchConfig.toDateAmountType, searchConfig.toDateAmount);
125
- }
126
- }
127
-
128
- handleDateChange({
129
- fromDate: startDate,
130
- toDate: endDate
131
- });
132
- };
133
-
134
- const handleSubmit = () => {
135
- if (!onSubmit) return;
136
-
137
- const { qsmType, fromDate, toDate, selectedTravelClass, selectedTravelType, selectedNationality, rooms, tripType, adults, kids, babies } = qsmState;
138
-
139
- const selectedTravelTypeValue = travelTypes?.find((t) => t.label === selectedTravelType);
140
- const payload = {
141
- qsmType,
142
- fromDate,
143
- toDate,
144
- travelClass: selectedTravelClass,
145
- travelType: selectedTravelTypeValue,
146
- nationality: selectedNationality,
147
- tripType
148
- } as any;
149
-
150
- if (askRooms && qsmType !== PortalQsmType.Flight) {
151
- payload.rooms = rooms;
152
- } else {
153
- payload.travelers = { adults, kids, babies };
154
- }
155
-
156
- // Filter out undefined fields before passing to addSearchFieldsToPayload
157
- const searchFields = [departureAirport, destinationAirport, returnAirport, destination].filter((field): field is BaseFieldConfig => field !== undefined);
158
- addSearchFieldsToPayload(payload, searchFields, qsmState);
159
-
160
- if (destination) {
161
- const option = destination.options.find((opt) => opt.value === qsmState[destination.fieldKey]);
162
- if (option) {
163
- payload.destinationType = option?.type;
164
- }
165
- }
166
-
167
- onSubmit(payload);
168
- console.log('Submitted QSM data:', payload);
169
- };
170
-
171
- const addSearchFieldsToPayload = (payload: any, fields: BaseFieldConfig[], state: QSMState) => {
172
- fields.forEach((field) => {
173
- const fieldKey = field.fieldKey;
174
- const option = field.options.find((opt) => opt.value === state[fieldKey]);
175
- payload[fieldKey] = option?.key ?? state[fieldKey];
176
- });
177
- };
178
-
179
- const originDestinationField = useMemo<DoubleFieldConfig | undefined>(() => {
180
- if (!fromDate || !toDate || !departureAirport || !destinationAirport) return undefined;
181
-
182
- const departureField: BaseFieldConfig = {
183
- ...departureAirport,
184
- label: translations.QSM.DEPARTURE,
185
- placeholder: translations.QSM.CHOOSE_DEPARTURE
186
- };
187
-
188
- const destinationField: BaseFieldConfig = {
189
- ...destinationAirport,
190
- label: translations.QSM.DESTINATION,
191
- placeholder: translations.QSM.CHOOSE_DESTINATION
192
- };
193
-
194
- return {
195
- type: 'double',
196
- fieldKey: 'locationGroup',
197
- showReverse: true,
198
- fields: [departureField, destinationField]
199
- };
200
- }, [fromDate, toDate, departureAirport, destinationAirport, translations]);
201
-
202
- const openJawReturnDestinationField = useMemo<DoubleFieldConfig | undefined>(() => {
203
- if (!fromDate || !toDate || !allowOpenJaw || !departureAirport || !returnAirport) return undefined;
204
-
205
- const mirroredDepartureField: BaseFieldConfig = {
206
- ...departureAirport,
207
- label: translations.QSM.DESTINATION,
208
- placeholder: translations.QSM.CHOOSE_DESTINATION
209
- };
210
-
211
- return {
212
- type: 'double',
213
- fieldKey: 'openjawLocationGroup',
214
- showReverse: false,
215
- disableReturnField: true,
216
- fields: [returnAirport, mirroredDepartureField]
217
- };
218
- }, [fromDate, toDate, departureAirport, returnAirport, allowOpenJaw]);
219
-
220
- const qsmTypeMeta: Record<PortalQsmType, { icon: string | string[]; label: string }> = {
221
- [PortalQsmType.Multidestination]: {
222
- icon: 'ui-location',
223
- label: translations.QSM.MULTIDESTINATION
224
- },
225
- [PortalQsmType.Package]: {
226
- icon: 'ui-suitcase',
227
- label: translations.QSM.PACKAGES
228
- },
229
- [PortalQsmType.AccommodationAndFlight]: {
230
- icon: ['ui-backforward', 'ui-bed'],
231
- label: translations.QSM.TRANSPORT_HOTEL
232
- },
233
- [PortalQsmType.Accommodation]: {
234
- icon: 'ui-bed',
235
- label: translations.QSM.ACCOMMODATION
236
- },
237
- [PortalQsmType.Flight]: {
238
- icon: 'ui-flight',
239
- label: translations.QSM.TRANSPORTS
240
- },
241
- [PortalQsmType.GroupTour]: {
242
- icon: 'ui-group',
243
- label: translations.QSM.GROUP_TOUR
244
- },
245
- [PortalQsmType.RoundTrip]: {
246
- icon: 'ui-group',
247
- label: translations.QSM.ROUNDTRIP
248
- },
249
- [PortalQsmType.Ticket]: {
250
- icon: 'ui-ticket',
251
- label: translations.QSM.TICKET_ONLY
252
- },
253
- [PortalQsmType.Car]: {
254
- icon: 'ui-car',
255
- label: translations.QSM.RENT_A_CAR
256
- },
257
- [PortalQsmType.Transfer]: {
258
- icon: 'ui-backforward',
259
- label: translations.QSM.TRANSFERS
260
- },
261
- [PortalQsmType.Cruise]: {
262
- icon: 'ui-ship',
263
- label: translations.QSM.CRUISES
264
- }
265
- };
266
-
267
- return (
268
- <div className="qsm">
269
- <div className="qsm__content">
270
- <div className="qsm__tabs">
271
- {searchConfigurations.map((searchConfig, index) => {
272
- const meta = qsmTypeMeta[searchConfig.qsmType];
273
-
274
- if (!meta) return null; // safety guard
275
-
276
- return (
277
- <button
278
- key={`qsm-type-${index}`}
279
- type="button"
280
- className={`qsm__tab ${qsmType === searchConfig.qsmType ? 'qsm__tab--active' : ''}`}
281
- onClick={() => handleQsmTypeChange(searchConfig.qsmType)}>
282
- <span className="qsm__tab__icons">
283
- {Array.isArray(meta.icon) ? meta.icon.map((icon, i) => <Icon key={i} name={icon} height={14} />) : <Icon name={meta.icon} height={16} />}
284
- </span>
285
-
286
- {meta.label}
287
- </button>
288
- );
289
- })}
290
- {/*
291
- <button
292
- type="button"
293
- className={`qsm__tab ${qsmType == PortalQsmType.Multidestination ? 'qsm__tab--active' : ''}`}
294
- onClick={() => handleQsmTypeChange(PortalQsmType.Multidestination)}>
295
- <span className="qsm__tab__icons">
296
- <Icon name="ui-location" height={16} />
297
- </span>
298
- {translations.QSM.MULTIDESTINATION}
299
- </button>
300
- <button
301
- type="button"
302
- className={`qsm__tab ${qsmType == PortalQsmType.Package ? 'qsm__tab--active' : ''}`}
303
- onClick={() => handleQsmTypeChange(PortalQsmType.Package)}>
304
- <span className="qsm__tab__icons">
305
- <Icon name="ui-suitcase" height={16} />
306
- </span>
307
- {translations.QSM.PACKAGES}
308
- </button>
309
- <button
310
- type="button"
311
- className={`qsm__tab ${qsmType == PortalQsmType.AccommodationAndFlight ? 'qsm__tab--active' : ''}`}
312
- onClick={() => handleQsmTypeChange(PortalQsmType.AccommodationAndFlight)}>
313
- <span className="qsm__tab__icons">
314
- <Icon name="ui-backforward" height={14} />
315
- +
316
- <Icon name="ui-bed" height={14} />
317
- </span>
318
- {translations.QSM.TRANSPORT_HOTEL}
319
- </button>
320
- <button
321
- type="button"
322
- className={`qsm__tab ${qsmType == PortalQsmType.Accommodation ? 'qsm__tab--active' : ''}`}
323
- onClick={() => handleQsmTypeChange(PortalQsmType.Accommodation)}>
324
- <span className="qsm__tab__icons">
325
- <Icon name="ui-bed" height={16} />
326
- </span>
327
- {translations.QSM.ACCOMMODATION}
328
- </button>
329
- <button
330
- type="button"
331
- className={`qsm__tab ${qsmType == PortalQsmType.Flight ? 'qsm__tab--active' : ''}`}
332
- onClick={() => handleQsmTypeChange(PortalQsmType.Flight)}>
333
- <span className="qsm__tab__icons">
334
- <Icon name="ui-flight" height={16} />
335
- </span>
336
- {translations.QSM.TRANSPORTS}
337
- </button>
338
- <button
339
- type="button"
340
- className={`qsm__tab ${qsmType == PortalQsmType.GroupTour ? 'qsm__tab--active' : ''}`}
341
- onClick={() => handleQsmTypeChange(PortalQsmType.GroupTour)}>
342
- <span className="qsm__tab__icons">
343
- <Icon name="ui-group" height={16} />
344
- </span>
345
- {translations.QSM.GROUP_TOUR}
346
- </button>
347
- <button
348
- type="button"
349
- className={`qsm__tab ${qsmType == PortalQsmType.Ticket ? 'qsm__tab--active' : ''}`}
350
- onClick={() => handleQsmTypeChange(PortalQsmType.Ticket)}>
351
- <span className="qsm__tab__icons">
352
- <Icon name="ui-ticket" height={16} />
353
- </span>
354
- {translations.QSM.TICKET_ONLY}
355
- </button>
356
- <button
357
- type="button"
358
- className={`qsm__tab ${qsmType == PortalQsmType.Car ? 'qsm__tab--active' : ''}`}
359
- onClick={() => handleQsmTypeChange(PortalQsmType.Car)}>
360
- <span className="qsm__tab__icons">
361
- <Icon name="ui-car" height={16} />
362
- </span>
363
- {translations.QSM.RENT_A_CAR}
364
- </button>
365
- <button
366
- type="button"
367
- className={`qsm__tab ${qsmType == PortalQsmType.Transfer ? 'qsm__tab--active' : ''}`}
368
- onClick={() => handleQsmTypeChange(PortalQsmType.Transfer)}>
369
- <span className="qsm__tab__icons">
370
- <Icon name="ui-backforward" height={16} />
371
- </span>
372
- {translations.QSM.TRANSFERS}
373
- </button>
374
- <button
375
- type="button"
376
- className={`qsm__tab ${qsmType == PortalQsmType.Cruise ? 'qsm__tab--active' : ''}`}
377
- onClick={() => handleQsmTypeChange(PortalQsmType.Cruise)}>
378
- <span className="qsm__tab__icons">
379
- <Icon name="ui-ship" height={16} />
380
- </span>
381
- {translations.QSM.CRUISES}
382
- </button> */}
383
- </div>
384
- <div className="qsm__filter">
385
- {(qsmType === PortalQsmType.Accommodation || qsmType === PortalQsmType.AccommodationAndFlight || qsmType === PortalQsmType.GroupTour) && (
386
- <div className="radiobutton-group qsm__filter__inputgroup">
387
- <div className="radiobutton">
388
- <label className="radiobutton__label">
389
- <input
390
- type="radio"
391
- name="numberOfAccommodations"
392
- // onChange={handleMainBookerChange}
393
- // onBlur={formik.handleBlur}
394
- value=""
395
- checked={true}
396
- readOnly
397
- className="radiobutton__input"
398
- />
399
- <span>{translations.QSM.ONE_ACCOMMODATION}</span>
400
- </label>
401
- </div>
402
- <div className="radiobutton">
403
- <label className="radiobutton__label">
404
- <input
405
- type="radio"
406
- name="numberOfAccommodations"
407
- // onChange={handleMainBookerChange}
408
- // onBlur={formik.handleBlur}
409
- value=""
410
- className="radiobutton__input"
411
- disabled={true}
412
- />
413
- <span>{translations.QSM.MULTIPLE_ACCOMMODATIONS}</span>
414
- </label>
415
- </div>
416
- </div>
417
- )}
418
- {qsmType === PortalQsmType.Flight && (
419
- <div className="radiobutton-group qsm__filter__inputgroup">
420
- {allowOneWay && (
421
- <div className="radiobutton">
422
- <label className="radiobutton__label">
423
- <input
424
- type="radio"
425
- name="tripType"
426
- value="oneway"
427
- checked={tripType === 'oneway'}
428
- onChange={() => handleTripTypeChange('oneway')}
429
- className="radiobutton__input"
430
- />
431
- <span>{translations.QSM.ONEWAY}</span>
432
- </label>
433
- </div>
434
- )}
435
-
436
- {allowRoundtrip && (
437
- <div className="radiobutton">
438
- <label className="radiobutton__label">
439
- <input
440
- type="radio"
441
- name="tripType"
442
- value="roundtrip"
443
- checked={tripType === 'roundtrip'}
444
- onChange={() => handleTripTypeChange('roundtrip')}
445
- className="radiobutton__input"
446
- />
447
- <span>{translations.QSM.ROUNDTRIP}</span>
448
- </label>
449
- </div>
450
- )}
451
-
452
- {allowOpenJaw && (
453
- <div className="radiobutton">
454
- <label className="radiobutton__label">
455
- <input
456
- type="radio"
457
- name="tripType"
458
- value="openjaw"
459
- checked={tripType === 'openjaw'}
460
- onChange={() => handleTripTypeChange('openjaw')}
461
- className="radiobutton__input"
462
- />
463
- <span>{translations.QSM.OPENJAW}</span>
464
- </label>
465
- </div>
466
- )}
467
- </div>
468
- )}
469
- <div className="qsm__filter__classgroup">
470
- {qsmType !== PortalQsmType.Accommodation &&
471
- qsmType !== PortalQsmType.Car &&
472
- qsmType !== PortalQsmType.Ticket &&
473
- qsmType !== PortalQsmType.Cruise &&
474
- qsmType !== PortalQsmType.Transfer &&
475
- qsmType !== PortalQsmType.GroupTour &&
476
- askTravelClass && <TravelClassPicker />}
477
- {qsmType !== PortalQsmType.Multidestination &&
478
- qsmType !== PortalQsmType.Car &&
479
- qsmType !== PortalQsmType.Flight &&
480
- qsmType !== PortalQsmType.Transfer &&
481
- askTravelType && <TravelTypePicker />}
482
- {askNationality && <TravelNationalityPicker />}
483
- </div>
484
- </div>
485
- <div className="qsm__input-group">
486
- {/* TODO, determine which fields to show for what type of QSM */}
487
- {(qsmType == PortalQsmType.Flight || qsmType == PortalQsmType.AccommodationAndFlight) && originDestinationField && (
488
- <DoubleSearchInputGroup fieldConfig={originDestinationField} showReverse={originDestinationField.showReverse} />
489
- )}
490
- {qsmType == PortalQsmType.Flight && tripType == 'openjaw' && openJawReturnDestinationField && (
491
- <DoubleSearchInputGroup fieldConfig={openJawReturnDestinationField} showReverse={openJawReturnDestinationField.showReverse} />
492
- )}
493
- {(qsmType == PortalQsmType.Accommodation || qsmType == PortalQsmType.AccommodationAndFlight || qsmType == PortalQsmType.GroupTour) && destination && (
494
- <SearchInputGroup fieldConfig={destination} />
495
- )}
496
-
497
- <Dates value={dateRange} onChange={handleDateChange} />
498
-
499
- {askTravelers && <TravelInputGroup />}
500
-
501
- <button type="button" className="cta" onClick={handleSubmit}>
502
- {submitIcon && submitIcon.toString().length > 0 && <span>{submitIcon}</span>}
503
- <span>{translations.QSM.CONFIRM}</span>
504
- </button>
505
- </div>
506
- </div>
507
- {isMobile && mobileFilterType && <MobileFilterModal />}
508
- </div>
509
- );
510
- };
511
-
512
- export default QSMContainer;
1
+ import React, { useContext, useEffect, useMemo } from 'react';
2
+ import { useDispatch, useSelector } from 'react-redux';
3
+ import { QSMRootState } from '../../store/qsm-store';
4
+ import QSMConfigurationContext from '../../qsm-configuration-context';
5
+ import useMediaQuery from '../../../shared/utils/use-media-query-util';
6
+ import MobileFilterModal from '../mobile-filter-modal';
7
+ import SearchInputGroup from '../search-input-group';
8
+ import DoubleSearchInputGroup from '../double-search-input-group';
9
+ import Dates from '../../../booking-product/components/dates';
10
+ import TravelInputGroup from '../travel-input-group';
11
+ import TravelClassPicker from '../travel-class-picker';
12
+ import TravelTypePicker from '../travel-type-picker';
13
+ import Icon from '../icon';
14
+ import TravelNationalityPicker from '../travel-nationality-picker';
15
+ import { addDays, addMonths, addYears, format } from 'date-fns';
16
+ import { DateRange } from '../../../booking-product/types';
17
+ import { QSMState, setFromDate, setSelectedQsmType, setToDate, setTripType } from '../../store/qsm-slice';
18
+ import { BaseFieldConfig, DoubleFieldConfig } from '../../types';
19
+ import { getTranslations } from '../../../shared/utils/localization-util';
20
+ import { DateAmountType, PortalQsmType } from '@qite/tide-client';
21
+ import { first } from 'lodash';
22
+
23
+ const QSMContainer: React.FC = () => {
24
+ const dispatch = useDispatch();
25
+ const isMobile = useMediaQuery('(max-width: 768px)');
26
+ const qsmState = useSelector((state: QSMRootState) => state.qsm);
27
+ const { qsmType, mobileFilterType, fromDate, toDate, tripType } = qsmState;
28
+ const {
29
+ askTravelers,
30
+ askRooms,
31
+ askNationality,
32
+ askTravelClass,
33
+ askTravelType,
34
+ submitIcon,
35
+ onSubmit,
36
+ travelTypes,
37
+ languageCode,
38
+ departureAirport,
39
+ destinationAirport,
40
+ returnAirport,
41
+ destination,
42
+ allowOneWay,
43
+ allowRoundtrip,
44
+ allowOpenJaw,
45
+ searchConfigurations
46
+ } = useContext(QSMConfigurationContext);
47
+ const translations = getTranslations(languageCode ?? 'en-GB');
48
+
49
+ useEffect(() => {
50
+ const defaultQsmType = first(searchConfigurations)?.qsmType;
51
+ console.log('Available search configurations:', searchConfigurations);
52
+ if (!defaultQsmType) return;
53
+ console.log('set default qsmType:', defaultQsmType);
54
+ handleQsmTypeChange(defaultQsmType);
55
+ }, [searchConfigurations]);
56
+
57
+ useEffect(() => {
58
+ if (fromDate || toDate) return;
59
+
60
+ let startDate = addMonths(new Date(), 1);
61
+ let endDate = addDays(startDate, 7);
62
+
63
+ if (qsmType === PortalQsmType.GroupTour) {
64
+ startDate = new Date();
65
+ endDate = addYears(startDate, 1);
66
+ }
67
+
68
+ dispatch(setFromDate(startDate.toISOString()));
69
+ dispatch(setToDate(endDate.toISOString()));
70
+ }, [fromDate, toDate, dispatch]);
71
+
72
+ const dateRange = useMemo<DateRange | undefined>(() => {
73
+ if (!fromDate || !toDate) return undefined;
74
+
75
+ return {
76
+ fromDate: new Date(fromDate),
77
+ toDate: new Date(toDate)
78
+ };
79
+ }, [fromDate, toDate]);
80
+
81
+ const handleDateChange = (value: DateRange) => {
82
+ dispatch(setFromDate(value.fromDate ? format(value.fromDate, 'yyyy-MM-dd') : undefined));
83
+ dispatch(setToDate(value.toDate ? format(value.toDate, 'yyyy-MM-dd') : undefined));
84
+ };
85
+
86
+ const handleTripTypeChange = (value: 'oneway' | 'roundtrip' | 'openjaw') => {
87
+ dispatch(setTripType(value));
88
+ };
89
+
90
+ const handleQsmTypeChange = (value: PortalQsmType) => {
91
+ dispatch(setSelectedQsmType(value));
92
+
93
+ const now = new Date();
94
+
95
+ // Default fallback
96
+ let startDate = addMonths(now, 1);
97
+ let endDate = addDays(startDate, 7);
98
+ if (value === PortalQsmType.GroupTour) {
99
+ startDate = now;
100
+ endDate = addYears(startDate, 1);
101
+ }
102
+
103
+ const searchConfig = searchConfigurations.find((config) => config.qsmType === value);
104
+
105
+ if (searchConfig) {
106
+ const applyAmount = (baseDate: Date, type: DateAmountType, amount?: number) => {
107
+ if (!amount || type == null) return baseDate;
108
+
109
+ switch (type) {
110
+ case DateAmountType.days:
111
+ return addDays(baseDate, amount);
112
+ case DateAmountType.months:
113
+ return addMonths(baseDate, amount);
114
+ default:
115
+ return baseDate;
116
+ }
117
+ };
118
+
119
+ if (searchConfig.fromDateAmount) {
120
+ startDate = applyAmount(now, searchConfig.fromDateAmountType, searchConfig.fromDateAmount);
121
+ }
122
+
123
+ if (searchConfig.toDateAmount) {
124
+ endDate = applyAmount(startDate, searchConfig.toDateAmountType, searchConfig.toDateAmount);
125
+ }
126
+ }
127
+
128
+ handleDateChange({
129
+ fromDate: startDate,
130
+ toDate: endDate
131
+ });
132
+ };
133
+
134
+ const handleSubmit = () => {
135
+ if (!onSubmit) return;
136
+
137
+ const { qsmType, fromDate, toDate, selectedTravelClass, selectedTravelType, selectedNationality, rooms, tripType, adults, kids, babies } = qsmState;
138
+
139
+ const selectedTravelTypeValue = travelTypes?.find((t) => t.label === selectedTravelType);
140
+ const payload = {
141
+ qsmType,
142
+ fromDate,
143
+ toDate,
144
+ travelClass: selectedTravelClass,
145
+ travelType: selectedTravelTypeValue,
146
+ nationality: selectedNationality,
147
+ tripType
148
+ } as any;
149
+
150
+ if (askRooms && qsmType !== PortalQsmType.Flight) {
151
+ payload.rooms = rooms;
152
+ } else {
153
+ payload.travelers = { adults, kids, babies };
154
+ }
155
+
156
+ // Filter out undefined fields before passing to addSearchFieldsToPayload
157
+ const searchFields = [departureAirport, destinationAirport, returnAirport, destination].filter((field): field is BaseFieldConfig => field !== undefined);
158
+ addSearchFieldsToPayload(payload, searchFields, qsmState);
159
+
160
+ if (destination) {
161
+ const option = destination.options.find((opt) => opt.value === qsmState[destination.fieldKey]);
162
+ if (option) {
163
+ payload.destinationType = option?.type;
164
+ }
165
+ }
166
+
167
+ onSubmit(payload);
168
+ console.log('Submitted QSM data:', payload);
169
+ };
170
+
171
+ const addSearchFieldsToPayload = (payload: any, fields: BaseFieldConfig[], state: QSMState) => {
172
+ fields.forEach((field) => {
173
+ const fieldKey = field.fieldKey;
174
+ const option = field.options.find((opt) => opt.value === state[fieldKey]);
175
+ payload[fieldKey] = option?.key ?? state[fieldKey];
176
+ });
177
+ };
178
+
179
+ const originDestinationField = useMemo<DoubleFieldConfig | undefined>(() => {
180
+ if (!fromDate || !toDate || !departureAirport || !destinationAirport) return undefined;
181
+
182
+ const departureField: BaseFieldConfig = {
183
+ ...departureAirport,
184
+ label: translations.QSM.DEPARTURE,
185
+ placeholder: translations.QSM.CHOOSE_DEPARTURE
186
+ };
187
+
188
+ const destinationField: BaseFieldConfig = {
189
+ ...destinationAirport,
190
+ label: translations.QSM.DESTINATION,
191
+ placeholder: translations.QSM.CHOOSE_DESTINATION
192
+ };
193
+
194
+ return {
195
+ type: 'double',
196
+ fieldKey: 'locationGroup',
197
+ showReverse: true,
198
+ fields: [departureField, destinationField]
199
+ };
200
+ }, [fromDate, toDate, departureAirport, destinationAirport, translations]);
201
+
202
+ const openJawReturnDestinationField = useMemo<DoubleFieldConfig | undefined>(() => {
203
+ if (!fromDate || !toDate || !allowOpenJaw || !departureAirport || !returnAirport) return undefined;
204
+
205
+ const mirroredDepartureField: BaseFieldConfig = {
206
+ ...departureAirport,
207
+ label: translations.QSM.DESTINATION,
208
+ placeholder: translations.QSM.CHOOSE_DESTINATION
209
+ };
210
+
211
+ return {
212
+ type: 'double',
213
+ fieldKey: 'openjawLocationGroup',
214
+ showReverse: false,
215
+ disableReturnField: true,
216
+ fields: [returnAirport, mirroredDepartureField]
217
+ };
218
+ }, [fromDate, toDate, departureAirport, returnAirport, allowOpenJaw]);
219
+
220
+ const qsmTypeMeta: Record<PortalQsmType, { icon: string | string[]; label: string }> = {
221
+ [PortalQsmType.Multidestination]: {
222
+ icon: 'ui-location',
223
+ label: translations.QSM.MULTIDESTINATION
224
+ },
225
+ [PortalQsmType.Package]: {
226
+ icon: 'ui-suitcase',
227
+ label: translations.QSM.PACKAGES
228
+ },
229
+ [PortalQsmType.AccommodationAndFlight]: {
230
+ icon: ['ui-backforward', 'ui-bed'],
231
+ label: translations.QSM.TRANSPORT_HOTEL
232
+ },
233
+ [PortalQsmType.Accommodation]: {
234
+ icon: 'ui-bed',
235
+ label: translations.QSM.ACCOMMODATION
236
+ },
237
+ [PortalQsmType.Flight]: {
238
+ icon: 'ui-flight',
239
+ label: translations.QSM.TRANSPORTS
240
+ },
241
+ [PortalQsmType.GroupTour]: {
242
+ icon: 'ui-group',
243
+ label: translations.QSM.GROUP_TOUR
244
+ },
245
+ [PortalQsmType.RoundTrip]: {
246
+ icon: 'ui-group',
247
+ label: translations.QSM.ROUNDTRIP
248
+ },
249
+ [PortalQsmType.Ticket]: {
250
+ icon: 'ui-ticket',
251
+ label: translations.QSM.TICKET_ONLY
252
+ },
253
+ [PortalQsmType.Car]: {
254
+ icon: 'ui-car',
255
+ label: translations.QSM.RENT_A_CAR
256
+ },
257
+ [PortalQsmType.Transfer]: {
258
+ icon: 'ui-backforward',
259
+ label: translations.QSM.TRANSFERS
260
+ },
261
+ [PortalQsmType.Cruise]: {
262
+ icon: 'ui-ship',
263
+ label: translations.QSM.CRUISES
264
+ }
265
+ };
266
+
267
+ return (
268
+ <div className="qsm">
269
+ <div className="qsm__content">
270
+ <div className="qsm__tabs">
271
+ {searchConfigurations.map((searchConfig, index) => {
272
+ const meta = qsmTypeMeta[searchConfig.qsmType];
273
+
274
+ if (!meta) return null; // safety guard
275
+
276
+ return (
277
+ <button
278
+ key={`qsm-type-${index}`}
279
+ type="button"
280
+ className={`qsm__tab ${qsmType === searchConfig.qsmType ? 'qsm__tab--active' : ''}`}
281
+ onClick={() => handleQsmTypeChange(searchConfig.qsmType)}>
282
+ <span className="qsm__tab__icons">
283
+ {Array.isArray(meta.icon) ? meta.icon.map((icon, i) => <Icon key={i} name={icon} height={14} />) : <Icon name={meta.icon} height={16} />}
284
+ </span>
285
+
286
+ {meta.label}
287
+ </button>
288
+ );
289
+ })}
290
+ {/*
291
+ <button
292
+ type="button"
293
+ className={`qsm__tab ${qsmType == PortalQsmType.Multidestination ? 'qsm__tab--active' : ''}`}
294
+ onClick={() => handleQsmTypeChange(PortalQsmType.Multidestination)}>
295
+ <span className="qsm__tab__icons">
296
+ <Icon name="ui-location" height={16} />
297
+ </span>
298
+ {translations.QSM.MULTIDESTINATION}
299
+ </button>
300
+ <button
301
+ type="button"
302
+ className={`qsm__tab ${qsmType == PortalQsmType.Package ? 'qsm__tab--active' : ''}`}
303
+ onClick={() => handleQsmTypeChange(PortalQsmType.Package)}>
304
+ <span className="qsm__tab__icons">
305
+ <Icon name="ui-suitcase" height={16} />
306
+ </span>
307
+ {translations.QSM.PACKAGES}
308
+ </button>
309
+ <button
310
+ type="button"
311
+ className={`qsm__tab ${qsmType == PortalQsmType.AccommodationAndFlight ? 'qsm__tab--active' : ''}`}
312
+ onClick={() => handleQsmTypeChange(PortalQsmType.AccommodationAndFlight)}>
313
+ <span className="qsm__tab__icons">
314
+ <Icon name="ui-backforward" height={14} />
315
+ +
316
+ <Icon name="ui-bed" height={14} />
317
+ </span>
318
+ {translations.QSM.TRANSPORT_HOTEL}
319
+ </button>
320
+ <button
321
+ type="button"
322
+ className={`qsm__tab ${qsmType == PortalQsmType.Accommodation ? 'qsm__tab--active' : ''}`}
323
+ onClick={() => handleQsmTypeChange(PortalQsmType.Accommodation)}>
324
+ <span className="qsm__tab__icons">
325
+ <Icon name="ui-bed" height={16} />
326
+ </span>
327
+ {translations.QSM.ACCOMMODATION}
328
+ </button>
329
+ <button
330
+ type="button"
331
+ className={`qsm__tab ${qsmType == PortalQsmType.Flight ? 'qsm__tab--active' : ''}`}
332
+ onClick={() => handleQsmTypeChange(PortalQsmType.Flight)}>
333
+ <span className="qsm__tab__icons">
334
+ <Icon name="ui-flight" height={16} />
335
+ </span>
336
+ {translations.QSM.TRANSPORTS}
337
+ </button>
338
+ <button
339
+ type="button"
340
+ className={`qsm__tab ${qsmType == PortalQsmType.GroupTour ? 'qsm__tab--active' : ''}`}
341
+ onClick={() => handleQsmTypeChange(PortalQsmType.GroupTour)}>
342
+ <span className="qsm__tab__icons">
343
+ <Icon name="ui-group" height={16} />
344
+ </span>
345
+ {translations.QSM.GROUP_TOUR}
346
+ </button>
347
+ <button
348
+ type="button"
349
+ className={`qsm__tab ${qsmType == PortalQsmType.Ticket ? 'qsm__tab--active' : ''}`}
350
+ onClick={() => handleQsmTypeChange(PortalQsmType.Ticket)}>
351
+ <span className="qsm__tab__icons">
352
+ <Icon name="ui-ticket" height={16} />
353
+ </span>
354
+ {translations.QSM.TICKET_ONLY}
355
+ </button>
356
+ <button
357
+ type="button"
358
+ className={`qsm__tab ${qsmType == PortalQsmType.Car ? 'qsm__tab--active' : ''}`}
359
+ onClick={() => handleQsmTypeChange(PortalQsmType.Car)}>
360
+ <span className="qsm__tab__icons">
361
+ <Icon name="ui-car" height={16} />
362
+ </span>
363
+ {translations.QSM.RENT_A_CAR}
364
+ </button>
365
+ <button
366
+ type="button"
367
+ className={`qsm__tab ${qsmType == PortalQsmType.Transfer ? 'qsm__tab--active' : ''}`}
368
+ onClick={() => handleQsmTypeChange(PortalQsmType.Transfer)}>
369
+ <span className="qsm__tab__icons">
370
+ <Icon name="ui-backforward" height={16} />
371
+ </span>
372
+ {translations.QSM.TRANSFERS}
373
+ </button>
374
+ <button
375
+ type="button"
376
+ className={`qsm__tab ${qsmType == PortalQsmType.Cruise ? 'qsm__tab--active' : ''}`}
377
+ onClick={() => handleQsmTypeChange(PortalQsmType.Cruise)}>
378
+ <span className="qsm__tab__icons">
379
+ <Icon name="ui-ship" height={16} />
380
+ </span>
381
+ {translations.QSM.CRUISES}
382
+ </button> */}
383
+ </div>
384
+ <div className="qsm__filter">
385
+ {(qsmType === PortalQsmType.Accommodation || qsmType === PortalQsmType.AccommodationAndFlight || qsmType === PortalQsmType.GroupTour) && (
386
+ <div className="radiobutton-group qsm__filter__inputgroup">
387
+ <div className="radiobutton">
388
+ <label className="radiobutton__label">
389
+ <input
390
+ type="radio"
391
+ name="numberOfAccommodations"
392
+ // onChange={handleMainBookerChange}
393
+ // onBlur={formik.handleBlur}
394
+ value=""
395
+ checked={true}
396
+ readOnly
397
+ className="radiobutton__input"
398
+ />
399
+ <span>{translations.QSM.ONE_ACCOMMODATION}</span>
400
+ </label>
401
+ </div>
402
+ <div className="radiobutton">
403
+ <label className="radiobutton__label">
404
+ <input
405
+ type="radio"
406
+ name="numberOfAccommodations"
407
+ // onChange={handleMainBookerChange}
408
+ // onBlur={formik.handleBlur}
409
+ value=""
410
+ className="radiobutton__input"
411
+ disabled={true}
412
+ />
413
+ <span>{translations.QSM.MULTIPLE_ACCOMMODATIONS}</span>
414
+ </label>
415
+ </div>
416
+ </div>
417
+ )}
418
+ {qsmType === PortalQsmType.Flight && (
419
+ <div className="radiobutton-group qsm__filter__inputgroup">
420
+ {allowOneWay && (
421
+ <div className="radiobutton">
422
+ <label className="radiobutton__label">
423
+ <input
424
+ type="radio"
425
+ name="tripType"
426
+ value="oneway"
427
+ checked={tripType === 'oneway'}
428
+ onChange={() => handleTripTypeChange('oneway')}
429
+ className="radiobutton__input"
430
+ />
431
+ <span>{translations.QSM.ONEWAY}</span>
432
+ </label>
433
+ </div>
434
+ )}
435
+
436
+ {allowRoundtrip && (
437
+ <div className="radiobutton">
438
+ <label className="radiobutton__label">
439
+ <input
440
+ type="radio"
441
+ name="tripType"
442
+ value="roundtrip"
443
+ checked={tripType === 'roundtrip'}
444
+ onChange={() => handleTripTypeChange('roundtrip')}
445
+ className="radiobutton__input"
446
+ />
447
+ <span>{translations.QSM.ROUNDTRIP}</span>
448
+ </label>
449
+ </div>
450
+ )}
451
+
452
+ {allowOpenJaw && (
453
+ <div className="radiobutton">
454
+ <label className="radiobutton__label">
455
+ <input
456
+ type="radio"
457
+ name="tripType"
458
+ value="openjaw"
459
+ checked={tripType === 'openjaw'}
460
+ onChange={() => handleTripTypeChange('openjaw')}
461
+ className="radiobutton__input"
462
+ />
463
+ <span>{translations.QSM.OPENJAW}</span>
464
+ </label>
465
+ </div>
466
+ )}
467
+ </div>
468
+ )}
469
+ <div className="qsm__filter__classgroup">
470
+ {qsmType !== PortalQsmType.Accommodation &&
471
+ qsmType !== PortalQsmType.Car &&
472
+ qsmType !== PortalQsmType.Ticket &&
473
+ qsmType !== PortalQsmType.Cruise &&
474
+ qsmType !== PortalQsmType.Transfer &&
475
+ qsmType !== PortalQsmType.GroupTour &&
476
+ askTravelClass && <TravelClassPicker />}
477
+ {qsmType !== PortalQsmType.Multidestination &&
478
+ qsmType !== PortalQsmType.Car &&
479
+ qsmType !== PortalQsmType.Flight &&
480
+ qsmType !== PortalQsmType.Transfer &&
481
+ askTravelType && <TravelTypePicker />}
482
+ {askNationality && <TravelNationalityPicker />}
483
+ </div>
484
+ </div>
485
+ <div className="qsm__input-group">
486
+ {/* TODO, determine which fields to show for what type of QSM */}
487
+ {(qsmType == PortalQsmType.Flight || qsmType == PortalQsmType.AccommodationAndFlight) && originDestinationField && (
488
+ <DoubleSearchInputGroup fieldConfig={originDestinationField} showReverse={originDestinationField.showReverse} />
489
+ )}
490
+ {qsmType == PortalQsmType.Flight && tripType == 'openjaw' && openJawReturnDestinationField && (
491
+ <DoubleSearchInputGroup fieldConfig={openJawReturnDestinationField} showReverse={openJawReturnDestinationField.showReverse} />
492
+ )}
493
+ {(qsmType == PortalQsmType.Accommodation || qsmType == PortalQsmType.AccommodationAndFlight || qsmType == PortalQsmType.GroupTour) && destination && (
494
+ <SearchInputGroup fieldConfig={destination} />
495
+ )}
496
+
497
+ <Dates value={dateRange} onChange={handleDateChange} />
498
+
499
+ {askTravelers && <TravelInputGroup />}
500
+
501
+ <button type="button" className="cta" onClick={handleSubmit}>
502
+ {submitIcon && submitIcon.toString().length > 0 && <span>{submitIcon}</span>}
503
+ <span>{translations.QSM.CONFIRM}</span>
504
+ </button>
505
+ </div>
506
+ </div>
507
+ {isMobile && mobileFilterType && <MobileFilterModal />}
508
+ </div>
509
+ );
510
+ };
511
+
512
+ export default QSMContainer;