@qite/tide-booking-component 1.4.94 → 1.4.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +24 -24
  2. package/build/build-cjs/index.js +29612 -48689
  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 +19 -16
  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 +2 -1
  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 +2 -11
  21. package/build/build-cjs/src/booking-product/utils/price.d.ts +1 -10
  22. package/build/build-cjs/src/booking-wizard/api-settings-slice.d.ts +2 -3
  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 +7 -26
  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 +43 -102
  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 +1 -8
  38. package/build/build-cjs/src/booking-wizard/features/booking/selectors.d.ts +479 -644
  39. package/build/build-cjs/src/booking-wizard/features/confirmation/confirmation.d.ts +2 -1
  40. package/build/build-cjs/src/booking-wizard/features/error/error.d.ts +2 -1
  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 +2 -9
  45. package/build/build-cjs/src/booking-wizard/features/flight-options/index.d.ts +2 -1
  46. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-api.d.ts +1 -6
  47. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-slice.d.ts +10 -15
  48. package/build/build-cjs/src/booking-wizard/features/price-details/selectors.d.ts +287 -302
  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 +2 -1
  59. package/build/build-cjs/src/booking-wizard/features/room-options/index.d.ts +2 -1
  60. package/build/build-cjs/src/booking-wizard/features/room-options/room-utils.d.ts +6 -19
  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 +2 -4
  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 +2 -1
  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 +2 -1
  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 +1 -8
  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 +2 -1
  82. package/build/build-cjs/src/booking-wizard/store.d.ts +22 -40
  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 +20 -23
  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 +1 -6
  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 +1 -17
  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 +58 -110
  114. package/build/build-cjs/src/qsm/store/qsm-store.d.ts +7 -20
  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 +2 -1
  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 +2 -1
  140. package/build/build-cjs/src/search-results/features/flights/flight-search-results-self-contained.d.ts +2 -1
  141. package/build/build-cjs/src/search-results/features/hotels/hotel-flight-search-results-self-contained.d.ts +2 -1
  142. package/build/build-cjs/src/search-results/features/hotels/hotel-search-results-self-contained.d.ts +2 -1
  143. package/build/build-cjs/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.d.ts +2 -1
  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 +26 -63
  146. package/build/build-cjs/src/search-results/store/search-results-store.d.ts +7 -20
  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 +1 -6
  149. package/build/build-cjs/src/search-results/utils/search-results-utils.d.ts +2 -10
  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 +396 -395
  158. package/build/build-esm/index.js +29591 -48445
  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 +19 -16
  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 +2 -1
  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 +2 -11
  177. package/build/build-esm/src/booking-product/utils/price.d.ts +1 -10
  178. package/build/build-esm/src/booking-wizard/api-settings-slice.d.ts +2 -3
  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 +7 -26
  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 +43 -102
  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 +1 -8
  194. package/build/build-esm/src/booking-wizard/features/booking/selectors.d.ts +479 -644
  195. package/build/build-esm/src/booking-wizard/features/confirmation/confirmation.d.ts +2 -1
  196. package/build/build-esm/src/booking-wizard/features/error/error.d.ts +2 -1
  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 +2 -9
  201. package/build/build-esm/src/booking-wizard/features/flight-options/index.d.ts +2 -1
  202. package/build/build-esm/src/booking-wizard/features/price-details/price-details-api.d.ts +1 -6
  203. package/build/build-esm/src/booking-wizard/features/price-details/price-details-slice.d.ts +10 -15
  204. package/build/build-esm/src/booking-wizard/features/price-details/selectors.d.ts +287 -302
  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 +2 -1
  215. package/build/build-esm/src/booking-wizard/features/room-options/index.d.ts +2 -1
  216. package/build/build-esm/src/booking-wizard/features/room-options/room-utils.d.ts +6 -19
  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 +2 -4
  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 +2 -1
  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 +2 -1
  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 +1 -8
  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 +2 -1
  238. package/build/build-esm/src/booking-wizard/store.d.ts +22 -40
  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 +20 -23
  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 +1 -6
  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 +1 -17
  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 +58 -110
  270. package/build/build-esm/src/qsm/store/qsm-store.d.ts +7 -20
  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 +2 -1
  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 +2 -1
  296. package/build/build-esm/src/search-results/features/flights/flight-search-results-self-contained.d.ts +2 -1
  297. package/build/build-esm/src/search-results/features/hotels/hotel-flight-search-results-self-contained.d.ts +2 -1
  298. package/build/build-esm/src/search-results/features/hotels/hotel-search-results-self-contained.d.ts +2 -1
  299. package/build/build-esm/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.d.ts +2 -1
  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 +26 -63
  302. package/build/build-esm/src/search-results/store/search-results-store.d.ts +7 -20
  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 +1 -6
  305. package/build/build-esm/src/search-results/utils/search-results-utils.d.ts +2 -10
  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 +396 -395
  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 +332 -330
  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,503 +1,503 @@
1
- import React, { useContext, useEffect, useState } from 'react';
2
- import Icon from '../icon';
3
- import { ExtendedFlightSearchResponseItem } from '../../../search-results/types';
4
- import { useFlightSearch } from '../../../search-results/components/flight/flight-search-context';
5
- import { useDispatch, useSelector } from 'react-redux';
6
- import { setSelectedFlightDetails } from '../../../search-results/store/search-results-slice';
7
- import { SearchResultsRootState } from '../../../search-results/store/search-results-store';
8
- import Spinner from '../../../search-results/components/spinner/spinner';
9
- import SearchResultsConfigurationContext from '../../../search-results/search-results-configuration-context';
10
- import { durationTicksInHoursString, getTranslations, timeFromDateTime } from '../../utils/localization-util';
11
- import { getArrivalSegment, getDepartureSegment, getNumberOfStopsLabel } from '../../../search-results/utils/flight-utils';
12
- import { first, isEmpty } from 'lodash';
13
-
14
- type FlightsFlyInProps = {
15
- isOpen: boolean;
16
- setIsOpen: (open: boolean) => void;
17
- };
18
-
19
- const FlightsFlyIn: React.FC<FlightsFlyInProps> = ({ isOpen, setIsOpen }) => {
20
- const context = useContext(SearchResultsConfigurationContext);
21
- const language = context?.languageCode ?? 'en-GB';
22
- const translations = getTranslations(language);
23
-
24
- const dispatch = useDispatch();
25
- const { flightSearchDetailsLoading, flightDetailsSearchResults, onCancelSearch, numberOfTravellers } = useFlightSearch();
26
- const { selectedFlight } = useSelector((state: SearchResultsRootState) => state.searchResults);
27
-
28
- const [flights, setFlights] = useState<ExtendedFlightSearchResponseItem[]>([]);
29
- const [flight, setFlight] = useState<ExtendedFlightSearchResponseItem | undefined>(undefined);
30
-
31
- const [uniqueOutwardFlights, setUniqueOutwardFlights] = useState<ExtendedFlightSearchResponseItem[]>([]);
32
- const [selectedOutwardFareCode, setSelectedOutwardFareCode] = useState<string | null>(null);
33
- const [uniqueReturnFlights, setUniqueReturnFlights] = useState<ExtendedFlightSearchResponseItem[]>([]);
34
- const [selectedReturnFareCode, setSelectedReturnFareCode] = useState<string | null>(null);
35
-
36
- useEffect(() => {
37
- if (flightDetailsSearchResults.length > 0 && selectedFlight) {
38
- const routeFlights = flightDetailsSearchResults.filter((r) => r.flightRouteId === selectedFlight.flightRouteId);
39
-
40
- setFlights(routeFlights);
41
- setFlight(first(routeFlights));
42
-
43
- // Deduplicate by outward fareCode
44
- const uniqueMap = new Map<string, ExtendedFlightSearchResponseItem>();
45
-
46
- routeFlights.forEach((flight) => {
47
- const fareCode = flight.outward.segments?.[0]?.metaData?.fareCode;
48
-
49
- if (fareCode && !uniqueMap.has(fareCode)) {
50
- uniqueMap.set(fareCode, flight);
51
- }
52
- });
53
-
54
- const values = Array.from(uniqueMap.values());
55
- setUniqueOutwardFlights(values);
56
- const fareCode = first(values)?.outward.segments?.[0]?.metaData?.fareCode;
57
- setSelectedOutwardFareCode(fareCode ?? null);
58
- }
59
- }, [flightDetailsSearchResults, flightSearchDetailsLoading]);
60
-
61
- useEffect(() => {
62
- if (!selectedOutwardFareCode) {
63
- setUniqueReturnFlights([]);
64
- setSelectedReturnFareCode(null);
65
- return;
66
- }
67
-
68
- // Filter combinations that match selected outward fare
69
- const matchingCombinations = flights.filter((flight) => flight.outward.segments?.[0]?.metaData?.fareCode === selectedOutwardFareCode);
70
- const returnMap = new Map<string, ExtendedFlightSearchResponseItem>();
71
-
72
- // Deduplicate return flights by return fareCode
73
- matchingCombinations.forEach((flight) => {
74
- const returnFareCode = flight.return.segments?.[0]?.metaData?.fareCode;
75
-
76
- if (returnFareCode && !returnMap.has(returnFareCode)) {
77
- returnMap.set(returnFareCode, flight);
78
- }
79
- });
80
-
81
- const returns = Array.from(returnMap.values());
82
-
83
- setUniqueReturnFlights(returns);
84
-
85
- // keep current return if still valid based on the selected outward, otherwise select the first available
86
- const stillValid = returns.some((r) => r.return.segments?.[0]?.metaData?.fareCode === selectedReturnFareCode);
87
-
88
- if (!stillValid) {
89
- const defaultFareCode = returns[0]?.return.segments?.[0]?.metaData?.fareCode ?? null;
90
- setSelectedReturnFareCode(defaultFareCode);
91
- }
92
- }, [selectedOutwardFareCode, flights]);
93
-
94
- const selectedCombinationFlight = React.useMemo(() => {
95
- if (!selectedOutwardFareCode || !selectedReturnFareCode) return undefined;
96
-
97
- return flights.find(
98
- (flight) =>
99
- flight.outward.segments?.[0]?.metaData?.fareCode === selectedOutwardFareCode &&
100
- flight.return.segments?.[0]?.metaData?.fareCode === selectedReturnFareCode
101
- );
102
- }, [flights, selectedOutwardFareCode, selectedReturnFareCode]);
103
-
104
- useEffect(() => {
105
- if (!selectedCombinationFlight) return;
106
-
107
- dispatch(setSelectedFlightDetails(selectedCombinationFlight));
108
- }, [selectedCombinationFlight, dispatch]);
109
-
110
- const getOutwardPriceDiff = (outwardFareCode: string) => {
111
- if (!selectedReturnFareCode || !selectedCombinationFlight) return 0;
112
-
113
- const combo =
114
- flights.find(
115
- (flight) =>
116
- flight.outward.segments?.[0]?.metaData?.fareCode === outwardFareCode && flight.return.segments?.[0]?.metaData?.fareCode === selectedReturnFareCode
117
- ) ??
118
- // it means that outward flight cannot be paired with the selected return fallback to first combo with that outward fare
119
- flights.find((flight) => flight.outward.segments?.[0]?.metaData?.fareCode === outwardFareCode);
120
-
121
- if (!combo) return 0;
122
-
123
- return Math.round(combo.price - selectedCombinationFlight.price);
124
- };
125
-
126
- const getReturnPriceDiff = (returnFareCode: string) => {
127
- if (!selectedOutwardFareCode || !selectedCombinationFlight) return 0;
128
-
129
- const combo =
130
- flights.find(
131
- (flight) =>
132
- flight.outward.segments?.[0]?.metaData?.fareCode === selectedOutwardFareCode && flight.return.segments?.[0]?.metaData?.fareCode === returnFareCode
133
- ) ??
134
- // it means that return flight cannot be paired with the selected outward fallback to first combo with that return fare
135
- flights.find((flight) => flight.return.segments?.[0]?.metaData?.fareCode === returnFareCode);
136
-
137
- if (!combo) return 0;
138
-
139
- return Math.round(combo.price - selectedCombinationFlight.price);
140
- };
141
-
142
- // TODO: go to booking page?
143
- const handleConfirm = () => {
144
- if (isOpen) {
145
- onCancelSearch();
146
- setIsOpen(false);
147
- }
148
- };
149
-
150
- return (
151
- <>
152
- <div className="flyin__content">
153
- {flightSearchDetailsLoading || isEmpty(flights) ? (
154
- <Spinner />
155
- ) : (
156
- flight && (
157
- <div className="flyin__content-text-row">
158
- <div className="flyin__content-text-icon-row">
159
- <img
160
- src={`https://media.tidesoftware.be/media/shared/Airlines/${getDepartureSegment(flight.outward)?.marketingAirlineCode}.png?height=256`}
161
- alt="airline-logo"
162
- className="logo"
163
- aria-hidden="true"
164
- />
165
- <div className="flyin__content-text-col">
166
- <span className="flyin__content-text-title-row">
167
- <strong>{translations.SRP.DEPARTURE}</strong> {getDepartureSegment(flight?.outward)?.departureAirportCode} -{' '}
168
- {getArrivalSegment(flight?.outward)?.arrivalAirportCode}
169
- </span>
170
- <span className="flyin__content-text">
171
- {timeFromDateTime(getDepartureSegment(flight?.outward)?.departureDateTime)} -{' '}
172
- {timeFromDateTime(getArrivalSegment(flight?.outward)?.arrivalDateTime)} ({durationTicksInHoursString(flight.outward.durationInTicks)},{' '}
173
- {getNumberOfStopsLabel(flight.outward, translations.SRP.DIRECT, translations.SRP.STOPS, translations.SRP.STOP)}), {numberOfTravellers}{' '}
174
- travellers
175
- </span>
176
- </div>
177
- </div>
178
-
179
- <div className="flyin__content-arrow-row">
180
- <div className="flyin__content-arrow is-disabled" aria-disabled="true">
181
- <Icon name="ui-arrow" className="flyin__content-arrow-icon" width={16} height={16} aria-hidden="true" />
182
- </div>
183
- <div className="flyin__content-arrow">
184
- <Icon name="ui-arrow" className="flyin__content-arrow-icon flyin__content-arrow-icon--forward" width={16} height={16} aria-hidden="true" />
185
- </div>
186
- </div>
187
- </div>
188
- )
189
- )}
190
- </div>
191
- {!flightSearchDetailsLoading && flight && (
192
- <>
193
- <div className="flyin__content-cards-wrapper">
194
- <div className="flyin__content-cards">
195
- {uniqueOutwardFlights.map((flightOption, index) => {
196
- const firstSegment = first(flightOption.outward.segments);
197
- if (!firstSegment) return null;
198
- const diff = getOutwardPriceDiff(firstSegment.metaData.fareCode);
199
-
200
- return (
201
- <div
202
- key={`outward-flight-option-${index}`}
203
- className={`flyin__content-card flyin__content-card--flight ${
204
- selectedOutwardFareCode === firstSegment.metaData.fareCode ? 'flyin__content-card--selected' : ''
205
- }`}>
206
- <div className="flyin__content-card-top">
207
- <span className="flyin__content-card-top-tag">{firstSegment.metaData.fareMarketingName}</span>
208
- {diff !== null && diff != 0 && (
209
- <span
210
- className={`flyin__content-card-top-price ${
211
- diff > 0 ? 'flyin__content-card-top-price--increase' : diff < 0 ? 'flyin__content-card-top-price--decrease' : ''
212
- }`}>
213
- {diff > 0 ? `+€${diff}` : `-€${Math.abs(diff)}`}
214
- </span>
215
- )}
216
- </div>
217
-
218
- <div className="flyin__content-card-middle">
219
- <div className="flyin__content-card-middle-rows">
220
- <div className="flyin__content-card-middle-row">
221
- <span className="flyin__content-card-middle-row-left">Number of travellers</span>
222
- <span className="flyin__content-card-middle-row-right">{numberOfTravellers}</span>
223
- </div>
224
-
225
- <div className="flyin__content-card-middle-row">
226
- <span className="flyin__content-card-middle-row-left">Travel class</span>
227
- <span className="flyin__content-card-middle-row-right">{firstSegment.metaData.fareMarketingName}</span>
228
- </div>
229
-
230
- <div className="flyin__content-card-middle-row">
231
- <span className="flyin__content-card-middle-row-left">Booking class</span>
232
- <span className="flyin__content-card-middle-row-right">{firstSegment.bookingClassCode}</span>
233
- </div>
234
-
235
- <div className="flyin__content-card-middle-row">
236
- <span className="flyin__content-card-middle-row-left">Fare basis</span>
237
- <span className="flyin__content-card-middle-row-right">{firstSegment.metaData.fareCode}</span>
238
- </div>
239
-
240
- <div className="flyin__content-data">
241
- {firstSegment.metaData.luggageCarryOn && (
242
- <div className="flyin__content-data__item">
243
- <div className="flyin__content-data__item-icon">
244
- <Icon name="ui-bag" width={20} aria-hidden="true" />
245
- </div>
246
- <div className="flyin__content-data__item-content">
247
- <div className="flyin__content-data__item-content-title">Carry-on luggage</div>
248
- <div className="flyin__content-data__item-content-description">{firstSegment.metaData.luggageCarryOn.text}</div>
249
- </div>
250
- </div>
251
- )}
252
-
253
- {firstSegment.metaData.luggageChecked && (
254
- <div className="flyin__content-data__item">
255
- <div className="flyin__content-data__item-icon">
256
- <Icon name="ui-suitcase" width={20} />
257
- </div>
258
- <div className="flyin__content-data__item-content">
259
- <div className="flyin__content-data__item-content-title">Checked luggage</div>
260
- <div className="flyin__content-data__item-content-description">{firstSegment.metaData.luggageChecked.text}</div>
261
- </div>
262
- </div>
263
- )}
264
-
265
- {firstSegment.metaData.seatSelection && (
266
- <div className="flyin__content-data__item">
267
- <div className="flyin__content-data__item-icon">
268
- <Icon name="ui-seat" width={20} />
269
- </div>
270
- <div className="flyin__content-data__item-content">
271
- <div className="flyin__content-data__item-content-title">Seat selection</div>
272
- <div className="flyin__content-data__item-content-description">{firstSegment.metaData.seatSelection.text}</div>
273
- </div>
274
- </div>
275
- )}
276
-
277
- {firstSegment.metaData.cancel && (
278
- <div className="flyin__content-data__item">
279
- <div className="flyin__content-data__item-icon">
280
- <Icon name="ui-refund" width={20} />
281
- </div>
282
- <div className="flyin__content-data__item-content">
283
- <div className="flyin__content-data__item-content-title">Refund</div>
284
- <div className="flyin__content-data__item-content-description">{firstSegment.metaData.cancel.text}</div>
285
- </div>
286
- </div>
287
- )}
288
-
289
- {firstSegment.metaData.other && (
290
- <div className="flyin__content-data__item">
291
- <div className="flyin__content-data__item-icon flyin__content-data__item-icon--other">
292
- <Icon name="ui-else" width={20} />
293
- </div>
294
- <div className="flyin__content-data__item-content">
295
- <div className="flyin__content-data__item-content-title">Other</div>
296
- <ul className="flyin__content-data__item-content-description flyin__content-data__item-content-description--list">
297
- {firstSegment.metaData.other.map((other, index) => (
298
- <li key={`other-${index}`}>{other.text}</li>
299
- ))}
300
- </ul>
301
- </div>
302
- </div>
303
- )}
304
- </div>
305
- </div>
306
- </div>
307
- <div
308
- className="flyin__content-card-button"
309
- onClick={() => {
310
- const fareCode = flightOption.outward.segments?.[0]?.metaData?.fareCode;
311
- setSelectedOutwardFareCode(fareCode ?? null);
312
- }}>
313
- <div className={`cta ${selectedOutwardFareCode === firstSegment.metaData.fareCode ? 'cta--selected' : ''}`}>
314
- {' '}
315
- {selectedOutwardFareCode === firstSegment.metaData.fareCode ? 'Selected' : 'Select'}
316
- </div>
317
- </div>
318
- </div>
319
- );
320
- })}
321
- </div>
322
- </div>
323
-
324
- <div className="flyin__content">
325
- <div className="flyin__content-text-row">
326
- <div className="flyin__content-text-icon-row">
327
- <img
328
- src={`https://media.tidesoftware.be/media/shared/Airlines/${getDepartureSegment(flight.return)?.marketingAirlineCode}.png?height=256`}
329
- alt="airline-logo"
330
- className="logo"
331
- aria-hidden="true"
332
- />
333
- <div className="flyin__content-text-col">
334
- <span className="flyin__content-text-title-row">
335
- <strong>{translations.SRP.RETURN}</strong> {getDepartureSegment(flight?.return)?.departureAirportCode} -{' '}
336
- {getArrivalSegment(flight?.return)?.arrivalAirportCode}
337
- </span>
338
- <span className="flyin__content-text">
339
- {timeFromDateTime(getDepartureSegment(flight?.return)?.departureDateTime)} -{' '}
340
- {timeFromDateTime(getArrivalSegment(flight?.return)?.arrivalDateTime)} ({durationTicksInHoursString(flight.return.durationInTicks)},{' '}
341
- {getNumberOfStopsLabel(flight.return, translations.SRP.DIRECT, translations.SRP.STOPS, translations.SRP.STOP)}), {numberOfTravellers}{' '}
342
- travellers
343
- </span>
344
- </div>
345
- </div>
346
-
347
- <div className="flyin__content-arrow-row">
348
- <div className="flyin__content-arrow is-disabled" aria-disabled="true">
349
- <Icon name="ui-arrow" className="flyin__content-arrow-icon" width={16} height={16} aria-hidden="true" />
350
- </div>
351
- <div className="flyin__content-arrow">
352
- <Icon name="ui-arrow" className="flyin__content-arrow-icon flyin__content-arrow-icon--forward" width={16} height={16} aria-hidden="true" />
353
- </div>
354
- </div>
355
- </div>
356
- </div>
357
-
358
- <div className="flyin__content-cards-wrapper">
359
- <div className="flyin__content-cards">
360
- {uniqueReturnFlights.map((flightOption, index) => {
361
- const firstSegment = first(flightOption.return.segments);
362
- if (!firstSegment) return null;
363
- const diff = getReturnPriceDiff(firstSegment.metaData.fareCode);
364
- return (
365
- <div
366
- key={`return-flight-option-${index}`}
367
- className={`flyin__content-card flyin__content-card--flight ${
368
- selectedReturnFareCode === firstSegment.metaData.fareCode ? 'flyin__content-card--selected' : ''
369
- }`}>
370
- <div className="flyin__content-card-top">
371
- <span className="flyin__content-card-top-tag">{firstSegment.metaData.fareMarketingName}</span>
372
- {diff !== null && diff != 0 && (
373
- <span
374
- className={`flyin__content-card-top-price ${
375
- diff > 0 ? 'flyin__content-card-top-price--increase' : diff < 0 ? 'flyin__content-card-top-price--decrease' : ''
376
- }`}>
377
- {diff > 0 ? `+€${diff}` : `-€${Math.abs(diff)}`}
378
- </span>
379
- )}
380
- </div>
381
-
382
- <div className="flyin__content-card-middle">
383
- <div className="flyin__content-card-middle-rows">
384
- <div className="flyin__content-card-middle-row">
385
- <span className="flyin__content-card-middle-row-left">Number of travellers</span>
386
- <span className="flyin__content-card-middle-row-right">{numberOfTravellers}</span>
387
- </div>
388
-
389
- <div className="flyin__content-card-middle-row">
390
- <span className="flyin__content-card-middle-row-left">Travel class</span>
391
- <span className="flyin__content-card-middle-row-right">{firstSegment.metaData.fareMarketingName}</span>
392
- </div>
393
-
394
- <div className="flyin__content-card-middle-row">
395
- <span className="flyin__content-card-middle-row-left">Booking class</span>
396
- <span className="flyin__content-card-middle-row-right">{firstSegment.bookingClassCode}</span>
397
- </div>
398
-
399
- <div className="flyin__content-card-middle-row">
400
- <span className="flyin__content-card-middle-row-left">Fare basis</span>
401
- <span className="flyin__content-card-middle-row-right">{firstSegment.metaData.fareCode}</span>
402
- </div>
403
-
404
- <div className="flyin__content-data">
405
- {firstSegment.metaData.luggageCarryOn && (
406
- <div className="flyin__content-data__item">
407
- <div className="flyin__content-data__item-icon">
408
- <Icon name="ui-bag" width={20} aria-hidden="true" />
409
- </div>
410
- <div className="flyin__content-data__item-content">
411
- <div className="flyin__content-data__item-content-title">Carry-on luggage</div>
412
- <div className="flyin__content-data__item-content-description">{firstSegment.metaData.luggageCarryOn.text}</div>
413
- </div>
414
- </div>
415
- )}
416
-
417
- {firstSegment.metaData.luggageChecked && (
418
- <div className="flyin__content-data__item">
419
- <div className="flyin__content-data__item-icon">
420
- <Icon name="ui-suitcase" width={20} />
421
- </div>
422
- <div className="flyin__content-data__item-content">
423
- <div className="flyin__content-data__item-content-title">Checked luggage</div>
424
- <div className="flyin__content-data__item-content-description">{firstSegment.metaData.luggageChecked.text}</div>
425
- </div>
426
- </div>
427
- )}
428
-
429
- {firstSegment.metaData.seatSelection && (
430
- <div className="flyin__content-data__item">
431
- <div className="flyin__content-data__item-icon">
432
- <Icon name="ui-seat" width={20} />
433
- </div>
434
- <div className="flyin__content-data__item-content">
435
- <div className="flyin__content-data__item-content-title">Seat selection</div>
436
- <div className="flyin__content-data__item-content-description">{firstSegment.metaData.seatSelection.text}</div>
437
- </div>
438
- </div>
439
- )}
440
-
441
- {firstSegment.metaData.cancel && (
442
- <div className="flyin__content-data__item">
443
- <div className="flyin__content-data__item-icon">
444
- <Icon name="ui-refund" width={20} />
445
- </div>
446
- <div className="flyin__content-data__item-content">
447
- <div className="flyin__content-data__item-content-title">Refund</div>
448
- <div className="flyin__content-data__item-content-description">{firstSegment.metaData.cancel.text}</div>
449
- </div>
450
- </div>
451
- )}
452
-
453
- {firstSegment.metaData.other && (
454
- <div className="flyin__content-data__item">
455
- <div className="flyin__content-data__item-icon flyin__content-data__item-icon--other">
456
- <Icon name="ui-else" width={20} />
457
- </div>
458
- <div className="flyin__content-data__item-content">
459
- <div className="flyin__content-data__item-content-title">Other</div>
460
- <ul className="flyin__content-data__item-content-description flyin__content-data__item-content-description--list">
461
- {firstSegment.metaData.other.map((other, index) => (
462
- <li key={`other-${index}`}>{other.text}</li>
463
- ))}
464
- </ul>
465
- </div>
466
- </div>
467
- )}
468
- </div>
469
- </div>
470
- </div>
471
- <div
472
- className="flyin__content-card-button"
473
- onClick={() => {
474
- const fareCode = flightOption.return.segments?.[0]?.metaData?.fareCode;
475
- setSelectedReturnFareCode(fareCode ?? null);
476
- }}>
477
- <div className={`cta ${selectedReturnFareCode === firstSegment.metaData.fareCode ? 'cta--selected' : ''}`}>
478
- {' '}
479
- {selectedReturnFareCode === firstSegment.metaData.fareCode ? 'Selected' : 'Select'}
480
- </div>
481
- </div>
482
- </div>
483
- );
484
- })}
485
- </div>
486
- </div>
487
- </>
488
- )}
489
- {!flightSearchDetailsLoading && (
490
- <div className="flyin__footer">
491
- <div className="flyin__footer__price">Total price: €{selectedCombinationFlight?.price?.toFixed(2)}</div>
492
- <div className="flyin__button-wrapper">
493
- <button className="cta cta--select" onClick={handleConfirm}>
494
- {translations.PRODUCT.BOOK_NOW}
495
- </button>
496
- </div>
497
- </div>
498
- )}
499
- </>
500
- );
501
- };
502
-
503
- export default FlightsFlyIn;
1
+ import React, { useContext, useEffect, useState } from 'react';
2
+ import Icon from '../icon';
3
+ import { ExtendedFlightSearchResponseItem } from '../../../search-results/types';
4
+ import { useFlightSearch } from '../../../search-results/components/flight/flight-search-context';
5
+ import { useDispatch, useSelector } from 'react-redux';
6
+ import { setSelectedFlightDetails } from '../../../search-results/store/search-results-slice';
7
+ import { SearchResultsRootState } from '../../../search-results/store/search-results-store';
8
+ import Spinner from '../../../search-results/components/spinner/spinner';
9
+ import SearchResultsConfigurationContext from '../../../search-results/search-results-configuration-context';
10
+ import { durationTicksInHoursString, getTranslations, timeFromDateTime } from '../../utils/localization-util';
11
+ import { getArrivalSegment, getDepartureSegment, getNumberOfStopsLabel } from '../../../search-results/utils/flight-utils';
12
+ import { first, isEmpty } from 'lodash';
13
+
14
+ type FlightsFlyInProps = {
15
+ isOpen: boolean;
16
+ setIsOpen: (open: boolean) => void;
17
+ };
18
+
19
+ const FlightsFlyIn: React.FC<FlightsFlyInProps> = ({ isOpen, setIsOpen }) => {
20
+ const context = useContext(SearchResultsConfigurationContext);
21
+ const language = context?.languageCode ?? 'en-GB';
22
+ const translations = getTranslations(language);
23
+
24
+ const dispatch = useDispatch();
25
+ const { flightSearchDetailsLoading, flightDetailsSearchResults, onCancelSearch, numberOfTravellers } = useFlightSearch();
26
+ const { selectedFlight } = useSelector((state: SearchResultsRootState) => state.searchResults);
27
+
28
+ const [flights, setFlights] = useState<ExtendedFlightSearchResponseItem[]>([]);
29
+ const [flight, setFlight] = useState<ExtendedFlightSearchResponseItem | undefined>(undefined);
30
+
31
+ const [uniqueOutwardFlights, setUniqueOutwardFlights] = useState<ExtendedFlightSearchResponseItem[]>([]);
32
+ const [selectedOutwardFareCode, setSelectedOutwardFareCode] = useState<string | null>(null);
33
+ const [uniqueReturnFlights, setUniqueReturnFlights] = useState<ExtendedFlightSearchResponseItem[]>([]);
34
+ const [selectedReturnFareCode, setSelectedReturnFareCode] = useState<string | null>(null);
35
+
36
+ useEffect(() => {
37
+ if (flightDetailsSearchResults.length > 0 && selectedFlight) {
38
+ const routeFlights = flightDetailsSearchResults.filter((r) => r.flightRouteId === selectedFlight.flightRouteId);
39
+
40
+ setFlights(routeFlights);
41
+ setFlight(first(routeFlights));
42
+
43
+ // Deduplicate by outward fareCode
44
+ const uniqueMap = new Map<string, ExtendedFlightSearchResponseItem>();
45
+
46
+ routeFlights.forEach((flight) => {
47
+ const fareCode = flight.outward.segments?.[0]?.metaData?.fareCode;
48
+
49
+ if (fareCode && !uniqueMap.has(fareCode)) {
50
+ uniqueMap.set(fareCode, flight);
51
+ }
52
+ });
53
+
54
+ const values = Array.from(uniqueMap.values());
55
+ setUniqueOutwardFlights(values);
56
+ const fareCode = first(values)?.outward.segments?.[0]?.metaData?.fareCode;
57
+ setSelectedOutwardFareCode(fareCode ?? null);
58
+ }
59
+ }, [flightDetailsSearchResults, flightSearchDetailsLoading]);
60
+
61
+ useEffect(() => {
62
+ if (!selectedOutwardFareCode) {
63
+ setUniqueReturnFlights([]);
64
+ setSelectedReturnFareCode(null);
65
+ return;
66
+ }
67
+
68
+ // Filter combinations that match selected outward fare
69
+ const matchingCombinations = flights.filter((flight) => flight.outward.segments?.[0]?.metaData?.fareCode === selectedOutwardFareCode);
70
+ const returnMap = new Map<string, ExtendedFlightSearchResponseItem>();
71
+
72
+ // Deduplicate return flights by return fareCode
73
+ matchingCombinations.forEach((flight) => {
74
+ const returnFareCode = flight.return.segments?.[0]?.metaData?.fareCode;
75
+
76
+ if (returnFareCode && !returnMap.has(returnFareCode)) {
77
+ returnMap.set(returnFareCode, flight);
78
+ }
79
+ });
80
+
81
+ const returns = Array.from(returnMap.values());
82
+
83
+ setUniqueReturnFlights(returns);
84
+
85
+ // keep current return if still valid based on the selected outward, otherwise select the first available
86
+ const stillValid = returns.some((r) => r.return.segments?.[0]?.metaData?.fareCode === selectedReturnFareCode);
87
+
88
+ if (!stillValid) {
89
+ const defaultFareCode = returns[0]?.return.segments?.[0]?.metaData?.fareCode ?? null;
90
+ setSelectedReturnFareCode(defaultFareCode);
91
+ }
92
+ }, [selectedOutwardFareCode, flights]);
93
+
94
+ const selectedCombinationFlight = React.useMemo(() => {
95
+ if (!selectedOutwardFareCode || !selectedReturnFareCode) return undefined;
96
+
97
+ return flights.find(
98
+ (flight) =>
99
+ flight.outward.segments?.[0]?.metaData?.fareCode === selectedOutwardFareCode &&
100
+ flight.return.segments?.[0]?.metaData?.fareCode === selectedReturnFareCode
101
+ );
102
+ }, [flights, selectedOutwardFareCode, selectedReturnFareCode]);
103
+
104
+ useEffect(() => {
105
+ if (!selectedCombinationFlight) return;
106
+
107
+ dispatch(setSelectedFlightDetails(selectedCombinationFlight));
108
+ }, [selectedCombinationFlight, dispatch]);
109
+
110
+ const getOutwardPriceDiff = (outwardFareCode: string) => {
111
+ if (!selectedReturnFareCode || !selectedCombinationFlight) return 0;
112
+
113
+ const combo =
114
+ flights.find(
115
+ (flight) =>
116
+ flight.outward.segments?.[0]?.metaData?.fareCode === outwardFareCode && flight.return.segments?.[0]?.metaData?.fareCode === selectedReturnFareCode
117
+ ) ??
118
+ // it means that outward flight cannot be paired with the selected return fallback to first combo with that outward fare
119
+ flights.find((flight) => flight.outward.segments?.[0]?.metaData?.fareCode === outwardFareCode);
120
+
121
+ if (!combo) return 0;
122
+
123
+ return Math.round(combo.price - selectedCombinationFlight.price);
124
+ };
125
+
126
+ const getReturnPriceDiff = (returnFareCode: string) => {
127
+ if (!selectedOutwardFareCode || !selectedCombinationFlight) return 0;
128
+
129
+ const combo =
130
+ flights.find(
131
+ (flight) =>
132
+ flight.outward.segments?.[0]?.metaData?.fareCode === selectedOutwardFareCode && flight.return.segments?.[0]?.metaData?.fareCode === returnFareCode
133
+ ) ??
134
+ // it means that return flight cannot be paired with the selected outward fallback to first combo with that return fare
135
+ flights.find((flight) => flight.return.segments?.[0]?.metaData?.fareCode === returnFareCode);
136
+
137
+ if (!combo) return 0;
138
+
139
+ return Math.round(combo.price - selectedCombinationFlight.price);
140
+ };
141
+
142
+ // TODO: go to booking page?
143
+ const handleConfirm = () => {
144
+ if (isOpen) {
145
+ onCancelSearch();
146
+ setIsOpen(false);
147
+ }
148
+ };
149
+
150
+ return (
151
+ <>
152
+ <div className="flyin__content">
153
+ {flightSearchDetailsLoading || isEmpty(flights) ? (
154
+ <Spinner />
155
+ ) : (
156
+ flight && (
157
+ <div className="flyin__content-text-row">
158
+ <div className="flyin__content-text-icon-row">
159
+ <img
160
+ src={`https://media.tidesoftware.be/media/shared/Airlines/${getDepartureSegment(flight.outward)?.marketingAirlineCode}.png?height=256`}
161
+ alt="airline-logo"
162
+ className="logo"
163
+ aria-hidden="true"
164
+ />
165
+ <div className="flyin__content-text-col">
166
+ <span className="flyin__content-text-title-row">
167
+ <strong>{translations.SRP.DEPARTURE}</strong> {getDepartureSegment(flight?.outward)?.departureAirportCode} -{' '}
168
+ {getArrivalSegment(flight?.outward)?.arrivalAirportCode}
169
+ </span>
170
+ <span className="flyin__content-text">
171
+ {timeFromDateTime(getDepartureSegment(flight?.outward)?.departureDateTime)} -{' '}
172
+ {timeFromDateTime(getArrivalSegment(flight?.outward)?.arrivalDateTime)} ({durationTicksInHoursString(flight.outward.durationInTicks)},{' '}
173
+ {getNumberOfStopsLabel(flight.outward, translations.SRP.DIRECT, translations.SRP.STOPS, translations.SRP.STOP)}), {numberOfTravellers}{' '}
174
+ travellers
175
+ </span>
176
+ </div>
177
+ </div>
178
+
179
+ <div className="flyin__content-arrow-row">
180
+ <div className="flyin__content-arrow is-disabled" aria-disabled="true">
181
+ <Icon name="ui-arrow" className="flyin__content-arrow-icon" width={16} height={16} aria-hidden="true" />
182
+ </div>
183
+ <div className="flyin__content-arrow">
184
+ <Icon name="ui-arrow" className="flyin__content-arrow-icon flyin__content-arrow-icon--forward" width={16} height={16} aria-hidden="true" />
185
+ </div>
186
+ </div>
187
+ </div>
188
+ )
189
+ )}
190
+ </div>
191
+ {!flightSearchDetailsLoading && flight && (
192
+ <>
193
+ <div className="flyin__content-cards-wrapper">
194
+ <div className="flyin__content-cards">
195
+ {uniqueOutwardFlights.map((flightOption, index) => {
196
+ const firstSegment = first(flightOption.outward.segments);
197
+ if (!firstSegment) return null;
198
+ const diff = getOutwardPriceDiff(firstSegment.metaData.fareCode);
199
+
200
+ return (
201
+ <div
202
+ key={`outward-flight-option-${index}`}
203
+ className={`flyin__content-card flyin__content-card--flight ${
204
+ selectedOutwardFareCode === firstSegment.metaData.fareCode ? 'flyin__content-card--selected' : ''
205
+ }`}>
206
+ <div className="flyin__content-card-top">
207
+ <span className="flyin__content-card-top-tag">{firstSegment.metaData.fareMarketingName}</span>
208
+ {diff !== null && diff != 0 && (
209
+ <span
210
+ className={`flyin__content-card-top-price ${
211
+ diff > 0 ? 'flyin__content-card-top-price--increase' : diff < 0 ? 'flyin__content-card-top-price--decrease' : ''
212
+ }`}>
213
+ {diff > 0 ? `+€${diff}` : `-€${Math.abs(diff)}`}
214
+ </span>
215
+ )}
216
+ </div>
217
+
218
+ <div className="flyin__content-card-middle">
219
+ <div className="flyin__content-card-middle-rows">
220
+ <div className="flyin__content-card-middle-row">
221
+ <span className="flyin__content-card-middle-row-left">Number of travellers</span>
222
+ <span className="flyin__content-card-middle-row-right">{numberOfTravellers}</span>
223
+ </div>
224
+
225
+ <div className="flyin__content-card-middle-row">
226
+ <span className="flyin__content-card-middle-row-left">Travel class</span>
227
+ <span className="flyin__content-card-middle-row-right">{firstSegment.metaData.fareMarketingName}</span>
228
+ </div>
229
+
230
+ <div className="flyin__content-card-middle-row">
231
+ <span className="flyin__content-card-middle-row-left">Booking class</span>
232
+ <span className="flyin__content-card-middle-row-right">{firstSegment.bookingClassCode}</span>
233
+ </div>
234
+
235
+ <div className="flyin__content-card-middle-row">
236
+ <span className="flyin__content-card-middle-row-left">Fare basis</span>
237
+ <span className="flyin__content-card-middle-row-right">{firstSegment.metaData.fareCode}</span>
238
+ </div>
239
+
240
+ <div className="flyin__content-data">
241
+ {firstSegment.metaData.luggageCarryOn && (
242
+ <div className="flyin__content-data__item">
243
+ <div className="flyin__content-data__item-icon">
244
+ <Icon name="ui-bag" width={20} aria-hidden="true" />
245
+ </div>
246
+ <div className="flyin__content-data__item-content">
247
+ <div className="flyin__content-data__item-content-title">Carry-on luggage</div>
248
+ <div className="flyin__content-data__item-content-description">{firstSegment.metaData.luggageCarryOn.text}</div>
249
+ </div>
250
+ </div>
251
+ )}
252
+
253
+ {firstSegment.metaData.luggageChecked && (
254
+ <div className="flyin__content-data__item">
255
+ <div className="flyin__content-data__item-icon">
256
+ <Icon name="ui-suitcase" width={20} />
257
+ </div>
258
+ <div className="flyin__content-data__item-content">
259
+ <div className="flyin__content-data__item-content-title">Checked luggage</div>
260
+ <div className="flyin__content-data__item-content-description">{firstSegment.metaData.luggageChecked.text}</div>
261
+ </div>
262
+ </div>
263
+ )}
264
+
265
+ {firstSegment.metaData.seatSelection && (
266
+ <div className="flyin__content-data__item">
267
+ <div className="flyin__content-data__item-icon">
268
+ <Icon name="ui-seat" width={20} />
269
+ </div>
270
+ <div className="flyin__content-data__item-content">
271
+ <div className="flyin__content-data__item-content-title">Seat selection</div>
272
+ <div className="flyin__content-data__item-content-description">{firstSegment.metaData.seatSelection.text}</div>
273
+ </div>
274
+ </div>
275
+ )}
276
+
277
+ {firstSegment.metaData.cancel && (
278
+ <div className="flyin__content-data__item">
279
+ <div className="flyin__content-data__item-icon">
280
+ <Icon name="ui-refund" width={20} />
281
+ </div>
282
+ <div className="flyin__content-data__item-content">
283
+ <div className="flyin__content-data__item-content-title">Refund</div>
284
+ <div className="flyin__content-data__item-content-description">{firstSegment.metaData.cancel.text}</div>
285
+ </div>
286
+ </div>
287
+ )}
288
+
289
+ {firstSegment.metaData.other && (
290
+ <div className="flyin__content-data__item">
291
+ <div className="flyin__content-data__item-icon flyin__content-data__item-icon--other">
292
+ <Icon name="ui-else" width={20} />
293
+ </div>
294
+ <div className="flyin__content-data__item-content">
295
+ <div className="flyin__content-data__item-content-title">Other</div>
296
+ <ul className="flyin__content-data__item-content-description flyin__content-data__item-content-description--list">
297
+ {firstSegment.metaData.other.map((other, index) => (
298
+ <li key={`other-${index}`}>{other.text}</li>
299
+ ))}
300
+ </ul>
301
+ </div>
302
+ </div>
303
+ )}
304
+ </div>
305
+ </div>
306
+ </div>
307
+ <div
308
+ className="flyin__content-card-button"
309
+ onClick={() => {
310
+ const fareCode = flightOption.outward.segments?.[0]?.metaData?.fareCode;
311
+ setSelectedOutwardFareCode(fareCode ?? null);
312
+ }}>
313
+ <div className={`cta ${selectedOutwardFareCode === firstSegment.metaData.fareCode ? 'cta--selected' : ''}`}>
314
+ {' '}
315
+ {selectedOutwardFareCode === firstSegment.metaData.fareCode ? 'Selected' : 'Select'}
316
+ </div>
317
+ </div>
318
+ </div>
319
+ );
320
+ })}
321
+ </div>
322
+ </div>
323
+
324
+ <div className="flyin__content">
325
+ <div className="flyin__content-text-row">
326
+ <div className="flyin__content-text-icon-row">
327
+ <img
328
+ src={`https://media.tidesoftware.be/media/shared/Airlines/${getDepartureSegment(flight.return)?.marketingAirlineCode}.png?height=256`}
329
+ alt="airline-logo"
330
+ className="logo"
331
+ aria-hidden="true"
332
+ />
333
+ <div className="flyin__content-text-col">
334
+ <span className="flyin__content-text-title-row">
335
+ <strong>{translations.SRP.RETURN}</strong> {getDepartureSegment(flight?.return)?.departureAirportCode} -{' '}
336
+ {getArrivalSegment(flight?.return)?.arrivalAirportCode}
337
+ </span>
338
+ <span className="flyin__content-text">
339
+ {timeFromDateTime(getDepartureSegment(flight?.return)?.departureDateTime)} -{' '}
340
+ {timeFromDateTime(getArrivalSegment(flight?.return)?.arrivalDateTime)} ({durationTicksInHoursString(flight.return.durationInTicks)},{' '}
341
+ {getNumberOfStopsLabel(flight.return, translations.SRP.DIRECT, translations.SRP.STOPS, translations.SRP.STOP)}), {numberOfTravellers}{' '}
342
+ travellers
343
+ </span>
344
+ </div>
345
+ </div>
346
+
347
+ <div className="flyin__content-arrow-row">
348
+ <div className="flyin__content-arrow is-disabled" aria-disabled="true">
349
+ <Icon name="ui-arrow" className="flyin__content-arrow-icon" width={16} height={16} aria-hidden="true" />
350
+ </div>
351
+ <div className="flyin__content-arrow">
352
+ <Icon name="ui-arrow" className="flyin__content-arrow-icon flyin__content-arrow-icon--forward" width={16} height={16} aria-hidden="true" />
353
+ </div>
354
+ </div>
355
+ </div>
356
+ </div>
357
+
358
+ <div className="flyin__content-cards-wrapper">
359
+ <div className="flyin__content-cards">
360
+ {uniqueReturnFlights.map((flightOption, index) => {
361
+ const firstSegment = first(flightOption.return.segments);
362
+ if (!firstSegment) return null;
363
+ const diff = getReturnPriceDiff(firstSegment.metaData.fareCode);
364
+ return (
365
+ <div
366
+ key={`return-flight-option-${index}`}
367
+ className={`flyin__content-card flyin__content-card--flight ${
368
+ selectedReturnFareCode === firstSegment.metaData.fareCode ? 'flyin__content-card--selected' : ''
369
+ }`}>
370
+ <div className="flyin__content-card-top">
371
+ <span className="flyin__content-card-top-tag">{firstSegment.metaData.fareMarketingName}</span>
372
+ {diff !== null && diff != 0 && (
373
+ <span
374
+ className={`flyin__content-card-top-price ${
375
+ diff > 0 ? 'flyin__content-card-top-price--increase' : diff < 0 ? 'flyin__content-card-top-price--decrease' : ''
376
+ }`}>
377
+ {diff > 0 ? `+€${diff}` : `-€${Math.abs(diff)}`}
378
+ </span>
379
+ )}
380
+ </div>
381
+
382
+ <div className="flyin__content-card-middle">
383
+ <div className="flyin__content-card-middle-rows">
384
+ <div className="flyin__content-card-middle-row">
385
+ <span className="flyin__content-card-middle-row-left">Number of travellers</span>
386
+ <span className="flyin__content-card-middle-row-right">{numberOfTravellers}</span>
387
+ </div>
388
+
389
+ <div className="flyin__content-card-middle-row">
390
+ <span className="flyin__content-card-middle-row-left">Travel class</span>
391
+ <span className="flyin__content-card-middle-row-right">{firstSegment.metaData.fareMarketingName}</span>
392
+ </div>
393
+
394
+ <div className="flyin__content-card-middle-row">
395
+ <span className="flyin__content-card-middle-row-left">Booking class</span>
396
+ <span className="flyin__content-card-middle-row-right">{firstSegment.bookingClassCode}</span>
397
+ </div>
398
+
399
+ <div className="flyin__content-card-middle-row">
400
+ <span className="flyin__content-card-middle-row-left">Fare basis</span>
401
+ <span className="flyin__content-card-middle-row-right">{firstSegment.metaData.fareCode}</span>
402
+ </div>
403
+
404
+ <div className="flyin__content-data">
405
+ {firstSegment.metaData.luggageCarryOn && (
406
+ <div className="flyin__content-data__item">
407
+ <div className="flyin__content-data__item-icon">
408
+ <Icon name="ui-bag" width={20} aria-hidden="true" />
409
+ </div>
410
+ <div className="flyin__content-data__item-content">
411
+ <div className="flyin__content-data__item-content-title">Carry-on luggage</div>
412
+ <div className="flyin__content-data__item-content-description">{firstSegment.metaData.luggageCarryOn.text}</div>
413
+ </div>
414
+ </div>
415
+ )}
416
+
417
+ {firstSegment.metaData.luggageChecked && (
418
+ <div className="flyin__content-data__item">
419
+ <div className="flyin__content-data__item-icon">
420
+ <Icon name="ui-suitcase" width={20} />
421
+ </div>
422
+ <div className="flyin__content-data__item-content">
423
+ <div className="flyin__content-data__item-content-title">Checked luggage</div>
424
+ <div className="flyin__content-data__item-content-description">{firstSegment.metaData.luggageChecked.text}</div>
425
+ </div>
426
+ </div>
427
+ )}
428
+
429
+ {firstSegment.metaData.seatSelection && (
430
+ <div className="flyin__content-data__item">
431
+ <div className="flyin__content-data__item-icon">
432
+ <Icon name="ui-seat" width={20} />
433
+ </div>
434
+ <div className="flyin__content-data__item-content">
435
+ <div className="flyin__content-data__item-content-title">Seat selection</div>
436
+ <div className="flyin__content-data__item-content-description">{firstSegment.metaData.seatSelection.text}</div>
437
+ </div>
438
+ </div>
439
+ )}
440
+
441
+ {firstSegment.metaData.cancel && (
442
+ <div className="flyin__content-data__item">
443
+ <div className="flyin__content-data__item-icon">
444
+ <Icon name="ui-refund" width={20} />
445
+ </div>
446
+ <div className="flyin__content-data__item-content">
447
+ <div className="flyin__content-data__item-content-title">Refund</div>
448
+ <div className="flyin__content-data__item-content-description">{firstSegment.metaData.cancel.text}</div>
449
+ </div>
450
+ </div>
451
+ )}
452
+
453
+ {firstSegment.metaData.other && (
454
+ <div className="flyin__content-data__item">
455
+ <div className="flyin__content-data__item-icon flyin__content-data__item-icon--other">
456
+ <Icon name="ui-else" width={20} />
457
+ </div>
458
+ <div className="flyin__content-data__item-content">
459
+ <div className="flyin__content-data__item-content-title">Other</div>
460
+ <ul className="flyin__content-data__item-content-description flyin__content-data__item-content-description--list">
461
+ {firstSegment.metaData.other.map((other, index) => (
462
+ <li key={`other-${index}`}>{other.text}</li>
463
+ ))}
464
+ </ul>
465
+ </div>
466
+ </div>
467
+ )}
468
+ </div>
469
+ </div>
470
+ </div>
471
+ <div
472
+ className="flyin__content-card-button"
473
+ onClick={() => {
474
+ const fareCode = flightOption.return.segments?.[0]?.metaData?.fareCode;
475
+ setSelectedReturnFareCode(fareCode ?? null);
476
+ }}>
477
+ <div className={`cta ${selectedReturnFareCode === firstSegment.metaData.fareCode ? 'cta--selected' : ''}`}>
478
+ {' '}
479
+ {selectedReturnFareCode === firstSegment.metaData.fareCode ? 'Selected' : 'Select'}
480
+ </div>
481
+ </div>
482
+ </div>
483
+ );
484
+ })}
485
+ </div>
486
+ </div>
487
+ </>
488
+ )}
489
+ {!flightSearchDetailsLoading && (
490
+ <div className="flyin__footer">
491
+ <div className="flyin__footer__price">Total price: €{selectedCombinationFlight?.price?.toFixed(2)}</div>
492
+ <div className="flyin__button-wrapper">
493
+ <button className="cta cta--select" onClick={handleConfirm}>
494
+ {translations.PRODUCT.BOOK_NOW}
495
+ </button>
496
+ </div>
497
+ </div>
498
+ )}
499
+ </>
500
+ );
501
+ };
502
+
503
+ export default FlightsFlyIn;