@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,562 +1,562 @@
1
- import { book, validateVoucher, EntryStatus } from '@qite/tide-client';
2
- import { BookingPackageRequest, BookingPackageVoucherRequest, ServiceType } from '@qite/tide-client';
3
- import { Link, useNavigate, useLocation } from 'react-router-dom';
4
- import { compact, findIndex, isEmpty, isNil, uniqBy } from 'lodash';
5
- import React, { useContext, useEffect, useState } from 'react';
6
- import { useSelector } from 'react-redux';
7
- import { buildClassName } from '../../../shared/utils/class-util';
8
- import { buildTideClientConfig } from '../../../shared/utils/tide-api-utils';
9
- import Icon from '../../components/icon';
10
- import SettingsContext from '../../settings-context';
11
- import { useAppDispatch } from '../../store';
12
- import { SummaryCheckbox } from '../../types';
13
- import { setBookingNumber, setBookingRemarks, setCurrentStep, setIsOption, setVoucherCodes } from '../booking/booking-slice';
14
- import { CONFIRMATION_STEP, ERROR_STEP, TRAVELERS_FORM_STEP } from '../booking/constants';
15
- import {
16
- selectActiveOption,
17
- selectAgentAdressId,
18
- selectApiSettings,
19
- selectBookingPackageBookRequest,
20
- selectBookingQueryString,
21
- selectDepartureFlight,
22
- selectLanguageCode,
23
- selectOfficeId,
24
- selectPackageDetails,
25
- selectReturnFlight,
26
- selectRoomOptionDepartureFlightsMetaData,
27
- selectRoomOptionReturnFlightsMetaData,
28
- selectTranslations
29
- } from '../booking/selectors';
30
- import { fetchPriceDetails, selectNotifications, setNotifications } from '../price-details/price-details-slice';
31
- import { getDateText } from '../sidebar/sidebar-util';
32
- import { selectRooms, selectTravelersFormValues } from '../travelers-form/travelers-form-slice';
33
- import SummaryBookingOptionPax from './summary-booking-option-pax';
34
- import SummaryBookingOptionUnit from './summary-booking-option-unit';
35
- import SummaryFlight from './summary-flight';
36
- import SummaryBookingOption from './summary-per-booking-option-group';
37
- import { selectUserValidated, setUserValidated } from './summary-slice';
38
- import Loader from '../../../shared/components/loader';
39
-
40
- interface VoucherProps {
41
- code?: string;
42
- isValidated?: boolean;
43
- isValid?: boolean;
44
- }
45
-
46
- interface SummaryProps {}
47
-
48
- const Summary: React.FC<SummaryProps> = () => {
49
- const dispatch = useAppDispatch();
50
-
51
- const settings = useContext(SettingsContext);
52
- const navigate = settings.skipRouter ? () => {} : useNavigate();
53
-
54
- const [isSubmitting, setIsSubmitting] = useState(false);
55
- const [checkboxes, setCheckboxes] = useState<SummaryCheckbox[] | undefined | null>(settings.summary?.checkboxes);
56
- const [remarks, setRemarks] = useState<string>('');
57
-
58
- const [voucher, setVoucher] = useState<VoucherProps>({});
59
-
60
- const bookingQueryString = useSelector(selectBookingQueryString);
61
- const travelerFormValues = useSelector(selectTravelersFormValues);
62
- const packageDetails = useSelector(selectPackageDetails);
63
- const activeOption = useSelector(selectActiveOption);
64
- const apiSettings = useSelector(selectApiSettings);
65
- const languageCode = useSelector(selectLanguageCode);
66
- const officeId = useSelector(selectOfficeId);
67
- const agentId = useSelector(selectAgentAdressId);
68
- const departureFlight = useSelector(selectDepartureFlight);
69
- const departureFlightMetaData = departureFlight?.flightMetaData ?? useSelector(selectRoomOptionDepartureFlightsMetaData)?.[0];
70
- const returnFlight = useSelector(selectReturnFlight);
71
- const returnFlightMetaData = returnFlight?.flightMetaData ?? useSelector(selectRoomOptionReturnFlightsMetaData)?.[0];
72
-
73
- if (!travelerFormValues) {
74
- if (settings.skipRouter) {
75
- dispatch(setCurrentStep(TRAVELERS_FORM_STEP));
76
- } else {
77
- navigate(`${!settings.skipBasePathInRouting ? settings.basePath : ''}?${bookingQueryString}`);
78
- }
79
- }
80
-
81
- const rooms = useSelector(selectRooms);
82
-
83
- const userValidated = useSelector(selectUserValidated);
84
- const notifications = useSelector(selectNotifications);
85
-
86
- const bookRequest = useSelector(selectBookingPackageBookRequest);
87
-
88
- useEffect(() => {
89
- // Every checkbox should be checked, or no checkboxes
90
- const checkboxesValidated = !isNil(checkboxes) ? checkboxes.every((checkbox) => checkbox.isSelected) : true;
91
-
92
- const notificationsValidated = !isNil(notifications) ? notifications.filter((x) => x.hasToBeConfirmed).every((checkbox) => checkbox.isConfirmed) : true;
93
-
94
- dispatch(setUserValidated(checkboxesValidated && notificationsValidated));
95
- }, [checkboxes, notifications]);
96
-
97
- const handleSubmit: React.FormEventHandler<HTMLFormElement> = async (e) => {
98
- e.preventDefault();
99
- const submitter = (e.nativeEvent as any).submitter?.name;
100
- setIsSubmitting(true);
101
-
102
- if (typeof window !== 'undefined') {
103
- window.scrollTo(0, 0);
104
- }
105
-
106
- const tideClientConfig = buildTideClientConfig(apiSettings);
107
-
108
- if (!bookRequest || !tideClientConfig) {
109
- return;
110
- }
111
-
112
- if (bookRequest.payload.returnPaymentUrl) {
113
- if (typeof window !== 'undefined') {
114
- const location = window.location;
115
- window.scrollTo(0, 0);
116
- bookRequest.payload.redirectUrl = `${location.protocol}//${location.host}${settings.basePath}?${bookingQueryString}`;
117
- }
118
- }
119
-
120
- try {
121
- if (submitter === 'option') {
122
- bookRequest.payload.status = EntryStatus.option;
123
- bookRequest.payload.customStatusId = settings.customOptionStatus;
124
-
125
- dispatch(setIsOption(true));
126
- }
127
-
128
- const bookingResponse = await book(tideClientConfig, bookRequest, undefined, languageCode);
129
-
130
- // Booking successfull
131
- dispatch(setBookingNumber(bookingResponse.number));
132
-
133
- if (bookingResponse.paymentUrl) {
134
- window.location.href = bookingResponse.paymentUrl;
135
- } else {
136
- if (settings.skipRouter) {
137
- dispatch(setCurrentStep(CONFIRMATION_STEP));
138
- } else {
139
- navigate(`${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.confirmation.pathSuffix}?${bookingQueryString}`);
140
- }
141
- }
142
- } catch (error) {
143
- if (settings.skipRouter) {
144
- dispatch(setCurrentStep(ERROR_STEP));
145
- } else {
146
- navigate(`${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.error.pathSuffix}?${bookingQueryString}`);
147
- }
148
- } finally {
149
- setIsSubmitting(false);
150
- }
151
- };
152
-
153
- const handleNotificationChange = (id: number, checked: boolean) => {
154
- const updatedNotifications = notifications.map((notification) => (notification.id === id ? { ...notification, isConfirmed: checked } : notification));
155
-
156
- dispatch(setNotifications(updatedNotifications));
157
- };
158
-
159
- const handleCheckboxChange = (id: string, checked: boolean) => {
160
- if (isNil(checkboxes)) {
161
- return;
162
- }
163
-
164
- const newCheckboxes = [...checkboxes];
165
-
166
- const index = findIndex(checkboxes, (checkbox) => checkbox.id === id);
167
- newCheckboxes[index].isSelected = !newCheckboxes[index].isSelected;
168
-
169
- setCheckboxes(newCheckboxes);
170
- };
171
-
172
- const handleRemarksChange = (text: string) => {
173
- dispatch(setBookingRemarks(text));
174
-
175
- setRemarks(text);
176
- };
177
-
178
- const handleValidateVoucher = async () => {
179
- if (!voucher?.code) return;
180
-
181
- const request = {
182
- officeId: officeId,
183
- agentId: agentId,
184
- payload: {
185
- code: voucher.code,
186
- otherCodes: bookRequest?.payload.voucherCodes ?? []
187
- }
188
- } as BookingPackageRequest<BookingPackageVoucherRequest>;
189
-
190
- const tideClientConfig = buildTideClientConfig(apiSettings);
191
- if (!tideClientConfig) return;
192
-
193
- const result = await validateVoucher(tideClientConfig, request);
194
-
195
- if (result) {
196
- setVoucher({
197
- ...voucher,
198
- isValidated: true,
199
- isValid: result.isValid
200
- });
201
- }
202
- };
203
-
204
- const handleAddVoucher: React.MouseEventHandler<HTMLButtonElement> = (event) => {
205
- if (!voucher.isValid) return;
206
-
207
- dispatch(setVoucherCodes([...(bookRequest?.payload.voucherCodes ?? []), voucher.code ?? ''].filter((x) => x !== '')));
208
-
209
- dispatch(fetchPriceDetails());
210
-
211
- setVoucher({});
212
- };
213
-
214
- const handleRemoveVoucher = (code: string) => {
215
- dispatch(setVoucherCodes(bookRequest?.payload.voucherCodes?.filter((x) => x !== code) ?? []));
216
-
217
- dispatch(fetchPriceDetails());
218
- };
219
-
220
- const goPrevious = () => {
221
- dispatch(setCurrentStep(TRAVELERS_FORM_STEP));
222
- };
223
-
224
- const translations = useSelector(selectTranslations);
225
-
226
- return (
227
- <>
228
- {isSubmitting && (settings.loaderComponent || <Loader />)}
229
- {!isSubmitting && (
230
- <form className="form" name="booking--summary" id="booking--summary" onSubmit={handleSubmit}>
231
- <div className="form__booking--summary">
232
- <div className="form__region">
233
- <div className="form__row">
234
- <div className="form__group">
235
- <div className="form__region-header">
236
- <h5 className="form__region-heading">{translations.SUMMARY.PERSONAL_DETAILS}</h5>
237
- </div>
238
- </div>
239
- </div>
240
- {rooms.map((r, rIndex) => (
241
- <div className="form__row" key={rIndex}>
242
- <div className="form__group">
243
- <div className="form__region-header">
244
- <h5 className="form__region-heading">
245
- {rooms.length > 1 ? `${translations.SHARED.ROOM} ${rIndex + 1}` : translations.ROOM_OPTIONS_FORM.TRAVELER_GROUP}
246
- </h5>
247
- <p className="form__region-label">
248
- {`${r.adults.length + r.children.length} ${
249
- r.adults.length + r.children.length === 1 ? translations.SUMMARY.TRAVELER : translations.SUMMARY.TRAVELERS
250
- }: ${compact([
251
- r.adults.length,
252
- r.adults.length === 1 && ` ${translations.SUMMARY.ADULT}`,
253
- r.adults.length > 1 && ` ${translations.SUMMARY.ADULTS}`,
254
- r.adults && r.adults.length && r.children && r.children.length && ', ',
255
- r.children.length,
256
- r.children.length === 1 && ` ${translations.SUMMARY.CHILD}`,
257
- r.children.length > 1 && ` ${translations.SUMMARY.CHILDREN}`
258
- ]).join('')}`}
259
- </p>
260
- </div>
261
- </div>
262
- {[...r.adults, ...r.children].map((traveler) => {
263
- const isMainBooker = traveler.id === travelerFormValues?.mainBookerId;
264
- return (
265
- <div className="form__group form__group--sm-50" key={traveler.id}>
266
- <ul className="list list--plain">
267
- <li className="list__item">
268
- <strong>
269
- {traveler.firstName} {traveler.lastName}
270
- </strong>{' '}
271
- {isMainBooker && <em>({translations.SUMMARY.MAIN_BOOKER})</em>}
272
- </li>
273
- <li className="list__item">{traveler.birthDate.split('-').reverse().join('/')}</li>
274
- {isMainBooker && (
275
- <>
276
- {travelerFormValues?.street && (
277
- <>
278
- <li className="list__item">{`${travelerFormValues?.street} ${compact([
279
- travelerFormValues?.houseNumber,
280
- travelerFormValues?.box
281
- ]).join(' ')}, ${travelerFormValues?.zipCode} ${travelerFormValues?.place}`}</li>
282
- </>
283
- )}
284
- {travelerFormValues?.phone && <li className="list__item">{travelerFormValues?.phone}</li>}
285
- {travelerFormValues?.email && <li className="list__item">{travelerFormValues?.email}</li>}
286
- </>
287
- )}
288
- </ul>
289
- </div>
290
- );
291
- })}
292
- </div>
293
- ))}
294
- </div>
295
-
296
- <div className="form__region">
297
- <div className="form__row">
298
- <div className="form__group">
299
- <div className="form__region-header">
300
- <h5 className="form__region-heading">{translations.SUMMARY.OPTIONS}</h5>
301
- </div>
302
- </div>
303
- </div>
304
- <div className="form__row">
305
- <div className="form__group">
306
- <ul className="list list--booking-summary">
307
- {activeOption?.serviceType == ServiceType.flight ? (
308
- <>
309
- {departureFlightMetaData && <SummaryFlight flightMetaData={departureFlightMetaData} header={translations.SIDEBAR.DEPARTURE_FLIGHT} />}
310
- {returnFlightMetaData && <SummaryFlight flightMetaData={returnFlightMetaData} header={translations.SIDEBAR.ARRIVAL_FLIGHT} />}
311
- </>
312
- ) : (
313
- <>
314
- {activeOption?.rooms
315
- .flatMap((r) => r.options)
316
- .filter((x) => x.isSelected)
317
- .map((roomOption, roomOptionIndex) => (
318
- <React.Fragment key={roomOptionIndex}>
319
- <li>
320
- <h6>{roomOption?.productName}</h6>
321
- <ul>
322
- <li className="list__item">
323
- {roomOption?.accommodationName}
324
- {!isNil(roomOption?.regimeName) && ', '}
325
- {roomOption?.regimeName}
326
- </li>
327
- </ul>
328
- <p>
329
- (
330
- {roomOption?.from === roomOption?.to ? (
331
- getDateText(roomOption?.from)
332
- ) : (
333
- <>
334
- {getDateText(roomOption?.from)} &gt; {getDateText(roomOption?.to)}
335
- </>
336
- )}
337
- )
338
- </p>
339
- </li>
340
- {!isEmpty(activeOption?.groups) &&
341
- activeOption?.groups.map((x, i) => {
342
- if (!x.options.some((y) => y.isSelected)) return;
343
-
344
- return <SummaryBookingOption key={i} group={x} />;
345
- })}
346
- {!isEmpty(activeOption?.optionUnits) && activeOption?.optionUnits.map((x, i) => <SummaryBookingOptionUnit key={i} unit={x} />)}
347
- {!isEmpty(activeOption?.optionPax) && activeOption?.optionPax.map((x, i) => <SummaryBookingOptionPax key={i} pax={x} />)}
348
- {packageDetails?.outwardFlights &&
349
- packageDetails.outwardFlights
350
- .filter((x) => x.isSelected)
351
- .map((flight, i) => (
352
- <SummaryFlight key={i} flightMetaData={flight.flightMetaData} header={translations.SIDEBAR.DEPARTURE_FLIGHT} />
353
- ))}
354
- {packageDetails?.returnFlights &&
355
- packageDetails.returnFlights
356
- .filter((x) => x.isSelected)
357
- .map((flight, i) => (
358
- <SummaryFlight key={i} flightMetaData={flight.flightMetaData} header={translations.SIDEBAR.ARRIVAL_FLIGHT} />
359
- ))}
360
- </React.Fragment>
361
- ))}
362
- </>
363
- )}
364
- </ul>
365
- </div>
366
- </div>
367
- </div>
368
-
369
- {settings.enableVoucher && (
370
- <div className="form__region">
371
- <div className="form__row">
372
- <div className="form__group">
373
- <div className="form__region-header">
374
- <h5 className="form__region-heading">{translations.SUMMARY.VOUCHERS}</h5>
375
- </div>
376
- </div>
377
- </div>
378
- <div className="form__row">
379
- <div className="form__group">
380
- <input
381
- type="text"
382
- className="form__input info-message__voucher__input"
383
- defaultValue={voucher.code}
384
- onChange={(e) => setVoucher({ code: e.target.value })}
385
- />
386
- <button type="button" className={buildClassName(['cta', !voucher.code && 'cta--disabled'])} onClick={(e) => handleValidateVoucher()}>
387
- {translations.SUMMARY.VOUCHER_VALIDATE}
388
- </button>
389
- </div>
390
- </div>
391
- <div className="form__row">
392
- <div className="form__group info-message__voucher">
393
- {voucher.isValid && voucher.isValidated && (
394
- <div className="info-message info-message__voucher__valid">
395
- <span>{translations.SUMMARY.VOUCHER_VALID}</span>
396
- <button type="button" className="cta cta--secondary" onClick={handleAddVoucher}>
397
- {translations.SUMMARY.ADD_VOUCHER}
398
- </button>
399
- </div>
400
- )}
401
- {!voucher.isValid && voucher.isValidated && <div className="info-message--error">{translations.SUMMARY.VOUCHER_INVALID}</div>}
402
- </div>
403
- </div>
404
- <div className="form__row">
405
- <ul className="info-message__voucher">
406
- {!isEmpty(bookRequest?.payload.voucherCodes) &&
407
- bookRequest?.payload.voucherCodes?.map((y, i) => (
408
- <li key={i}>
409
- <div className="info-message__voucher__list">
410
- {y}{' '}
411
- <button type="button" className="cta--add-remove" onClick={(e) => handleRemoveVoucher(y)}>
412
- <Icon height={16} name="ui-trashcan" />
413
- </button>
414
- </div>
415
- </li>
416
- ))}
417
- </ul>
418
- </div>
419
- </div>
420
- )}
421
-
422
- {!isEmpty(notifications) && (
423
- <div className="form__region">
424
- <div className="form__row">
425
- <div className="form__group">
426
- <div className="info-message">
427
- <Icon name="ui-tooltip" className="icon--secondary-color" />
428
- <div className="info-message__copy">
429
- <h5>{translations.SUMMARY.NOTIFICATIONS_TITLE}</h5>
430
- <>
431
- {uniqBy(
432
- notifications.filter((x) => !x.hasToBeConfirmed),
433
- 'id'
434
- ).map((notification) => (
435
- <span key={notification.id} className="checkbox__label-text">
436
- <strong className="checkbox__label-text--title">{notification.title}</strong>
437
- <span className="checkbox__label-text--description">{notification.description}</span>
438
- </span>
439
- ))}
440
- {uniqBy(
441
- notifications.filter((x) => x.hasToBeConfirmed),
442
- 'id'
443
- ).map((notification) => (
444
- <div className="checkbox" key={notification.id}>
445
- <label className="checkbox__label">
446
- <input
447
- type="checkbox"
448
- className="checkbox__input"
449
- checked={notification.isConfirmed}
450
- onChange={(e) => handleNotificationChange(notification.id, e.target.checked)}
451
- />
452
- <span className="checkbox__label-text">
453
- <strong className="checkbox__label-text--title">{notification.title}</strong>
454
- <span className="checkbox__label-text--description">{notification.description}</span>
455
- </span>
456
- </label>
457
- </div>
458
- ))}
459
- </>
460
- </div>
461
- </div>
462
- </div>
463
- </div>
464
- </div>
465
- )}
466
-
467
- <div className="form__region">
468
- <div className="form__row">
469
- <div className="form__group">
470
- <div className="form__region-header">
471
- <h5 className="form__region-heading">{translations.SUMMARY.REMARKS}</h5>
472
- </div>
473
- </div>
474
- </div>
475
- <div className="form__row">
476
- <div className="form__group">
477
- <textarea className="form__input" defaultValue={remarks} onChange={(e) => handleRemarksChange(e.target.value)}></textarea>
478
- </div>
479
- </div>
480
- </div>
481
-
482
- <div className="form__region">
483
- <div className="form__row">
484
- <div className="form__group">
485
- <div className="info-message">
486
- <Icon name="ui-tooltip" className="icon--secondary-color" />
487
- <div className="info-message__copy">
488
- <h5>{translations.SUMMARY.VALIDATE_TITLE}</h5>
489
- {settings.customValidateText ? (
490
- <div
491
- dangerouslySetInnerHTML={{
492
- __html: settings.customValidateText
493
- }}></div>
494
- ) : (
495
- <>
496
- <p>{settings.isOffer ? translations.SUMMARY.VALIDATE_TEXT_OFFER : translations.SUMMARY.VALIDATE_TEXT_BOOKING}</p>
497
- {settings.allowOption && <p>{translations.SUMMARY.VALIDATE_TEXT_OPTION}</p>}
498
- </>
499
- )}
500
- {checkboxes &&
501
- checkboxes.map((checkbox) => (
502
- <div className="checkbox" key={checkbox.id}>
503
- <label className="checkbox__label">
504
- <input
505
- type="checkbox"
506
- className="checkbox__input"
507
- checked={checkbox.isSelected}
508
- onChange={(e) => handleCheckboxChange(checkbox.id, e.target.checked)}
509
- />
510
- <span
511
- className="checkbox__label-text"
512
- dangerouslySetInnerHTML={{
513
- __html: checkbox.text
514
- }}
515
- />
516
- </label>
517
- </div>
518
- ))}
519
- </div>
520
- </div>
521
- </div>
522
- </div>
523
- </div>
524
- </div>
525
-
526
- <div className="booking__navigator">
527
- {settings.skipRouter ? (
528
- <button type="button" title={translations.STEPS.PREVIOUS} onClick={() => goPrevious()} className="cta cta--secondary">
529
- {translations.STEPS.PREVIOUS}
530
- </button>
531
- ) : (
532
- <Link
533
- to={`${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.travellers.pathSuffix}?${bookingQueryString}`}
534
- title={translations.STEPS.PREVIOUS}
535
- className="cta cta--secondary">
536
- {translations.STEPS.PREVIOUS}
537
- </Link>
538
- )}
539
- {settings.allowOption && (
540
- <button
541
- title={translations.STEPS.SUBMIT_OPTION}
542
- className={buildClassName(['cta', !userValidated && 'cta--disabled'])}
543
- disabled={!userValidated}
544
- name="option">
545
- {translations.STEPS.SUBMIT_OPTION}
546
- </button>
547
- )}
548
- <button
549
- title={settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING}
550
- className={buildClassName(['cta', !userValidated && 'cta--disabled'])}
551
- disabled={!userValidated}
552
- name="default">
553
- {settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING}
554
- </button>
555
- </div>
556
- </form>
557
- )}
558
- </>
559
- );
560
- };
561
-
562
- export default Summary;
1
+ import { book, validateVoucher, EntryStatus } from '@qite/tide-client';
2
+ import { BookingPackageRequest, BookingPackageVoucherRequest, ServiceType } from '@qite/tide-client';
3
+ import { Link, useNavigate, useLocation } from 'react-router-dom';
4
+ import { compact, findIndex, isEmpty, isNil, uniqBy } from 'lodash';
5
+ import React, { useContext, useEffect, useState } from 'react';
6
+ import { useSelector } from 'react-redux';
7
+ import { buildClassName } from '../../../shared/utils/class-util';
8
+ import { buildTideClientConfig } from '../../../shared/utils/tide-api-utils';
9
+ import Icon from '../../components/icon';
10
+ import SettingsContext from '../../settings-context';
11
+ import { useAppDispatch } from '../../store';
12
+ import { SummaryCheckbox } from '../../types';
13
+ import { setBookingNumber, setBookingRemarks, setCurrentStep, setIsOption, setVoucherCodes } from '../booking/booking-slice';
14
+ import { CONFIRMATION_STEP, ERROR_STEP, TRAVELERS_FORM_STEP } from '../booking/constants';
15
+ import {
16
+ selectActiveOption,
17
+ selectAgentAdressId,
18
+ selectApiSettings,
19
+ selectBookingPackageBookRequest,
20
+ selectBookingQueryString,
21
+ selectDepartureFlight,
22
+ selectLanguageCode,
23
+ selectOfficeId,
24
+ selectPackageDetails,
25
+ selectReturnFlight,
26
+ selectRoomOptionDepartureFlightsMetaData,
27
+ selectRoomOptionReturnFlightsMetaData,
28
+ selectTranslations
29
+ } from '../booking/selectors';
30
+ import { fetchPriceDetails, selectNotifications, setNotifications } from '../price-details/price-details-slice';
31
+ import { getDateText } from '../sidebar/sidebar-util';
32
+ import { selectRooms, selectTravelersFormValues } from '../travelers-form/travelers-form-slice';
33
+ import SummaryBookingOptionPax from './summary-booking-option-pax';
34
+ import SummaryBookingOptionUnit from './summary-booking-option-unit';
35
+ import SummaryFlight from './summary-flight';
36
+ import SummaryBookingOption from './summary-per-booking-option-group';
37
+ import { selectUserValidated, setUserValidated } from './summary-slice';
38
+ import Loader from '../../../shared/components/loader';
39
+
40
+ interface VoucherProps {
41
+ code?: string;
42
+ isValidated?: boolean;
43
+ isValid?: boolean;
44
+ }
45
+
46
+ interface SummaryProps {}
47
+
48
+ const Summary: React.FC<SummaryProps> = () => {
49
+ const dispatch = useAppDispatch();
50
+
51
+ const settings = useContext(SettingsContext);
52
+ const navigate = settings.skipRouter ? () => {} : useNavigate();
53
+
54
+ const [isSubmitting, setIsSubmitting] = useState(false);
55
+ const [checkboxes, setCheckboxes] = useState<SummaryCheckbox[] | undefined | null>(settings.summary?.checkboxes);
56
+ const [remarks, setRemarks] = useState<string>('');
57
+
58
+ const [voucher, setVoucher] = useState<VoucherProps>({});
59
+
60
+ const bookingQueryString = useSelector(selectBookingQueryString);
61
+ const travelerFormValues = useSelector(selectTravelersFormValues);
62
+ const packageDetails = useSelector(selectPackageDetails);
63
+ const activeOption = useSelector(selectActiveOption);
64
+ const apiSettings = useSelector(selectApiSettings);
65
+ const languageCode = useSelector(selectLanguageCode);
66
+ const officeId = useSelector(selectOfficeId);
67
+ const agentId = useSelector(selectAgentAdressId);
68
+ const departureFlight = useSelector(selectDepartureFlight);
69
+ const departureFlightMetaData = departureFlight?.flightMetaData ?? useSelector(selectRoomOptionDepartureFlightsMetaData)?.[0];
70
+ const returnFlight = useSelector(selectReturnFlight);
71
+ const returnFlightMetaData = returnFlight?.flightMetaData ?? useSelector(selectRoomOptionReturnFlightsMetaData)?.[0];
72
+
73
+ if (!travelerFormValues) {
74
+ if (settings.skipRouter) {
75
+ dispatch(setCurrentStep(TRAVELERS_FORM_STEP));
76
+ } else {
77
+ navigate(`${!settings.skipBasePathInRouting ? settings.basePath : ''}?${bookingQueryString}`);
78
+ }
79
+ }
80
+
81
+ const rooms = useSelector(selectRooms);
82
+
83
+ const userValidated = useSelector(selectUserValidated);
84
+ const notifications = useSelector(selectNotifications);
85
+
86
+ const bookRequest = useSelector(selectBookingPackageBookRequest);
87
+
88
+ useEffect(() => {
89
+ // Every checkbox should be checked, or no checkboxes
90
+ const checkboxesValidated = !isNil(checkboxes) ? checkboxes.every((checkbox) => checkbox.isSelected) : true;
91
+
92
+ const notificationsValidated = !isNil(notifications) ? notifications.filter((x) => x.hasToBeConfirmed).every((checkbox) => checkbox.isConfirmed) : true;
93
+
94
+ dispatch(setUserValidated(checkboxesValidated && notificationsValidated));
95
+ }, [checkboxes, notifications]);
96
+
97
+ const handleSubmit: React.FormEventHandler<HTMLFormElement> = async (e) => {
98
+ e.preventDefault();
99
+ const submitter = (e.nativeEvent as any).submitter?.name;
100
+ setIsSubmitting(true);
101
+
102
+ if (typeof window !== 'undefined') {
103
+ window.scrollTo(0, 0);
104
+ }
105
+
106
+ const tideClientConfig = buildTideClientConfig(apiSettings);
107
+
108
+ if (!bookRequest || !tideClientConfig) {
109
+ return;
110
+ }
111
+
112
+ if (bookRequest.payload.returnPaymentUrl) {
113
+ if (typeof window !== 'undefined') {
114
+ const location = window.location;
115
+ window.scrollTo(0, 0);
116
+ bookRequest.payload.redirectUrl = `${location.protocol}//${location.host}${settings.basePath}?${bookingQueryString}`;
117
+ }
118
+ }
119
+
120
+ try {
121
+ if (submitter === 'option') {
122
+ bookRequest.payload.status = EntryStatus.option;
123
+ bookRequest.payload.customStatusId = settings.customOptionStatus;
124
+
125
+ dispatch(setIsOption(true));
126
+ }
127
+
128
+ const bookingResponse = await book(tideClientConfig, bookRequest, undefined, languageCode);
129
+
130
+ // Booking successfull
131
+ dispatch(setBookingNumber(bookingResponse.number));
132
+
133
+ if (bookingResponse.paymentUrl) {
134
+ window.location.href = bookingResponse.paymentUrl;
135
+ } else {
136
+ if (settings.skipRouter) {
137
+ dispatch(setCurrentStep(CONFIRMATION_STEP));
138
+ } else {
139
+ navigate(`${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.confirmation.pathSuffix}?${bookingQueryString}`);
140
+ }
141
+ }
142
+ } catch (error) {
143
+ if (settings.skipRouter) {
144
+ dispatch(setCurrentStep(ERROR_STEP));
145
+ } else {
146
+ navigate(`${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.error.pathSuffix}?${bookingQueryString}`);
147
+ }
148
+ } finally {
149
+ setIsSubmitting(false);
150
+ }
151
+ };
152
+
153
+ const handleNotificationChange = (id: number, checked: boolean) => {
154
+ const updatedNotifications = notifications.map((notification) => (notification.id === id ? { ...notification, isConfirmed: checked } : notification));
155
+
156
+ dispatch(setNotifications(updatedNotifications));
157
+ };
158
+
159
+ const handleCheckboxChange = (id: string, checked: boolean) => {
160
+ if (isNil(checkboxes)) {
161
+ return;
162
+ }
163
+
164
+ const newCheckboxes = [...checkboxes];
165
+
166
+ const index = findIndex(checkboxes, (checkbox) => checkbox.id === id);
167
+ newCheckboxes[index].isSelected = !newCheckboxes[index].isSelected;
168
+
169
+ setCheckboxes(newCheckboxes);
170
+ };
171
+
172
+ const handleRemarksChange = (text: string) => {
173
+ dispatch(setBookingRemarks(text));
174
+
175
+ setRemarks(text);
176
+ };
177
+
178
+ const handleValidateVoucher = async () => {
179
+ if (!voucher?.code) return;
180
+
181
+ const request = {
182
+ officeId: officeId,
183
+ agentId: agentId,
184
+ payload: {
185
+ code: voucher.code,
186
+ otherCodes: bookRequest?.payload.voucherCodes ?? []
187
+ }
188
+ } as BookingPackageRequest<BookingPackageVoucherRequest>;
189
+
190
+ const tideClientConfig = buildTideClientConfig(apiSettings);
191
+ if (!tideClientConfig) return;
192
+
193
+ const result = await validateVoucher(tideClientConfig, request);
194
+
195
+ if (result) {
196
+ setVoucher({
197
+ ...voucher,
198
+ isValidated: true,
199
+ isValid: result.isValid
200
+ });
201
+ }
202
+ };
203
+
204
+ const handleAddVoucher: React.MouseEventHandler<HTMLButtonElement> = (event) => {
205
+ if (!voucher.isValid) return;
206
+
207
+ dispatch(setVoucherCodes([...(bookRequest?.payload.voucherCodes ?? []), voucher.code ?? ''].filter((x) => x !== '')));
208
+
209
+ dispatch(fetchPriceDetails());
210
+
211
+ setVoucher({});
212
+ };
213
+
214
+ const handleRemoveVoucher = (code: string) => {
215
+ dispatch(setVoucherCodes(bookRequest?.payload.voucherCodes?.filter((x) => x !== code) ?? []));
216
+
217
+ dispatch(fetchPriceDetails());
218
+ };
219
+
220
+ const goPrevious = () => {
221
+ dispatch(setCurrentStep(TRAVELERS_FORM_STEP));
222
+ };
223
+
224
+ const translations = useSelector(selectTranslations);
225
+
226
+ return (
227
+ <>
228
+ {isSubmitting && (settings.loaderComponent || <Loader />)}
229
+ {!isSubmitting && (
230
+ <form className="form" name="booking--summary" id="booking--summary" onSubmit={handleSubmit}>
231
+ <div className="form__booking--summary">
232
+ <div className="form__region">
233
+ <div className="form__row">
234
+ <div className="form__group">
235
+ <div className="form__region-header">
236
+ <h5 className="form__region-heading">{translations.SUMMARY.PERSONAL_DETAILS}</h5>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ {rooms.map((r, rIndex) => (
241
+ <div className="form__row" key={rIndex}>
242
+ <div className="form__group">
243
+ <div className="form__region-header">
244
+ <h5 className="form__region-heading">
245
+ {rooms.length > 1 ? `${translations.SHARED.ROOM} ${rIndex + 1}` : translations.ROOM_OPTIONS_FORM.TRAVELER_GROUP}
246
+ </h5>
247
+ <p className="form__region-label">
248
+ {`${r.adults.length + r.children.length} ${
249
+ r.adults.length + r.children.length === 1 ? translations.SUMMARY.TRAVELER : translations.SUMMARY.TRAVELERS
250
+ }: ${compact([
251
+ r.adults.length,
252
+ r.adults.length === 1 && ` ${translations.SUMMARY.ADULT}`,
253
+ r.adults.length > 1 && ` ${translations.SUMMARY.ADULTS}`,
254
+ r.adults && r.adults.length && r.children && r.children.length && ', ',
255
+ r.children.length,
256
+ r.children.length === 1 && ` ${translations.SUMMARY.CHILD}`,
257
+ r.children.length > 1 && ` ${translations.SUMMARY.CHILDREN}`
258
+ ]).join('')}`}
259
+ </p>
260
+ </div>
261
+ </div>
262
+ {[...r.adults, ...r.children].map((traveler) => {
263
+ const isMainBooker = traveler.id === travelerFormValues?.mainBookerId;
264
+ return (
265
+ <div className="form__group form__group--sm-50" key={traveler.id}>
266
+ <ul className="list list--plain">
267
+ <li className="list__item">
268
+ <strong>
269
+ {traveler.firstName} {traveler.lastName}
270
+ </strong>{' '}
271
+ {isMainBooker && <em>({translations.SUMMARY.MAIN_BOOKER})</em>}
272
+ </li>
273
+ <li className="list__item">{traveler.birthDate.split('-').reverse().join('/')}</li>
274
+ {isMainBooker && (
275
+ <>
276
+ {travelerFormValues?.street && (
277
+ <>
278
+ <li className="list__item">{`${travelerFormValues?.street} ${compact([
279
+ travelerFormValues?.houseNumber,
280
+ travelerFormValues?.box
281
+ ]).join(' ')}, ${travelerFormValues?.zipCode} ${travelerFormValues?.place}`}</li>
282
+ </>
283
+ )}
284
+ {travelerFormValues?.phone && <li className="list__item">{travelerFormValues?.phone}</li>}
285
+ {travelerFormValues?.email && <li className="list__item">{travelerFormValues?.email}</li>}
286
+ </>
287
+ )}
288
+ </ul>
289
+ </div>
290
+ );
291
+ })}
292
+ </div>
293
+ ))}
294
+ </div>
295
+
296
+ <div className="form__region">
297
+ <div className="form__row">
298
+ <div className="form__group">
299
+ <div className="form__region-header">
300
+ <h5 className="form__region-heading">{translations.SUMMARY.OPTIONS}</h5>
301
+ </div>
302
+ </div>
303
+ </div>
304
+ <div className="form__row">
305
+ <div className="form__group">
306
+ <ul className="list list--booking-summary">
307
+ {activeOption?.serviceType == ServiceType.flight ? (
308
+ <>
309
+ {departureFlightMetaData && <SummaryFlight flightMetaData={departureFlightMetaData} header={translations.SIDEBAR.DEPARTURE_FLIGHT} />}
310
+ {returnFlightMetaData && <SummaryFlight flightMetaData={returnFlightMetaData} header={translations.SIDEBAR.ARRIVAL_FLIGHT} />}
311
+ </>
312
+ ) : (
313
+ <>
314
+ {activeOption?.rooms
315
+ .flatMap((r) => r.options)
316
+ .filter((x) => x.isSelected)
317
+ .map((roomOption, roomOptionIndex) => (
318
+ <React.Fragment key={roomOptionIndex}>
319
+ <li>
320
+ <h6>{roomOption?.productName}</h6>
321
+ <ul>
322
+ <li className="list__item">
323
+ {roomOption?.accommodationName}
324
+ {!isNil(roomOption?.regimeName) && ', '}
325
+ {roomOption?.regimeName}
326
+ </li>
327
+ </ul>
328
+ <p>
329
+ (
330
+ {roomOption?.from === roomOption?.to ? (
331
+ getDateText(roomOption?.from)
332
+ ) : (
333
+ <>
334
+ {getDateText(roomOption?.from)} &gt; {getDateText(roomOption?.to)}
335
+ </>
336
+ )}
337
+ )
338
+ </p>
339
+ </li>
340
+ {!isEmpty(activeOption?.groups) &&
341
+ activeOption?.groups.map((x, i) => {
342
+ if (!x.options.some((y) => y.isSelected)) return;
343
+
344
+ return <SummaryBookingOption key={i} group={x} />;
345
+ })}
346
+ {!isEmpty(activeOption?.optionUnits) && activeOption?.optionUnits.map((x, i) => <SummaryBookingOptionUnit key={i} unit={x} />)}
347
+ {!isEmpty(activeOption?.optionPax) && activeOption?.optionPax.map((x, i) => <SummaryBookingOptionPax key={i} pax={x} />)}
348
+ {packageDetails?.outwardFlights &&
349
+ packageDetails.outwardFlights
350
+ .filter((x) => x.isSelected)
351
+ .map((flight, i) => (
352
+ <SummaryFlight key={i} flightMetaData={flight.flightMetaData} header={translations.SIDEBAR.DEPARTURE_FLIGHT} />
353
+ ))}
354
+ {packageDetails?.returnFlights &&
355
+ packageDetails.returnFlights
356
+ .filter((x) => x.isSelected)
357
+ .map((flight, i) => (
358
+ <SummaryFlight key={i} flightMetaData={flight.flightMetaData} header={translations.SIDEBAR.ARRIVAL_FLIGHT} />
359
+ ))}
360
+ </React.Fragment>
361
+ ))}
362
+ </>
363
+ )}
364
+ </ul>
365
+ </div>
366
+ </div>
367
+ </div>
368
+
369
+ {settings.enableVoucher && (
370
+ <div className="form__region">
371
+ <div className="form__row">
372
+ <div className="form__group">
373
+ <div className="form__region-header">
374
+ <h5 className="form__region-heading">{translations.SUMMARY.VOUCHERS}</h5>
375
+ </div>
376
+ </div>
377
+ </div>
378
+ <div className="form__row">
379
+ <div className="form__group">
380
+ <input
381
+ type="text"
382
+ className="form__input info-message__voucher__input"
383
+ defaultValue={voucher.code}
384
+ onChange={(e) => setVoucher({ code: e.target.value })}
385
+ />
386
+ <button type="button" className={buildClassName(['cta', !voucher.code && 'cta--disabled'])} onClick={(e) => handleValidateVoucher()}>
387
+ {translations.SUMMARY.VOUCHER_VALIDATE}
388
+ </button>
389
+ </div>
390
+ </div>
391
+ <div className="form__row">
392
+ <div className="form__group info-message__voucher">
393
+ {voucher.isValid && voucher.isValidated && (
394
+ <div className="info-message info-message__voucher__valid">
395
+ <span>{translations.SUMMARY.VOUCHER_VALID}</span>
396
+ <button type="button" className="cta cta--secondary" onClick={handleAddVoucher}>
397
+ {translations.SUMMARY.ADD_VOUCHER}
398
+ </button>
399
+ </div>
400
+ )}
401
+ {!voucher.isValid && voucher.isValidated && <div className="info-message--error">{translations.SUMMARY.VOUCHER_INVALID}</div>}
402
+ </div>
403
+ </div>
404
+ <div className="form__row">
405
+ <ul className="info-message__voucher">
406
+ {!isEmpty(bookRequest?.payload.voucherCodes) &&
407
+ bookRequest?.payload.voucherCodes?.map((y, i) => (
408
+ <li key={i}>
409
+ <div className="info-message__voucher__list">
410
+ {y}{' '}
411
+ <button type="button" className="cta--add-remove" onClick={(e) => handleRemoveVoucher(y)}>
412
+ <Icon height={16} name="ui-trashcan" />
413
+ </button>
414
+ </div>
415
+ </li>
416
+ ))}
417
+ </ul>
418
+ </div>
419
+ </div>
420
+ )}
421
+
422
+ {!isEmpty(notifications) && (
423
+ <div className="form__region">
424
+ <div className="form__row">
425
+ <div className="form__group">
426
+ <div className="info-message">
427
+ <Icon name="ui-tooltip" className="icon--secondary-color" />
428
+ <div className="info-message__copy">
429
+ <h5>{translations.SUMMARY.NOTIFICATIONS_TITLE}</h5>
430
+ <>
431
+ {uniqBy(
432
+ notifications.filter((x) => !x.hasToBeConfirmed),
433
+ 'id'
434
+ ).map((notification) => (
435
+ <span key={notification.id} className="checkbox__label-text">
436
+ <strong className="checkbox__label-text--title">{notification.title}</strong>
437
+ <span className="checkbox__label-text--description">{notification.description}</span>
438
+ </span>
439
+ ))}
440
+ {uniqBy(
441
+ notifications.filter((x) => x.hasToBeConfirmed),
442
+ 'id'
443
+ ).map((notification) => (
444
+ <div className="checkbox" key={notification.id}>
445
+ <label className="checkbox__label">
446
+ <input
447
+ type="checkbox"
448
+ className="checkbox__input"
449
+ checked={notification.isConfirmed}
450
+ onChange={(e) => handleNotificationChange(notification.id, e.target.checked)}
451
+ />
452
+ <span className="checkbox__label-text">
453
+ <strong className="checkbox__label-text--title">{notification.title}</strong>
454
+ <span className="checkbox__label-text--description">{notification.description}</span>
455
+ </span>
456
+ </label>
457
+ </div>
458
+ ))}
459
+ </>
460
+ </div>
461
+ </div>
462
+ </div>
463
+ </div>
464
+ </div>
465
+ )}
466
+
467
+ <div className="form__region">
468
+ <div className="form__row">
469
+ <div className="form__group">
470
+ <div className="form__region-header">
471
+ <h5 className="form__region-heading">{translations.SUMMARY.REMARKS}</h5>
472
+ </div>
473
+ </div>
474
+ </div>
475
+ <div className="form__row">
476
+ <div className="form__group">
477
+ <textarea className="form__input" defaultValue={remarks} onChange={(e) => handleRemarksChange(e.target.value)}></textarea>
478
+ </div>
479
+ </div>
480
+ </div>
481
+
482
+ <div className="form__region">
483
+ <div className="form__row">
484
+ <div className="form__group">
485
+ <div className="info-message">
486
+ <Icon name="ui-tooltip" className="icon--secondary-color" />
487
+ <div className="info-message__copy">
488
+ <h5>{translations.SUMMARY.VALIDATE_TITLE}</h5>
489
+ {settings.customValidateText ? (
490
+ <div
491
+ dangerouslySetInnerHTML={{
492
+ __html: settings.customValidateText
493
+ }}></div>
494
+ ) : (
495
+ <>
496
+ <p>{settings.isOffer ? translations.SUMMARY.VALIDATE_TEXT_OFFER : translations.SUMMARY.VALIDATE_TEXT_BOOKING}</p>
497
+ {settings.allowOption && <p>{translations.SUMMARY.VALIDATE_TEXT_OPTION}</p>}
498
+ </>
499
+ )}
500
+ {checkboxes &&
501
+ checkboxes.map((checkbox) => (
502
+ <div className="checkbox" key={checkbox.id}>
503
+ <label className="checkbox__label">
504
+ <input
505
+ type="checkbox"
506
+ className="checkbox__input"
507
+ checked={checkbox.isSelected}
508
+ onChange={(e) => handleCheckboxChange(checkbox.id, e.target.checked)}
509
+ />
510
+ <span
511
+ className="checkbox__label-text"
512
+ dangerouslySetInnerHTML={{
513
+ __html: checkbox.text
514
+ }}
515
+ />
516
+ </label>
517
+ </div>
518
+ ))}
519
+ </div>
520
+ </div>
521
+ </div>
522
+ </div>
523
+ </div>
524
+ </div>
525
+
526
+ <div className="booking__navigator">
527
+ {settings.skipRouter ? (
528
+ <button type="button" title={translations.STEPS.PREVIOUS} onClick={() => goPrevious()} className="cta cta--secondary">
529
+ {translations.STEPS.PREVIOUS}
530
+ </button>
531
+ ) : (
532
+ <Link
533
+ to={`${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.travellers.pathSuffix}?${bookingQueryString}`}
534
+ title={translations.STEPS.PREVIOUS}
535
+ className="cta cta--secondary">
536
+ {translations.STEPS.PREVIOUS}
537
+ </Link>
538
+ )}
539
+ {settings.allowOption && (
540
+ <button
541
+ title={translations.STEPS.SUBMIT_OPTION}
542
+ className={buildClassName(['cta', !userValidated && 'cta--disabled'])}
543
+ disabled={!userValidated}
544
+ name="option">
545
+ {translations.STEPS.SUBMIT_OPTION}
546
+ </button>
547
+ )}
548
+ <button
549
+ title={settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING}
550
+ className={buildClassName(['cta', !userValidated && 'cta--disabled'])}
551
+ disabled={!userValidated}
552
+ name="default">
553
+ {settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING}
554
+ </button>
555
+ </div>
556
+ </form>
557
+ )}
558
+ </>
559
+ );
560
+ };
561
+
562
+ export default Summary;