@qite/tide-booking-component 1.4.56 → 1.4.57

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 (324) hide show
  1. package/build/build-cjs/index.js +26819 -40345
  2. package/build/build-cjs/src/booking-product/components/age-select.d.ts +3 -3
  3. package/build/build-cjs/src/booking-product/components/amount-input.d.ts +5 -5
  4. package/build/build-cjs/src/booking-product/components/date-range-picker/calendar-day.d.ts +8 -8
  5. package/build/build-cjs/src/booking-product/components/date-range-picker/calendar.d.ts +14 -14
  6. package/build/build-cjs/src/booking-product/components/date-range-picker/index.d.ts +19 -16
  7. package/build/build-cjs/src/booking-product/components/dates.d.ts +8 -8
  8. package/build/build-cjs/src/booking-product/components/footer.d.ts +5 -5
  9. package/build/build-cjs/src/booking-product/components/header.d.ts +6 -6
  10. package/build/build-cjs/src/booking-product/components/icon.d.ts +5 -5
  11. package/build/build-cjs/src/booking-product/components/list-view.d.ts +2 -2
  12. package/build/build-cjs/src/booking-product/components/product.d.ts +4 -4
  13. package/build/build-cjs/src/booking-product/components/rating.d.ts +1 -1
  14. package/build/build-cjs/src/booking-product/components/rooms.d.ts +4 -4
  15. package/build/build-cjs/src/booking-product/constants.d.ts +1 -1
  16. package/build/build-cjs/src/booking-product/index.d.ts +4 -4
  17. package/build/build-cjs/src/booking-product/settings-context.d.ts +2 -1
  18. package/build/build-cjs/src/booking-product/types.d.ts +21 -21
  19. package/build/build-cjs/src/booking-product/utils/api.d.ts +2 -11
  20. package/build/build-cjs/src/booking-product/utils/price.d.ts +1 -10
  21. package/build/build-cjs/src/booking-wizard/api-settings-slice.d.ts +2 -3
  22. package/build/build-cjs/src/booking-wizard/components/icon.d.ts +5 -5
  23. package/build/build-cjs/src/booking-wizard/components/labeled-input.d.ts +13 -13
  24. package/build/build-cjs/src/booking-wizard/components/labeled-select.d.ts +16 -16
  25. package/build/build-cjs/src/booking-wizard/components/message.d.ts +4 -4
  26. package/build/build-cjs/src/booking-wizard/components/multi-range-filter.d.ts +6 -6
  27. package/build/build-cjs/src/booking-wizard/components/phone-input.d.ts +11 -11
  28. package/build/build-cjs/src/booking-wizard/components/print-offer-button.d.ts +11 -11
  29. package/build/build-cjs/src/booking-wizard/components/product-card.d.ts +3 -3
  30. package/build/build-cjs/src/booking-wizard/components/step-indicator.d.ts +1 -1
  31. package/build/build-cjs/src/booking-wizard/components/step-route.d.ts +3 -3
  32. package/build/build-cjs/src/booking-wizard/features/booking/api.d.ts +6 -22
  33. package/build/build-cjs/src/booking-wizard/features/booking/booking-self-contained.d.ts +3 -3
  34. package/build/build-cjs/src/booking-wizard/features/booking/booking-slice.d.ts +38 -91
  35. package/build/build-cjs/src/booking-wizard/features/booking/booking.d.ts +3 -3
  36. package/build/build-cjs/src/booking-wizard/features/booking/constants.d.ts +1 -8
  37. package/build/build-cjs/src/booking-wizard/features/booking/selectors.d.ts +478 -640
  38. package/build/build-cjs/src/booking-wizard/features/confirmation/confirmation.d.ts +2 -1
  39. package/build/build-cjs/src/booking-wizard/features/error/error.d.ts +2 -1
  40. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-filter.d.ts +3 -3
  41. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-option-flight.d.ts +2 -2
  42. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-option.d.ts +4 -4
  43. package/build/build-cjs/src/booking-wizard/features/flight-options/flight-utils.d.ts +2 -9
  44. package/build/build-cjs/src/booking-wizard/features/flight-options/index.d.ts +2 -1
  45. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-api.d.ts +1 -6
  46. package/build/build-cjs/src/booking-wizard/features/price-details/price-details-slice.d.ts +214 -228
  47. package/build/build-cjs/src/booking-wizard/features/product-options/none-option.d.ts +3 -3
  48. package/build/build-cjs/src/booking-wizard/features/product-options/option-booking-airline-group.d.ts +2 -2
  49. package/build/build-cjs/src/booking-wizard/features/product-options/option-booking-group.d.ts +6 -6
  50. package/build/build-cjs/src/booking-wizard/features/product-options/option-item.d.ts +5 -5
  51. package/build/build-cjs/src/booking-wizard/features/product-options/option-pax-card.d.ts +4 -4
  52. package/build/build-cjs/src/booking-wizard/features/product-options/option-pax-group.d.ts +7 -7
  53. package/build/build-cjs/src/booking-wizard/features/product-options/option-room.d.ts +5 -5
  54. package/build/build-cjs/src/booking-wizard/features/product-options/option-unit-group.d.ts +7 -7
  55. package/build/build-cjs/src/booking-wizard/features/product-options/option-units-card.d.ts +3 -3
  56. package/build/build-cjs/src/booking-wizard/features/product-options/options-form.d.ts +2 -1
  57. package/build/build-cjs/src/booking-wizard/features/room-options/index.d.ts +2 -1
  58. package/build/build-cjs/src/booking-wizard/features/room-options/room-utils.d.ts +6 -19
  59. package/build/build-cjs/src/booking-wizard/features/room-options/room.d.ts +6 -6
  60. package/build/build-cjs/src/booking-wizard/features/room-options/traveler-rooms.d.ts +3 -3
  61. package/build/build-cjs/src/booking-wizard/features/sidebar/index.d.ts +2 -2
  62. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar-flight.d.ts +2 -2
  63. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar-util.d.ts +2 -4
  64. package/build/build-cjs/src/booking-wizard/features/sidebar/sidebar.d.ts +21 -21
  65. package/build/build-cjs/src/booking-wizard/features/summary/summary-booking-option-pax.d.ts +1 -1
  66. package/build/build-cjs/src/booking-wizard/features/summary/summary-booking-option-unit.d.ts +1 -1
  67. package/build/build-cjs/src/booking-wizard/features/summary/summary-flight.d.ts +2 -2
  68. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-booking-option-group.d.ts +1 -1
  69. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-pax-option-group.d.ts +1 -1
  70. package/build/build-cjs/src/booking-wizard/features/summary/summary-per-unit-option-group.d.ts +1 -1
  71. package/build/build-cjs/src/booking-wizard/features/summary/summary-slice.d.ts +3 -3
  72. package/build/build-cjs/src/booking-wizard/features/summary/summary.d.ts +2 -1
  73. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form-slice.d.ts +75 -75
  74. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form-util.d.ts +4 -4
  75. package/build/build-cjs/src/booking-wizard/features/travelers-form/travelers-form.d.ts +2 -1
  76. package/build/build-cjs/src/booking-wizard/features/travelers-form/type-ahead-input.d.ts +11 -11
  77. package/build/build-cjs/src/booking-wizard/features/travelers-form/validate-form.d.ts +1 -8
  78. package/build/build-cjs/src/booking-wizard/index.d.ts +6 -6
  79. package/build/build-cjs/src/booking-wizard/settings-context.d.ts +2 -1
  80. package/build/build-cjs/src/booking-wizard/store.d.ts +22 -40
  81. package/build/build-cjs/src/booking-wizard/types.d.ts +229 -229
  82. package/build/build-cjs/src/booking-wizard/use-offer-printer.d.ts +8 -8
  83. package/build/build-cjs/src/content/components/LanguageSwitcher.d.ts +5 -5
  84. package/build/build-cjs/src/content/components/accordion.d.ts +4 -4
  85. package/build/build-cjs/src/content/components/breadcrumb.d.ts +9 -9
  86. package/build/build-cjs/src/content/components/faq.d.ts +4 -4
  87. package/build/build-cjs/src/content/components/gallery.d.ts +5 -5
  88. package/build/build-cjs/src/content/components/icon.d.ts +5 -5
  89. package/build/build-cjs/src/content/components/image-with-text.d.ts +17 -17
  90. package/build/build-cjs/src/content/components/slider.d.ts +5 -5
  91. package/build/build-cjs/src/content/features/content-page/content-page-self-contained.d.ts +1 -1
  92. package/build/build-cjs/src/content/footer/types.d.ts +16 -16
  93. package/build/build-cjs/src/content/header/types.d.ts +20 -23
  94. package/build/build-cjs/src/content/image-card-grid/types.d.ts +8 -8
  95. package/build/build-cjs/src/content/login/confirm-component.d.ts +4 -0
  96. package/build/build-cjs/src/content/login/index.d.ts +4 -0
  97. package/build/build-cjs/src/content/login/login-component.d.ts +4 -0
  98. package/build/build-cjs/src/content/login/login-services.d.ts +6 -0
  99. package/build/build-cjs/src/content/login/reset-password-component.d.ts +4 -0
  100. package/build/build-cjs/src/content/login/types.d.ts +24 -0
  101. package/build/build-cjs/src/content/navbar/placeholderData.d.ts +2 -2
  102. package/build/build-cjs/src/content/navbar/types.d.ts +18 -18
  103. package/build/build-cjs/src/qsm/components/date-range-picker/calendar-day.d.ts +7 -7
  104. package/build/build-cjs/src/qsm/components/date-range-picker/calendar.d.ts +18 -18
  105. package/build/build-cjs/src/qsm/components/date-range-picker/index.d.ts +5 -5
  106. package/build/build-cjs/src/qsm/components/double-search-input-group/index.d.ts +2 -2
  107. package/build/build-cjs/src/qsm/components/icon.d.ts +5 -5
  108. package/build/build-cjs/src/qsm/components/item-picker/index.d.ts +6 -6
  109. package/build/build-cjs/src/qsm/components/search-input/index.d.ts +8 -8
  110. package/build/build-cjs/src/qsm/components/search-input-group/index.d.ts +7 -7
  111. package/build/build-cjs/src/qsm/index.d.ts +1 -1
  112. package/build/build-cjs/src/qsm/store/qsm-slice.d.ts +58 -110
  113. package/build/build-cjs/src/qsm/store/qsm-store.d.ts +7 -20
  114. package/build/build-cjs/src/qsm/types.d.ts +61 -61
  115. package/build/build-cjs/src/search-results/components/filters/filters.d.ts +5 -5
  116. package/build/build-cjs/src/search-results/components/filters/flight-filters.d.ts +3 -3
  117. package/build/build-cjs/src/search-results/components/flight/flight-banner.d.ts +2 -2
  118. package/build/build-cjs/src/search-results/components/flight/flight-card.d.ts +1 -1
  119. package/build/build-cjs/src/search-results/components/flight/flight-leg.d.ts +1 -1
  120. package/build/build-cjs/src/search-results/components/flight/flight-path.d.ts +1 -1
  121. package/build/build-cjs/src/search-results/components/flight/flight-results.d.ts +2 -2
  122. package/build/build-cjs/src/search-results/components/flight/flight-search-context/index.d.ts +29 -29
  123. package/build/build-cjs/src/search-results/components/flight/flight-selection/independent-flight-option.d.ts +5 -5
  124. package/build/build-cjs/src/search-results/components/flight/flight-selection/independent-flight-selection.d.ts +1 -1
  125. package/build/build-cjs/src/search-results/components/flight/flight-selection/index.d.ts +2 -2
  126. package/build/build-cjs/src/search-results/components/flight/flight-selection/paired-flight-option.d.ts +1 -1
  127. package/build/build-cjs/src/search-results/components/flight/flight-selection/paired-flight-selection.d.ts +1 -1
  128. package/build/build-cjs/src/search-results/components/hotel/hotel-accommodation-results.d.ts +2 -2
  129. package/build/build-cjs/src/search-results/components/hotel/hotel-card.d.ts +2 -2
  130. package/build/build-cjs/src/search-results/components/icon.d.ts +6 -6
  131. package/build/build-cjs/src/search-results/components/item-picker/index.d.ts +8 -8
  132. package/build/build-cjs/src/search-results/components/itinerary/index.d.ts +3 -3
  133. package/build/build-cjs/src/search-results/components/multi-range-filter.d.ts +6 -6
  134. package/build/build-cjs/src/search-results/components/round-trip/round-trip-results.d.ts +2 -1
  135. package/build/build-cjs/src/search-results/components/search-results-container/flight-search-results.d.ts +1 -1
  136. package/build/build-cjs/src/search-results/components/tab-views/index.d.ts +2 -1
  137. package/build/build-cjs/src/search-results/features/flights/flight-search-results-self-contained.d.ts +2 -1
  138. package/build/build-cjs/src/search-results/features/hotels/hotel-flight-search-results-self-contained.d.ts +2 -1
  139. package/build/build-cjs/src/search-results/features/hotels/hotel-search-results-self-contained.d.ts +2 -1
  140. package/build/build-cjs/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.d.ts +2 -1
  141. package/build/build-cjs/src/search-results/index.d.ts +1 -1
  142. package/build/build-cjs/src/search-results/store/search-results-slice.d.ts +23 -52
  143. package/build/build-cjs/src/search-results/store/search-results-store.d.ts +7 -20
  144. package/build/build-cjs/src/search-results/types.d.ts +95 -95
  145. package/build/build-cjs/src/search-results/utils/flight-utils.d.ts +1 -6
  146. package/build/build-cjs/src/shared/components/flyin.d.ts +5 -5
  147. package/build/build-cjs/src/shared/components/icon.d.ts +5 -5
  148. package/build/build-cjs/src/shared/components/loader.d.ts +1 -1
  149. package/build/build-cjs/src/shared/types.d.ts +12 -12
  150. package/build/build-cjs/src/shared/utils/localization-util.d.ts +387 -345
  151. package/build/build-esm/index.js +26807 -40092
  152. package/build/build-esm/src/booking-product/components/age-select.d.ts +3 -3
  153. package/build/build-esm/src/booking-product/components/amount-input.d.ts +5 -5
  154. package/build/build-esm/src/booking-product/components/date-range-picker/calendar-day.d.ts +8 -8
  155. package/build/build-esm/src/booking-product/components/date-range-picker/calendar.d.ts +14 -14
  156. package/build/build-esm/src/booking-product/components/date-range-picker/index.d.ts +19 -16
  157. package/build/build-esm/src/booking-product/components/dates.d.ts +8 -8
  158. package/build/build-esm/src/booking-product/components/footer.d.ts +5 -5
  159. package/build/build-esm/src/booking-product/components/header.d.ts +6 -6
  160. package/build/build-esm/src/booking-product/components/icon.d.ts +5 -5
  161. package/build/build-esm/src/booking-product/components/list-view.d.ts +2 -2
  162. package/build/build-esm/src/booking-product/components/product.d.ts +4 -4
  163. package/build/build-esm/src/booking-product/components/rating.d.ts +1 -1
  164. package/build/build-esm/src/booking-product/components/rooms.d.ts +4 -4
  165. package/build/build-esm/src/booking-product/constants.d.ts +1 -1
  166. package/build/build-esm/src/booking-product/index.d.ts +4 -4
  167. package/build/build-esm/src/booking-product/settings-context.d.ts +2 -1
  168. package/build/build-esm/src/booking-product/types.d.ts +21 -21
  169. package/build/build-esm/src/booking-product/utils/api.d.ts +2 -11
  170. package/build/build-esm/src/booking-product/utils/price.d.ts +1 -10
  171. package/build/build-esm/src/booking-wizard/api-settings-slice.d.ts +2 -3
  172. package/build/build-esm/src/booking-wizard/components/icon.d.ts +5 -5
  173. package/build/build-esm/src/booking-wizard/components/labeled-input.d.ts +13 -13
  174. package/build/build-esm/src/booking-wizard/components/labeled-select.d.ts +16 -16
  175. package/build/build-esm/src/booking-wizard/components/message.d.ts +4 -4
  176. package/build/build-esm/src/booking-wizard/components/multi-range-filter.d.ts +6 -6
  177. package/build/build-esm/src/booking-wizard/components/phone-input.d.ts +11 -11
  178. package/build/build-esm/src/booking-wizard/components/print-offer-button.d.ts +11 -11
  179. package/build/build-esm/src/booking-wizard/components/product-card.d.ts +3 -3
  180. package/build/build-esm/src/booking-wizard/components/step-indicator.d.ts +1 -1
  181. package/build/build-esm/src/booking-wizard/components/step-route.d.ts +3 -3
  182. package/build/build-esm/src/booking-wizard/features/booking/api.d.ts +6 -22
  183. package/build/build-esm/src/booking-wizard/features/booking/booking-self-contained.d.ts +3 -3
  184. package/build/build-esm/src/booking-wizard/features/booking/booking-slice.d.ts +38 -91
  185. package/build/build-esm/src/booking-wizard/features/booking/booking.d.ts +3 -3
  186. package/build/build-esm/src/booking-wizard/features/booking/constants.d.ts +1 -8
  187. package/build/build-esm/src/booking-wizard/features/booking/selectors.d.ts +478 -640
  188. package/build/build-esm/src/booking-wizard/features/confirmation/confirmation.d.ts +2 -1
  189. package/build/build-esm/src/booking-wizard/features/error/error.d.ts +2 -1
  190. package/build/build-esm/src/booking-wizard/features/flight-options/flight-filter.d.ts +3 -3
  191. package/build/build-esm/src/booking-wizard/features/flight-options/flight-option-flight.d.ts +2 -2
  192. package/build/build-esm/src/booking-wizard/features/flight-options/flight-option.d.ts +4 -4
  193. package/build/build-esm/src/booking-wizard/features/flight-options/flight-utils.d.ts +2 -9
  194. package/build/build-esm/src/booking-wizard/features/flight-options/index.d.ts +2 -1
  195. package/build/build-esm/src/booking-wizard/features/price-details/price-details-api.d.ts +1 -6
  196. package/build/build-esm/src/booking-wizard/features/price-details/price-details-slice.d.ts +214 -228
  197. package/build/build-esm/src/booking-wizard/features/product-options/none-option.d.ts +3 -3
  198. package/build/build-esm/src/booking-wizard/features/product-options/option-booking-airline-group.d.ts +2 -2
  199. package/build/build-esm/src/booking-wizard/features/product-options/option-booking-group.d.ts +6 -6
  200. package/build/build-esm/src/booking-wizard/features/product-options/option-item.d.ts +5 -5
  201. package/build/build-esm/src/booking-wizard/features/product-options/option-pax-card.d.ts +4 -4
  202. package/build/build-esm/src/booking-wizard/features/product-options/option-pax-group.d.ts +7 -7
  203. package/build/build-esm/src/booking-wizard/features/product-options/option-room.d.ts +5 -5
  204. package/build/build-esm/src/booking-wizard/features/product-options/option-unit-group.d.ts +7 -7
  205. package/build/build-esm/src/booking-wizard/features/product-options/option-units-card.d.ts +3 -3
  206. package/build/build-esm/src/booking-wizard/features/product-options/options-form.d.ts +2 -1
  207. package/build/build-esm/src/booking-wizard/features/room-options/index.d.ts +2 -1
  208. package/build/build-esm/src/booking-wizard/features/room-options/room-utils.d.ts +6 -19
  209. package/build/build-esm/src/booking-wizard/features/room-options/room.d.ts +6 -6
  210. package/build/build-esm/src/booking-wizard/features/room-options/traveler-rooms.d.ts +3 -3
  211. package/build/build-esm/src/booking-wizard/features/sidebar/index.d.ts +2 -2
  212. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar-flight.d.ts +2 -2
  213. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar-util.d.ts +2 -4
  214. package/build/build-esm/src/booking-wizard/features/sidebar/sidebar.d.ts +21 -21
  215. package/build/build-esm/src/booking-wizard/features/summary/summary-booking-option-pax.d.ts +1 -1
  216. package/build/build-esm/src/booking-wizard/features/summary/summary-booking-option-unit.d.ts +1 -1
  217. package/build/build-esm/src/booking-wizard/features/summary/summary-flight.d.ts +2 -2
  218. package/build/build-esm/src/booking-wizard/features/summary/summary-per-booking-option-group.d.ts +1 -1
  219. package/build/build-esm/src/booking-wizard/features/summary/summary-per-pax-option-group.d.ts +1 -1
  220. package/build/build-esm/src/booking-wizard/features/summary/summary-per-unit-option-group.d.ts +1 -1
  221. package/build/build-esm/src/booking-wizard/features/summary/summary-slice.d.ts +3 -3
  222. package/build/build-esm/src/booking-wizard/features/summary/summary.d.ts +2 -1
  223. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form-slice.d.ts +75 -75
  224. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form-util.d.ts +4 -4
  225. package/build/build-esm/src/booking-wizard/features/travelers-form/travelers-form.d.ts +2 -1
  226. package/build/build-esm/src/booking-wizard/features/travelers-form/type-ahead-input.d.ts +11 -11
  227. package/build/build-esm/src/booking-wizard/features/travelers-form/validate-form.d.ts +1 -8
  228. package/build/build-esm/src/booking-wizard/index.d.ts +6 -6
  229. package/build/build-esm/src/booking-wizard/settings-context.d.ts +2 -1
  230. package/build/build-esm/src/booking-wizard/store.d.ts +22 -40
  231. package/build/build-esm/src/booking-wizard/types.d.ts +229 -229
  232. package/build/build-esm/src/booking-wizard/use-offer-printer.d.ts +8 -8
  233. package/build/build-esm/src/content/components/LanguageSwitcher.d.ts +5 -5
  234. package/build/build-esm/src/content/components/accordion.d.ts +4 -4
  235. package/build/build-esm/src/content/components/breadcrumb.d.ts +9 -9
  236. package/build/build-esm/src/content/components/faq.d.ts +4 -4
  237. package/build/build-esm/src/content/components/gallery.d.ts +5 -5
  238. package/build/build-esm/src/content/components/icon.d.ts +5 -5
  239. package/build/build-esm/src/content/components/image-with-text.d.ts +17 -17
  240. package/build/build-esm/src/content/components/slider.d.ts +5 -5
  241. package/build/build-esm/src/content/features/content-page/content-page-self-contained.d.ts +1 -1
  242. package/build/build-esm/src/content/footer/types.d.ts +16 -16
  243. package/build/build-esm/src/content/header/types.d.ts +20 -23
  244. package/build/build-esm/src/content/image-card-grid/types.d.ts +8 -8
  245. package/build/build-esm/src/content/login/confirm-component.d.ts +4 -0
  246. package/build/build-esm/src/content/login/index.d.ts +4 -0
  247. package/build/build-esm/src/content/login/login-component.d.ts +4 -0
  248. package/build/build-esm/src/content/login/login-services.d.ts +6 -0
  249. package/build/build-esm/src/content/login/reset-password-component.d.ts +4 -0
  250. package/build/build-esm/src/content/login/types.d.ts +24 -0
  251. package/build/build-esm/src/content/navbar/placeholderData.d.ts +2 -2
  252. package/build/build-esm/src/content/navbar/types.d.ts +18 -18
  253. package/build/build-esm/src/qsm/components/date-range-picker/calendar-day.d.ts +7 -7
  254. package/build/build-esm/src/qsm/components/date-range-picker/calendar.d.ts +18 -18
  255. package/build/build-esm/src/qsm/components/date-range-picker/index.d.ts +5 -5
  256. package/build/build-esm/src/qsm/components/double-search-input-group/index.d.ts +2 -2
  257. package/build/build-esm/src/qsm/components/icon.d.ts +5 -5
  258. package/build/build-esm/src/qsm/components/item-picker/index.d.ts +6 -6
  259. package/build/build-esm/src/qsm/components/search-input/index.d.ts +8 -8
  260. package/build/build-esm/src/qsm/components/search-input-group/index.d.ts +7 -7
  261. package/build/build-esm/src/qsm/index.d.ts +1 -1
  262. package/build/build-esm/src/qsm/store/qsm-slice.d.ts +58 -110
  263. package/build/build-esm/src/qsm/store/qsm-store.d.ts +7 -20
  264. package/build/build-esm/src/qsm/types.d.ts +61 -61
  265. package/build/build-esm/src/search-results/components/filters/filters.d.ts +5 -5
  266. package/build/build-esm/src/search-results/components/filters/flight-filters.d.ts +3 -3
  267. package/build/build-esm/src/search-results/components/flight/flight-banner.d.ts +2 -2
  268. package/build/build-esm/src/search-results/components/flight/flight-card.d.ts +1 -1
  269. package/build/build-esm/src/search-results/components/flight/flight-leg.d.ts +1 -1
  270. package/build/build-esm/src/search-results/components/flight/flight-path.d.ts +1 -1
  271. package/build/build-esm/src/search-results/components/flight/flight-results.d.ts +2 -2
  272. package/build/build-esm/src/search-results/components/flight/flight-search-context/index.d.ts +29 -29
  273. package/build/build-esm/src/search-results/components/flight/flight-selection/independent-flight-option.d.ts +5 -5
  274. package/build/build-esm/src/search-results/components/flight/flight-selection/independent-flight-selection.d.ts +1 -1
  275. package/build/build-esm/src/search-results/components/flight/flight-selection/index.d.ts +2 -2
  276. package/build/build-esm/src/search-results/components/flight/flight-selection/paired-flight-option.d.ts +1 -1
  277. package/build/build-esm/src/search-results/components/flight/flight-selection/paired-flight-selection.d.ts +1 -1
  278. package/build/build-esm/src/search-results/components/hotel/hotel-accommodation-results.d.ts +2 -2
  279. package/build/build-esm/src/search-results/components/hotel/hotel-card.d.ts +2 -2
  280. package/build/build-esm/src/search-results/components/icon.d.ts +6 -6
  281. package/build/build-esm/src/search-results/components/item-picker/index.d.ts +8 -8
  282. package/build/build-esm/src/search-results/components/itinerary/index.d.ts +3 -3
  283. package/build/build-esm/src/search-results/components/multi-range-filter.d.ts +6 -6
  284. package/build/build-esm/src/search-results/components/round-trip/round-trip-results.d.ts +2 -1
  285. package/build/build-esm/src/search-results/components/search-results-container/flight-search-results.d.ts +1 -1
  286. package/build/build-esm/src/search-results/components/tab-views/index.d.ts +2 -1
  287. package/build/build-esm/src/search-results/features/flights/flight-search-results-self-contained.d.ts +2 -1
  288. package/build/build-esm/src/search-results/features/hotels/hotel-flight-search-results-self-contained.d.ts +2 -1
  289. package/build/build-esm/src/search-results/features/hotels/hotel-search-results-self-contained.d.ts +2 -1
  290. package/build/build-esm/src/search-results/features/roundtrips/roundtrip-search-results-self-contained.d.ts +2 -1
  291. package/build/build-esm/src/search-results/index.d.ts +1 -1
  292. package/build/build-esm/src/search-results/store/search-results-slice.d.ts +23 -52
  293. package/build/build-esm/src/search-results/store/search-results-store.d.ts +7 -20
  294. package/build/build-esm/src/search-results/types.d.ts +95 -95
  295. package/build/build-esm/src/search-results/utils/flight-utils.d.ts +1 -6
  296. package/build/build-esm/src/shared/components/flyin.d.ts +5 -5
  297. package/build/build-esm/src/shared/components/icon.d.ts +5 -5
  298. package/build/build-esm/src/shared/components/loader.d.ts +1 -1
  299. package/build/build-esm/src/shared/types.d.ts +12 -12
  300. package/build/build-esm/src/shared/utils/localization-util.d.ts +387 -345
  301. package/package.json +4 -2
  302. package/src/content/login/confirm-component.tsx +149 -0
  303. package/src/content/login/index.tsx +70 -0
  304. package/src/content/login/login-component.tsx +158 -0
  305. package/src/content/login/login-services.ts +109 -0
  306. package/src/content/login/reset-password-component.tsx +190 -0
  307. package/src/content/login/types.ts +29 -0
  308. package/src/shared/translations/ar-SA.json +32 -0
  309. package/src/shared/translations/da-DK.json +32 -0
  310. package/src/shared/translations/de-DE.json +32 -0
  311. package/src/shared/translations/en-GB.json +32 -0
  312. package/src/shared/translations/es-ES.json +32 -0
  313. package/src/shared/translations/fr-BE.json +32 -0
  314. package/src/shared/translations/fr-FR.json +32 -0
  315. package/src/shared/translations/is-IS.json +32 -0
  316. package/src/shared/translations/it-IT.json +32 -0
  317. package/src/shared/translations/ja-JP.json +32 -0
  318. package/src/shared/translations/nl-BE.json +32 -0
  319. package/src/shared/translations/nl-NL.json +32 -0
  320. package/src/shared/translations/no-NO.json +32 -0
  321. package/src/shared/translations/pl-PL.json +32 -0
  322. package/src/shared/translations/pt-PT.json +32 -0
  323. package/src/shared/translations/sv-SE.json +32 -0
  324. package/styles/components/_login.scss +7 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qite/tide-booking-component",
3
- "version": "1.4.56",
3
+ "version": "1.4.57",
4
4
  "description": "React Booking wizard & Booking product component for Tide",
5
5
  "main": "build/build-cjs/index.js",
6
6
  "types": "build/build-cjs/src/index.d.ts",
@@ -71,8 +71,10 @@
71
71
  "uuid": "^11.1.0"
72
72
  },
73
73
  "dependencies": {
74
+ "jwt-decode": "^4.0.0",
74
75
  "react-html-comment": "^2.0.16",
75
76
  "react-router-dom": "^6.30.3",
76
- "signalr-no-jquery": "^0.2.1"
77
+ "signalr-no-jquery": "^0.2.1",
78
+ "yup": "^1.6.1"
77
79
  }
78
80
  }
@@ -0,0 +1,149 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { LoginComponentProps } from './types';
3
+ import { getTranslations } from '../../shared/utils/localization-util';
4
+ import { confirmMember } from './login-services';
5
+
6
+ interface TouchedFields {
7
+ password?: boolean;
8
+ repeatPassword?: boolean;
9
+ }
10
+
11
+ interface FormFields {
12
+ password: string;
13
+ repeatPassword: string;
14
+ }
15
+
16
+ const ConfirmComponent: React.FC<LoginComponentProps> = ({ tideClientConfig, languageCode, handleBackToLogin }) => {
17
+ const [isConfirmed, setIsConfirmed] = useState<boolean>(false);
18
+ const [touched, setTouched] = useState<TouchedFields>();
19
+ const [formValues, setFormValues] = useState<FormFields>({
20
+ password: '',
21
+ repeatPassword: ''
22
+ });
23
+ const [errors, setErrors] = useState({} as any);
24
+ const [token, setToken] = useState<string | null>(null);
25
+
26
+ const translations = getTranslations(languageCode ?? 'en-GB');
27
+
28
+ useEffect(() => {
29
+ if (typeof window !== 'undefined') {
30
+ setToken(new URLSearchParams(window.location.search).get('token'));
31
+ }
32
+ }, []);
33
+
34
+ const handleBlur = (event: React.ChangeEvent<HTMLInputElement>) => {
35
+ if (!touched) {
36
+ setTouched({ password: false, repeatPassword: false });
37
+ }
38
+ setTouched({
39
+ ...touched,
40
+ [event.target.name]: true
41
+ });
42
+
43
+ validate();
44
+ };
45
+
46
+ const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
47
+ setFormValues({ ...formValues, [event.target.name]: event.target.value });
48
+
49
+ validate();
50
+ };
51
+
52
+ const validate = () => {
53
+ let validationErrors = {} as any;
54
+ if (formValues) {
55
+ if (!formValues.password || formValues.password.length === 0) {
56
+ validationErrors.password = true;
57
+ }
58
+ if (!formValues.repeatPassword || formValues.repeatPassword.length === 0) {
59
+ validationErrors.repeatPassword = true;
60
+ } else if (formValues.password !== formValues.repeatPassword) {
61
+ validationErrors.passwordMatch = true;
62
+ }
63
+ if (!token || token.length === 0) {
64
+ validationErrors.token = true;
65
+ }
66
+ }
67
+
68
+ setErrors(validationErrors);
69
+ return Object.keys(validationErrors).length === 0;
70
+ };
71
+
72
+ const handleConfirmation = async () => {
73
+ setTouched({ password: true, repeatPassword: true });
74
+ const isValid = validate();
75
+ if (!isValid) return;
76
+
77
+ if (token) {
78
+ try {
79
+ const response = await confirmMember(token, formValues.password, true, tideClientConfig);
80
+ if (response.ok) {
81
+ setIsConfirmed(true);
82
+ }
83
+ } catch {
84
+ // Optional: handle unexpected API issues
85
+ }
86
+ }
87
+ };
88
+
89
+ useEffect(() => {
90
+ validate();
91
+ }, [formValues, token]);
92
+
93
+ return (
94
+ <>
95
+ {!isConfirmed && (
96
+ <>
97
+ <h4 className="login__card__title">{translations.LOGIN.RESET_PASSWORD_TITLE}</h4>
98
+
99
+ <form className="login__form" onSubmit={(e) => e.preventDefault()} noValidate>
100
+ <div className="login__form__group">
101
+ <label htmlFor="password">{translations.LOGIN.RESET_PASSWORD_LABEL}</label>
102
+ <input type="password" id="password" name="password" value={formValues.password} onChange={onChange} onBlur={handleBlur} required />
103
+ {(touched?.password || touched?.repeatPassword) && errors.password && (
104
+ <div id="username-error" className="login__error">
105
+ {translations.LOGIN.PASSWORD_REQUIRED}
106
+ </div>
107
+ )}
108
+ </div>
109
+
110
+ <div className="login__form__group">
111
+ <label htmlFor="repeatPassword">{translations.LOGIN.RESET_REPEAT_PASSWORD_LABEL}</label>
112
+ <input
113
+ type="password"
114
+ id="repeatPassword"
115
+ name="repeatPassword"
116
+ value={formValues.repeatPassword}
117
+ onChange={onChange}
118
+ onBlur={handleBlur}
119
+ required
120
+ />
121
+ {(touched?.repeatPassword || touched?.password) && (errors.repeatPassword || errors.passwordMatch) && (
122
+ <div id="username-error" className="login__error">
123
+ {errors.repeatPassword === 'required' && translations.LOGIN.REPEAT_PASSWORD_REQUIRED}
124
+ {errors.passwordMatch === 'mismatch' && translations.LOGIN.PASSWORDS_DO_NOT_MATCH}
125
+ </div>
126
+ )}
127
+ </div>
128
+
129
+ <button type="button" className="cta cta--primary" onClick={handleConfirmation}>
130
+ {translations.LOGIN.RESET_PASSWORD_SUBMIT_LABEL}
131
+ </button>
132
+ </form>
133
+ </>
134
+ )}
135
+
136
+ {isConfirmed && (
137
+ <div className="login__welcome">
138
+ <h3 className="login__card__title">{translations.LOGIN.RECEIVED_REQUEST}</h3>
139
+ <p>{translations.LOGIN.ACCOUNT_ACTIVATED_LOGIN}</p>
140
+ <button className="cta cta--primary" onClick={handleBackToLogin}>
141
+ {translations.LOGIN.BACK_TO_LOGIN}
142
+ </button>
143
+ </div>
144
+ )}
145
+ </>
146
+ );
147
+ };
148
+
149
+ export default ConfirmComponent;
@@ -0,0 +1,70 @@
1
+ import React from 'react';
2
+ import { LoginProps } from './types';
3
+ import LoginComponent from './login-component';
4
+ import ResetPasswordComponent from './reset-password-component';
5
+ import ConfirmComponent from './confirm-component';
6
+
7
+ const Login: React.FC<LoginProps> = ({
8
+ tideClientConfig,
9
+ portalId,
10
+ languageCode,
11
+ imageSrc,
12
+ logo,
13
+ isMemberConfirmation,
14
+ isLoginPage,
15
+ isResetPassword,
16
+ member,
17
+ setMember,
18
+ handleBackToHome,
19
+ handleBackToLogin
20
+ }) => {
21
+ return (
22
+ <div className="login">
23
+ <div className="login__img__wrapper">
24
+ <img className="login__img" src={imageSrc ? imageSrc : 'https://cdn.pixabay.com/photo/2022/04/08/06/36/rock-7118843_1280.jpg'} alt="Login" />
25
+ </div>
26
+
27
+ <div className="login__container">
28
+ <div className="login__card">
29
+ {logo && <div className="login__logo">{logo}</div>}
30
+
31
+ {isLoginPage && (
32
+ <LoginComponent
33
+ tideClientConfig={tideClientConfig}
34
+ portalId={portalId}
35
+ languageCode={languageCode}
36
+ member={member}
37
+ setMember={setMember}
38
+ handleBackToHome={handleBackToHome}
39
+ handleBackToLogin={handleBackToLogin}
40
+ />
41
+ )}
42
+ {isResetPassword && (
43
+ <ResetPasswordComponent
44
+ tideClientConfig={tideClientConfig}
45
+ portalId={portalId}
46
+ languageCode={languageCode}
47
+ member={member}
48
+ setMember={setMember}
49
+ handleBackToHome={handleBackToHome}
50
+ handleBackToLogin={handleBackToLogin}
51
+ />
52
+ )}
53
+ {isMemberConfirmation && (
54
+ <ConfirmComponent
55
+ tideClientConfig={tideClientConfig}
56
+ portalId={portalId}
57
+ languageCode={languageCode}
58
+ member={member}
59
+ setMember={setMember}
60
+ handleBackToHome={handleBackToHome}
61
+ handleBackToLogin={handleBackToLogin}
62
+ />
63
+ )}
64
+ </div>
65
+ </div>
66
+ </div>
67
+ );
68
+ };
69
+
70
+ export default Login;
@@ -0,0 +1,158 @@
1
+ import React, { useState } from 'react';
2
+ import { LoginComponentProps } from './types';
3
+ import { getTranslations } from '../../shared/utils/localization-util';
4
+ import { useFormik } from 'formik';
5
+ import * as Yup from 'yup';
6
+ import { decodeTokenToMemberInfo, loginMember, passwordForgotten } from './login-services';
7
+
8
+ const LoginComponent: React.FC<LoginComponentProps> = ({ tideClientConfig, portalId, languageCode, member, setMember, handleBackToHome }) => {
9
+ const [isLoggedIn, setIsLoggedIn] = useState<boolean>(false);
10
+ const [showPassword, setShowPassword] = useState(false);
11
+ const [isForgotPassword, setIsForgotPassword] = useState<boolean>(false);
12
+ const [newPasswordRequested, setNewPasswordRequested] = useState<boolean>(false);
13
+
14
+ const [apiError, setApiError] = useState(false);
15
+
16
+ const translations = getTranslations(languageCode ?? 'en-GB');
17
+
18
+ const formik = useFormik({
19
+ initialValues: {
20
+ username: '',
21
+ password: ''
22
+ },
23
+ validationSchema: Yup.object({
24
+ username: Yup.string().email(translations.LOGIN.EMAIL_INVALID).required(translations.LOGIN.EMAIL_REQUIRED),
25
+ password: Yup.string().required(translations.LOGIN.PASSWORD_REQUIRED)
26
+ }),
27
+ onSubmit: async (values) => {
28
+ try {
29
+ const response = await loginMember(values.username, values.password, tideClientConfig, portalId);
30
+ const member = decodeTokenToMemberInfo(response.token);
31
+ if (member && member.id !== 0) {
32
+ setMember(member);
33
+ localStorage.setItem('token', response.token);
34
+ setIsLoggedIn(true);
35
+ }
36
+ } catch (error) {
37
+ setApiError(true);
38
+ }
39
+ }
40
+ });
41
+
42
+ const handleForgotPasswordClick = async () => {
43
+ formik.setTouched({ username: true }, true);
44
+ const errors = await formik.validateForm();
45
+
46
+ if (!errors.username) {
47
+ handleForgotPassword();
48
+ }
49
+ };
50
+
51
+ const handleForgotPassword = async () => {
52
+ try {
53
+ const response = await passwordForgotten(formik.values.username, tideClientConfig, portalId);
54
+ if (response) {
55
+ setNewPasswordRequested(true);
56
+ }
57
+ } catch (error) {
58
+ setApiError(true);
59
+ }
60
+ };
61
+
62
+ return (
63
+ <>
64
+ {!isLoggedIn && !isForgotPassword && (
65
+ <>
66
+ <h4 className="login__card__title">{translations.LOGIN.LOGIN_INTO}</h4>
67
+
68
+ <form className="login__form" onSubmit={formik.handleSubmit} noValidate>
69
+ <div className="login__form__group">
70
+ <label htmlFor="email">{translations.LOGIN.EMAIL}</label>
71
+ <input type="text" id="username" placeholder={translations.LOGIN.ENTER_YOUR_EMAIL} {...formik.getFieldProps('username')} />
72
+ {formik.touched.username && formik.errors.username && (
73
+ <div id="username-error" className="login__error">
74
+ {formik.errors.username}
75
+ </div>
76
+ )}
77
+ </div>
78
+
79
+ <div className="login__form__group">
80
+ <label htmlFor="password">{translations.LOGIN.PASSWORD}</label>
81
+ <input
82
+ type={showPassword ? 'text' : 'password'}
83
+ id="password"
84
+ placeholder={translations.LOGIN.ENTER_YOUR_PASSWORD}
85
+ {...formik.getFieldProps('password')}
86
+ required
87
+ />
88
+ {(formik.touched.password || formik.submitCount > 0) && formik.errors.password && (
89
+ <div id="password-error" className="login__error">
90
+ {formik.values.password === '' ? translations.LOGIN.PASSWORD_REQUIRED : formik.errors.password}
91
+ </div>
92
+ )}
93
+ </div>
94
+
95
+ {!formik.errors.password && apiError && <div className="login__error">{translations.LOGIN.INVALID_CREDENTIALS}</div>}
96
+
97
+ <button type="submit" className="cta cta--primary">
98
+ {translations.LOGIN.LOGIN}
99
+ </button>
100
+
101
+ <button
102
+ type="button"
103
+ className="login__forgot"
104
+ onClick={() => {
105
+ formik.setFieldValue('password', '');
106
+ formik.setFieldTouched('password', false, false);
107
+ formik.setFieldError('password', undefined);
108
+
109
+ setApiError(false);
110
+
111
+ setIsForgotPassword(true);
112
+ }}>
113
+ {translations.LOGIN.FORGOT_PASSWORD}
114
+ </button>
115
+ </form>
116
+ </>
117
+ )}
118
+
119
+ {isLoggedIn && member && !isForgotPassword && (
120
+ <div className="login__welcome">
121
+ <h3 className="login__card__title">
122
+ {translations.LOGIN.WELCOME_X}
123
+ {member?.name}
124
+ </h3>
125
+ <button className="cta cta--primary" onClick={handleBackToHome}>
126
+ {translations.LOGIN.BACK_TO_HOMEPAGE}
127
+ </button>
128
+ </div>
129
+ )}
130
+
131
+ {isForgotPassword && !newPasswordRequested && (
132
+ <>
133
+ <h4 className="login__card__title">{translations.LOGIN.FORGOT_PASSWORD}</h4>
134
+
135
+ <form className="login__form" noValidate>
136
+ <div className="login__form__group">
137
+ <label htmlFor="email">{translations.LOGIN.EMAIL}</label>
138
+ <input type="text" id="username" placeholder={translations.LOGIN.ENTER_YOUR_EMAIL} {...formik.getFieldProps('username')} required />
139
+ {(((formik.submitCount > 0 || formik.touched.username) && formik.errors.username) || apiError) && (
140
+ <div id="username-error" className="login__error">
141
+ {translations.LOGIN.EMAIL_REQUIRED}
142
+ </div>
143
+ )}
144
+ </div>
145
+
146
+ <button className="cta cta--primary" onClick={handleForgotPasswordClick}>
147
+ {translations.LOGIN.FORGOT_PASSWORD_EMAIL_SUBMIT_LABEL}
148
+ </button>
149
+ </form>
150
+ </>
151
+ )}
152
+
153
+ {newPasswordRequested && <h4 className="login__card__title">{translations.LOGIN.RESET_REQUESTED}</h4>}
154
+ </>
155
+ );
156
+ };
157
+
158
+ export default LoginComponent;
@@ -0,0 +1,109 @@
1
+ import { login, confirm, forgotPassword, resetPassword, TideClientConfig, MemberInfo } from '@qite/tide-client';
2
+ import { MemberConfirmationRequest, MemberForgotPasswordRequest, MemberLoginRequest, MemberResetPasswordRequest } from '@qite/tide-client';
3
+ import { JwtPayload, jwtDecode } from 'jwt-decode';
4
+
5
+ interface MemberInfoPayload extends JwtPayload {
6
+ company: string;
7
+ companyName: string;
8
+ language: string;
9
+ member: string;
10
+ email: string;
11
+ unique_name: string;
12
+ addressId: string;
13
+ addressName: string;
14
+ addressLogo: string;
15
+ 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid': string;
16
+ 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name': string;
17
+ 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress': string;
18
+ }
19
+
20
+ export const loginMember = async (username: string, password: string, tideClientConfig: TideClientConfig, portalId: number) => {
21
+ if (!tideClientConfig.host || !tideClientConfig.apiKey) {
22
+ return Promise.reject();
23
+ }
24
+
25
+ const memberLogingRequest: MemberLoginRequest = {
26
+ username: username,
27
+ password: password,
28
+ portalId: portalId
29
+ };
30
+
31
+ const memberInfo = await login(tideClientConfig, memberLogingRequest, undefined);
32
+ return memberInfo;
33
+ };
34
+
35
+ export const confirmMember = async (token: string, password: string, hasAgreed: boolean, tideClientConfig: TideClientConfig) => {
36
+ if (!tideClientConfig.host || !tideClientConfig.apiKey) {
37
+ return Promise.reject();
38
+ }
39
+
40
+ const memberConfirmationRequest: MemberConfirmationRequest = {
41
+ token: token,
42
+ password: password,
43
+ hasAgreed: hasAgreed
44
+ };
45
+
46
+ const response = await confirm(tideClientConfig, memberConfirmationRequest, undefined);
47
+ return response;
48
+ };
49
+
50
+ export const passwordForgotten = async (username: string, tideClientConfig: TideClientConfig, portalId: number) => {
51
+ if (!tideClientConfig.host || !tideClientConfig.apiKey) {
52
+ return Promise.reject();
53
+ }
54
+
55
+ const memberForgotPasswordRequest: MemberForgotPasswordRequest = {
56
+ username: username,
57
+ portalId: portalId
58
+ };
59
+
60
+ const response = await forgotPassword(tideClientConfig, memberForgotPasswordRequest, undefined);
61
+ return response.ok;
62
+ };
63
+
64
+ export const newPassword = async (token: string, password: string, tideClientConfig: TideClientConfig) => {
65
+ if (!tideClientConfig.host || !tideClientConfig.apiKey) {
66
+ return Promise.reject();
67
+ }
68
+
69
+ const memberResetPasswordRequest: MemberResetPasswordRequest = {
70
+ token: token,
71
+ password: password
72
+ };
73
+
74
+ const response = await resetPassword(tideClientConfig, memberResetPasswordRequest, undefined);
75
+ return response.ok;
76
+ };
77
+
78
+ export const decodeTokenToMemberInfo = (token: string | null): MemberInfo | undefined => {
79
+ if (!token) {
80
+ return undefined;
81
+ }
82
+
83
+ const decodedToken = jwtDecode<MemberInfoPayload>(token);
84
+ let member: MemberInfo | undefined = undefined;
85
+ // check if token is not expired
86
+ if (decodedToken?.exp && decodedToken.exp * 1000 < new Date().getTime()) {
87
+ return undefined;
88
+ }
89
+
90
+ if (decodedToken) {
91
+ member = {
92
+ id: decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid']
93
+ ? parseInt(decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid'])
94
+ : 0,
95
+ companyId: decodedToken.company ? parseInt(decodedToken.company) : 0,
96
+ companyName: decodedToken.companyName,
97
+ name: decodedToken.unique_name,
98
+ email: decodedToken.email || decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'],
99
+ language: decodedToken.language,
100
+ agentId: decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid']
101
+ ? parseInt(decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid'])
102
+ : 0,
103
+ addressId: decodedToken.addressId ? parseInt(decodedToken.addressId) : undefined,
104
+ addressName: decodedToken.addressName,
105
+ addressLogo: decodedToken.addressLogo
106
+ } as MemberInfo;
107
+ }
108
+ return member;
109
+ };
@@ -0,0 +1,190 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { LoginComponentProps } from './types';
3
+ import { getTranslations } from '../../shared/utils/localization-util';
4
+ import { newPassword } from './login-services';
5
+ import { jwtDecode } from 'jwt-decode';
6
+
7
+ interface TouchedFields {
8
+ password?: boolean;
9
+ repeatPassword?: boolean;
10
+ }
11
+
12
+ interface FormFields {
13
+ password: string;
14
+ repeatPassword: string;
15
+ }
16
+
17
+ const ResetPasswordComponent: React.FC<LoginComponentProps> = ({ tideClientConfig, languageCode, handleBackToLogin }) => {
18
+ const [passwordSet, setPasswordSet] = useState<boolean>(false);
19
+ const [touched, setTouched] = useState<TouchedFields>({
20
+ password: false,
21
+ repeatPassword: false
22
+ });
23
+ const [formValues, setFormValues] = useState<FormFields>({
24
+ password: '',
25
+ repeatPassword: ''
26
+ });
27
+ const [submitted, setSubmitted] = useState<boolean>(false);
28
+ const [errors, setErrors] = useState({} as any);
29
+ const [token, setToken] = useState<string | null>(null);
30
+ const [invalidToken, setInvalidToken] = useState<boolean>(false);
31
+
32
+ const translations = getTranslations(languageCode ?? 'en-GB');
33
+
34
+ useEffect(() => {
35
+ if (typeof window !== 'undefined') {
36
+ const rawToken = new URLSearchParams(window.location.search).get('token');
37
+ setToken(rawToken);
38
+
39
+ if (rawToken) {
40
+ try {
41
+ const decoded = jwtDecode(rawToken);
42
+
43
+ if (!decoded.exp || decoded.exp * 1000 < Date.now()) {
44
+ setInvalidToken(true);
45
+ }
46
+ } catch (e) {
47
+ setInvalidToken(true);
48
+ }
49
+ } else {
50
+ setInvalidToken(true);
51
+ }
52
+ }
53
+ }, []);
54
+
55
+ const handleBlur = (event: React.ChangeEvent<HTMLInputElement>) => {
56
+ setTouched((prev) => ({
57
+ ...prev,
58
+ [event.target.name]: true
59
+ }));
60
+ validate();
61
+ };
62
+
63
+ const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
64
+ setFormValues({ ...formValues, [event.target.name]: event.target.value });
65
+
66
+ validate();
67
+ };
68
+
69
+ const validate = () => {
70
+ const validationErrors: any = {};
71
+ const { password, repeatPassword } = formValues;
72
+
73
+ // Validate password
74
+ if (!password) {
75
+ validationErrors.password = 'required';
76
+ } else if (touched.password || submitted) {
77
+ const hasNumber = /\d/.test(password);
78
+ const hasCapital = /[A-Z]/.test(password);
79
+
80
+ if (!hasNumber || !hasCapital) {
81
+ validationErrors.passwordComplexity = 'invalid';
82
+ }
83
+ }
84
+
85
+ // Validate repeat password
86
+ if (!repeatPassword) {
87
+ validationErrors.repeatPassword = 'required';
88
+ } else if ((touched.repeatPassword || submitted) && password && repeatPassword !== password) {
89
+ validationErrors.matchPassword = 'mismatch';
90
+ }
91
+
92
+ setErrors(validationErrors);
93
+ return Object.keys(validationErrors).length === 0;
94
+ };
95
+
96
+ const handleResetPassword = async () => {
97
+ setSubmitted(true);
98
+ setTouched({ password: true, repeatPassword: true });
99
+
100
+ const isValid = validate();
101
+
102
+ if (!isValid) return;
103
+
104
+ if (token) {
105
+ try {
106
+ const response = await newPassword(token, formValues.password, tideClientConfig);
107
+ if (response) {
108
+ setPasswordSet(true);
109
+ }
110
+ } catch {
111
+ setErrors((prevErrors: any) => ({
112
+ ...prevErrors,
113
+ api: true
114
+ }));
115
+ setInvalidToken(true);
116
+ }
117
+ }
118
+ };
119
+
120
+ useEffect(() => {
121
+ validate();
122
+ }, [formValues, token]);
123
+
124
+ return (
125
+ <>
126
+ {!passwordSet && !invalidToken && (
127
+ <>
128
+ <h4 className="login__card__title">{translations.LOGIN.RESET_PASSWORD_TITLE}</h4>
129
+
130
+ <form className="login__form" onSubmit={(e) => e.preventDefault()} noValidate>
131
+ <div className="login__form__group">
132
+ <label htmlFor="password">{translations.LOGIN.RESET_PASSWORD_LABEL}</label>
133
+ <input type="password" id="password" name="password" value={formValues.password} onChange={onChange} onBlur={handleBlur} required />
134
+ {(touched.password || submitted) && (errors.password || errors.passwordComplexity) && (
135
+ <div id="username-error" className="login__error">
136
+ {errors.password === 'required' && translations.LOGIN.PASSWORD_REQUIRED}
137
+ {errors.passwordComplexity === 'invalid' && translations.LOGIN.PASSWORD_COMPLEXITY}
138
+ </div>
139
+ )}
140
+ </div>
141
+ <div className="login__form__group">
142
+ <label htmlFor="repeatPassword">{translations.LOGIN.RESET_REPEAT_PASSWORD_LABEL}</label>
143
+ <input
144
+ type="password"
145
+ id="repeatPassword"
146
+ name="repeatPassword"
147
+ value={formValues.repeatPassword}
148
+ onChange={onChange}
149
+ onBlur={handleBlur}
150
+ required
151
+ />
152
+ {(touched.repeatPassword || submitted) && (errors.repeatPassword || errors.matchPassword) && (
153
+ <div id="username-error" className="login__error">
154
+ {errors.repeatPassword === 'required' && translations.LOGIN.REPEAT_PASSWORD_REQUIRED}
155
+ {errors.matchPassword === 'mismatch' && translations.LOGIN.PASSWORDS_DO_NOT_MATCH}
156
+ </div>
157
+ )}
158
+ </div>
159
+
160
+ <button type="button" className="cta cta--primary" onClick={handleResetPassword}>
161
+ {translations.LOGIN.RESET_PASSWORD_SUBMIT_LABEL}
162
+ </button>
163
+ </form>
164
+ </>
165
+ )}
166
+
167
+ {passwordSet && (
168
+ <div className="login__welcome">
169
+ <h3 className="login__card__title">{translations.LOGIN.RESET_PASSWORD_TITLE}</h3>
170
+ <p>{translations.LOGIN.RESET_PASSWORD_SUCCESSFUL_MESSAGE}</p>
171
+ <button className="cta cta--primary" onClick={handleBackToLogin}>
172
+ {translations.LOGIN.BACK_TO_LOGIN}
173
+ </button>
174
+ </div>
175
+ )}
176
+
177
+ {invalidToken && (
178
+ <div className="login__welcome">
179
+ <h3 className="login__card__title">{translations.LOGIN.RESET_PASSWORD_INVALID_TOKEN_TITLE}</h3>
180
+ <p>{translations.LOGIN.RESET_PASSWORD_INVALID_TOKEN_DESCRIPTION}</p>
181
+ <button className="cta cta--primary" onClick={handleBackToLogin}>
182
+ {translations.LOGIN.BACK_TO_LOGIN}
183
+ </button>
184
+ </div>
185
+ )}
186
+ </>
187
+ );
188
+ };
189
+
190
+ export default ResetPasswordComponent;