@qite/tide-booking-component 1.3.3 → 1.3.5

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 (199) hide show
  1. package/build/build-cjs/booking-product/components/age-select.d.ts +8 -8
  2. package/build/build-cjs/booking-product/components/amount-input.d.ts +10 -10
  3. package/build/build-cjs/booking-product/components/date-range-picker/calendar-day.d.ts +12 -12
  4. package/build/build-cjs/booking-product/components/date-range-picker/calendar.d.ts +19 -19
  5. package/build/build-cjs/booking-product/components/date-range-picker/index.d.ts +23 -20
  6. package/build/build-cjs/booking-product/components/dates.d.ts +9 -9
  7. package/build/build-cjs/booking-product/components/footer.d.ts +10 -10
  8. package/build/build-cjs/booking-product/components/header.d.ts +11 -11
  9. package/build/build-cjs/booking-product/components/icon.d.ts +10 -10
  10. package/build/build-cjs/booking-product/components/product.d.ts +9 -9
  11. package/build/build-cjs/booking-product/components/rating.d.ts +6 -6
  12. package/build/build-cjs/booking-product/components/rooms.d.ts +10 -10
  13. package/build/build-cjs/booking-product/index.d.ts +10 -10
  14. package/build/build-cjs/booking-product/settings-context.d.ts +6 -5
  15. package/build/build-cjs/booking-product/types.d.ts +25 -25
  16. package/build/build-cjs/booking-product/utils/api.d.ts +6 -16
  17. package/build/build-cjs/booking-product/utils/price.d.ts +1 -9
  18. package/build/build-cjs/booking-wizard/api-settings-slice.d.ts +4 -14
  19. package/build/build-cjs/booking-wizard/components/icon.d.ts +10 -10
  20. package/build/build-cjs/booking-wizard/components/labeled-input.d.ts +18 -18
  21. package/build/build-cjs/booking-wizard/components/labeled-select.d.ts +21 -21
  22. package/build/build-cjs/booking-wizard/components/message.d.ts +9 -9
  23. package/build/build-cjs/booking-wizard/components/multi-range-filter.d.ts +11 -11
  24. package/build/build-cjs/booking-wizard/components/print-offer-button.d.ts +17 -17
  25. package/build/build-cjs/booking-wizard/components/product-card.d.ts +8 -8
  26. package/build/build-cjs/booking-wizard/components/step-indicator.d.ts +6 -6
  27. package/build/build-cjs/booking-wizard/components/step-route.d.ts +9 -9
  28. package/build/build-cjs/booking-wizard/features/booking/api.d.ts +10 -29
  29. package/build/build-cjs/booking-wizard/features/booking/booking-self-contained.d.ts +8 -8
  30. package/build/build-cjs/booking-wizard/features/booking/booking-slice.d.ts +46 -177
  31. package/build/build-cjs/booking-wizard/features/booking/booking.d.ts +8 -8
  32. package/build/build-cjs/booking-wizard/features/booking/constants.d.ts +8 -15
  33. package/build/build-cjs/booking-wizard/features/booking/selectors.d.ts +136 -308
  34. package/build/build-cjs/booking-wizard/features/confirmation/confirmation.d.ts +5 -4
  35. package/build/build-cjs/booking-wizard/features/error/error.d.ts +5 -4
  36. package/build/build-cjs/booking-wizard/features/flight-options/flight-filter.d.ts +9 -9
  37. package/build/build-cjs/booking-wizard/features/flight-options/flight-option-flight.d.ts +8 -8
  38. package/build/build-cjs/booking-wizard/features/flight-options/flight-option-modal.d.ts +3 -3
  39. package/build/build-cjs/booking-wizard/features/flight-options/flight-option.d.ts +10 -10
  40. package/build/build-cjs/booking-wizard/features/flight-options/flight-utils.d.ts +6 -16
  41. package/build/build-cjs/booking-wizard/features/flight-options/index.d.ts +5 -4
  42. package/build/build-cjs/booking-wizard/features/price-details/price-details-api.d.ts +6 -15
  43. package/build/build-cjs/booking-wizard/features/price-details/price-details-slice.d.ts +80 -121
  44. package/build/build-cjs/booking-wizard/features/price-details/util.d.ts +2 -5
  45. package/build/build-cjs/booking-wizard/features/product-options/no-options.d.ts +3 -3
  46. package/build/build-cjs/booking-wizard/features/product-options/none-option.d.ts +9 -17
  47. package/build/build-cjs/booking-wizard/features/product-options/option-booking-airline-group.d.ts +8 -17
  48. package/build/build-cjs/booking-wizard/features/product-options/option-booking-group.d.ts +12 -18
  49. package/build/build-cjs/booking-wizard/features/product-options/option-item.d.ts +11 -11
  50. package/build/build-cjs/booking-wizard/features/product-options/option-pax-card.d.ts +10 -13
  51. package/build/build-cjs/booking-wizard/features/product-options/option-pax-group.d.ts +13 -20
  52. package/build/build-cjs/booking-wizard/features/product-options/option-room.d.ts +10 -18
  53. package/build/build-cjs/booking-wizard/features/product-options/option-unit-group.d.ts +13 -20
  54. package/build/build-cjs/booking-wizard/features/product-options/option-units-card.d.ts +9 -9
  55. package/build/build-cjs/booking-wizard/features/product-options/options-form.d.ts +5 -4
  56. package/build/build-cjs/booking-wizard/features/room-options/index.d.ts +5 -4
  57. package/build/build-cjs/booking-wizard/features/room-options/room-utils.d.ts +9 -29
  58. package/build/build-cjs/booking-wizard/features/room-options/room.d.ts +12 -15
  59. package/build/build-cjs/booking-wizard/features/room-options/traveler-rooms.d.ts +9 -13
  60. package/build/build-cjs/booking-wizard/features/sidebar/index.d.ts +7 -7
  61. package/build/build-cjs/booking-wizard/features/sidebar/sidebar-flight.d.ts +8 -8
  62. package/build/build-cjs/booking-wizard/features/sidebar/sidebar-util.d.ts +12 -31
  63. package/build/build-cjs/booking-wizard/features/sidebar/sidebar.d.ts +25 -29
  64. package/build/build-cjs/booking-wizard/features/summary/summary-booking-option-pax.d.ts +7 -7
  65. package/build/build-cjs/booking-wizard/features/summary/summary-booking-option-unit.d.ts +7 -7
  66. package/build/build-cjs/booking-wizard/features/summary/summary-flight.d.ts +8 -8
  67. package/build/build-cjs/booking-wizard/features/summary/summary-per-booking-option-group.d.ts +7 -10
  68. package/build/build-cjs/booking-wizard/features/summary/summary-per-pax-option-group.d.ts +7 -10
  69. package/build/build-cjs/booking-wizard/features/summary/summary-per-unit-option-group.d.ts +7 -10
  70. package/build/build-cjs/booking-wizard/features/summary/summary-slice.d.ts +8 -14
  71. package/build/build-cjs/booking-wizard/features/summary/summary.d.ts +5 -4
  72. package/build/build-cjs/booking-wizard/features/travelers-form/travelers-form-slice.d.ts +49 -75
  73. package/build/build-cjs/booking-wizard/features/travelers-form/travelers-form.d.ts +5 -4
  74. package/build/build-cjs/booking-wizard/features/travelers-form/type-ahead-input.d.ts +16 -16
  75. package/build/build-cjs/booking-wizard/features/travelers-form/validate-form.d.ts +4 -9
  76. package/build/build-cjs/booking-wizard/index.d.ts +12 -12
  77. package/build/build-cjs/booking-wizard/settings-context.d.ts +6 -5
  78. package/build/build-cjs/booking-wizard/store.d.ts +24 -44
  79. package/build/build-cjs/booking-wizard/types.d.ts +259 -253
  80. package/build/build-cjs/booking-wizard/use-offer-printer.d.ts +13 -19
  81. package/build/build-cjs/index.d.ts +3 -3
  82. package/build/build-cjs/index.js +7439 -16324
  83. package/build/build-cjs/shared/components/loader.d.ts +6 -6
  84. package/build/build-cjs/shared/types.d.ts +4 -4
  85. package/build/build-cjs/shared/utils/class-util.d.ts +1 -1
  86. package/build/build-cjs/shared/utils/localization-util.d.ts +250 -248
  87. package/build/build-cjs/shared/utils/query-string-util.d.ts +8 -29
  88. package/build/build-cjs/shared/utils/tide-api-utils.d.ts +4 -6
  89. package/build/build-esm/booking-product/components/age-select.d.ts +8 -8
  90. package/build/build-esm/booking-product/components/amount-input.d.ts +10 -10
  91. package/build/build-esm/booking-product/components/date-range-picker/calendar-day.d.ts +12 -12
  92. package/build/build-esm/booking-product/components/date-range-picker/calendar.d.ts +19 -19
  93. package/build/build-esm/booking-product/components/date-range-picker/index.d.ts +23 -20
  94. package/build/build-esm/booking-product/components/dates.d.ts +9 -9
  95. package/build/build-esm/booking-product/components/footer.d.ts +10 -10
  96. package/build/build-esm/booking-product/components/header.d.ts +11 -11
  97. package/build/build-esm/booking-product/components/icon.d.ts +10 -10
  98. package/build/build-esm/booking-product/components/product.d.ts +9 -9
  99. package/build/build-esm/booking-product/components/rating.d.ts +6 -6
  100. package/build/build-esm/booking-product/components/rooms.d.ts +10 -10
  101. package/build/build-esm/booking-product/index.d.ts +10 -10
  102. package/build/build-esm/booking-product/settings-context.d.ts +6 -5
  103. package/build/build-esm/booking-product/types.d.ts +25 -25
  104. package/build/build-esm/booking-product/utils/api.d.ts +6 -16
  105. package/build/build-esm/booking-product/utils/price.d.ts +1 -9
  106. package/build/build-esm/booking-wizard/api-settings-slice.d.ts +4 -14
  107. package/build/build-esm/booking-wizard/components/icon.d.ts +10 -10
  108. package/build/build-esm/booking-wizard/components/labeled-input.d.ts +18 -18
  109. package/build/build-esm/booking-wizard/components/labeled-select.d.ts +21 -21
  110. package/build/build-esm/booking-wizard/components/message.d.ts +9 -9
  111. package/build/build-esm/booking-wizard/components/multi-range-filter.d.ts +11 -11
  112. package/build/build-esm/booking-wizard/components/print-offer-button.d.ts +17 -17
  113. package/build/build-esm/booking-wizard/components/product-card.d.ts +8 -8
  114. package/build/build-esm/booking-wizard/components/step-indicator.d.ts +6 -6
  115. package/build/build-esm/booking-wizard/components/step-route.d.ts +9 -9
  116. package/build/build-esm/booking-wizard/features/booking/api.d.ts +10 -29
  117. package/build/build-esm/booking-wizard/features/booking/booking-self-contained.d.ts +8 -8
  118. package/build/build-esm/booking-wizard/features/booking/booking-slice.d.ts +46 -177
  119. package/build/build-esm/booking-wizard/features/booking/booking.d.ts +8 -8
  120. package/build/build-esm/booking-wizard/features/booking/constants.d.ts +8 -15
  121. package/build/build-esm/booking-wizard/features/booking/selectors.d.ts +136 -308
  122. package/build/build-esm/booking-wizard/features/confirmation/confirmation.d.ts +5 -4
  123. package/build/build-esm/booking-wizard/features/error/error.d.ts +5 -4
  124. package/build/build-esm/booking-wizard/features/flight-options/flight-filter.d.ts +9 -9
  125. package/build/build-esm/booking-wizard/features/flight-options/flight-option-flight.d.ts +8 -8
  126. package/build/build-esm/booking-wizard/features/flight-options/flight-option-modal.d.ts +3 -3
  127. package/build/build-esm/booking-wizard/features/flight-options/flight-option.d.ts +10 -10
  128. package/build/build-esm/booking-wizard/features/flight-options/flight-utils.d.ts +6 -16
  129. package/build/build-esm/booking-wizard/features/flight-options/index.d.ts +5 -4
  130. package/build/build-esm/booking-wizard/features/price-details/price-details-api.d.ts +6 -15
  131. package/build/build-esm/booking-wizard/features/price-details/price-details-slice.d.ts +80 -121
  132. package/build/build-esm/booking-wizard/features/price-details/util.d.ts +2 -5
  133. package/build/build-esm/booking-wizard/features/product-options/no-options.d.ts +3 -3
  134. package/build/build-esm/booking-wizard/features/product-options/none-option.d.ts +9 -17
  135. package/build/build-esm/booking-wizard/features/product-options/option-booking-airline-group.d.ts +8 -17
  136. package/build/build-esm/booking-wizard/features/product-options/option-booking-group.d.ts +12 -18
  137. package/build/build-esm/booking-wizard/features/product-options/option-item.d.ts +11 -11
  138. package/build/build-esm/booking-wizard/features/product-options/option-pax-card.d.ts +10 -13
  139. package/build/build-esm/booking-wizard/features/product-options/option-pax-group.d.ts +13 -20
  140. package/build/build-esm/booking-wizard/features/product-options/option-room.d.ts +10 -18
  141. package/build/build-esm/booking-wizard/features/product-options/option-unit-group.d.ts +13 -20
  142. package/build/build-esm/booking-wizard/features/product-options/option-units-card.d.ts +9 -9
  143. package/build/build-esm/booking-wizard/features/product-options/options-form.d.ts +5 -4
  144. package/build/build-esm/booking-wizard/features/room-options/index.d.ts +5 -4
  145. package/build/build-esm/booking-wizard/features/room-options/room-utils.d.ts +9 -29
  146. package/build/build-esm/booking-wizard/features/room-options/room.d.ts +12 -15
  147. package/build/build-esm/booking-wizard/features/room-options/traveler-rooms.d.ts +9 -13
  148. package/build/build-esm/booking-wizard/features/sidebar/index.d.ts +7 -7
  149. package/build/build-esm/booking-wizard/features/sidebar/sidebar-flight.d.ts +8 -8
  150. package/build/build-esm/booking-wizard/features/sidebar/sidebar-util.d.ts +12 -31
  151. package/build/build-esm/booking-wizard/features/sidebar/sidebar.d.ts +25 -29
  152. package/build/build-esm/booking-wizard/features/summary/summary-booking-option-pax.d.ts +7 -7
  153. package/build/build-esm/booking-wizard/features/summary/summary-booking-option-unit.d.ts +7 -7
  154. package/build/build-esm/booking-wizard/features/summary/summary-flight.d.ts +8 -8
  155. package/build/build-esm/booking-wizard/features/summary/summary-per-booking-option-group.d.ts +7 -10
  156. package/build/build-esm/booking-wizard/features/summary/summary-per-pax-option-group.d.ts +7 -10
  157. package/build/build-esm/booking-wizard/features/summary/summary-per-unit-option-group.d.ts +7 -10
  158. package/build/build-esm/booking-wizard/features/summary/summary-slice.d.ts +8 -14
  159. package/build/build-esm/booking-wizard/features/summary/summary.d.ts +5 -4
  160. package/build/build-esm/booking-wizard/features/travelers-form/travelers-form-slice.d.ts +49 -75
  161. package/build/build-esm/booking-wizard/features/travelers-form/travelers-form.d.ts +5 -4
  162. package/build/build-esm/booking-wizard/features/travelers-form/type-ahead-input.d.ts +16 -16
  163. package/build/build-esm/booking-wizard/features/travelers-form/validate-form.d.ts +4 -9
  164. package/build/build-esm/booking-wizard/index.d.ts +12 -12
  165. package/build/build-esm/booking-wizard/settings-context.d.ts +6 -5
  166. package/build/build-esm/booking-wizard/store.d.ts +24 -44
  167. package/build/build-esm/booking-wizard/types.d.ts +259 -253
  168. package/build/build-esm/booking-wizard/use-offer-printer.d.ts +13 -19
  169. package/build/build-esm/index.d.ts +3 -3
  170. package/build/build-esm/index.js +7427 -15924
  171. package/build/build-esm/shared/components/loader.d.ts +6 -6
  172. package/build/build-esm/shared/types.d.ts +4 -4
  173. package/build/build-esm/shared/utils/class-util.d.ts +1 -1
  174. package/build/build-esm/shared/utils/localization-util.d.ts +250 -248
  175. package/build/build-esm/shared/utils/query-string-util.d.ts +8 -29
  176. package/build/build-esm/shared/utils/tide-api-utils.d.ts +4 -6
  177. package/package.json +75 -75
  178. package/src/booking-wizard/components/print-offer-button.tsx +63 -63
  179. package/src/booking-wizard/features/booking/booking-self-contained.tsx +389 -389
  180. package/src/booking-wizard/features/booking/booking-slice.ts +663 -665
  181. package/src/booking-wizard/features/booking/booking.tsx +361 -361
  182. package/src/booking-wizard/features/flight-options/flight-utils.ts +522 -516
  183. package/src/booking-wizard/features/product-options/options-form.tsx +481 -481
  184. package/src/booking-wizard/features/sidebar/sidebar-util.ts +177 -177
  185. package/src/booking-wizard/features/summary/summary-booking-option-pax.tsx +25 -25
  186. package/src/booking-wizard/features/summary/summary.tsx +674 -674
  187. package/src/booking-wizard/features/travelers-form/travelers-form-slice.ts +164 -164
  188. package/src/booking-wizard/features/travelers-form/travelers-form.tsx +888 -754
  189. package/src/booking-wizard/settings-context.ts +62 -62
  190. package/src/booking-wizard/types.ts +286 -279
  191. package/src/booking-wizard/use-offer-printer.ts +117 -117
  192. package/src/shared/translations/en-GB.json +239 -237
  193. package/src/shared/translations/fr-BE.json +239 -238
  194. package/src/shared/translations/nl-BE.json +239 -237
  195. package/src/shared/utils/tide-api-utils.ts +36 -36
  196. package/styles/booking-wizard-variables.scss +873 -873
  197. package/styles/components/_booking.scss +879 -879
  198. package/styles/components/_dropdown.scss +72 -72
  199. package/styles/components/_form.scss +1583 -1583
@@ -1,665 +1,663 @@
1
- import { PayloadAction, createAsyncThunk, createSlice } from "@reduxjs/toolkit";
2
- import {
3
- BookingAttributes,
4
- BookingOptions,
5
- GroupedFlights,
6
- ProductAttributes,
7
- } from "../../types";
8
-
9
- import {
10
- AirlineBookingPackageOption,
11
- AirportBookingPackageOption,
12
- BookingAirlineGroup,
13
- BookingAirportGroup,
14
- BookingOptionGroup,
15
- BookingOptionPax,
16
- BookingOptionUnit,
17
- BookingPackage,
18
- BookingPackageDetailsRequest,
19
- BookingPackageFlight,
20
- BookingPackagePax,
21
- BookingPackageRequest,
22
- BookingPackageRequestRoom,
23
- BookingPackageRoom,
24
- BookingTravelAgent,
25
- GenerateBookingAccommodationRequest,
26
- PerBookingPackageOption,
27
- SelectedFlight,
28
- } from "@qite/tide-client/build/types";
29
- import { first, isEmpty, isNil, range } from "lodash";
30
- import { RootState } from "../../store";
31
- import { selectAgentId } from "../travelers-form/travelers-form-slice";
32
- import packageApi from "./api";
33
- import { BookingStep, OPTIONS_FORM_STEP } from "./constants";
34
- import {
35
- selectAccommodationCodes,
36
- selectBookingAttributes,
37
- selectBookingRooms,
38
- selectLanguageCode,
39
- selectOfficeId,
40
- selectProductAttributes,
41
- selectProductCode,
42
- } from "./selectors";
43
-
44
- export interface BookingState {
45
- officeId: number;
46
- languageCode: string;
47
- productAttributes?: ProductAttributes;
48
- bookingAttributes?: BookingAttributes;
49
- calculateDeposit: boolean;
50
- bookingNumber?: string;
51
- isRetry: boolean;
52
- package?: BookingPackage;
53
- agents?: BookingTravelAgent[];
54
- isBusy: boolean;
55
- skipPaymentWithAgent: boolean;
56
- generatePaymentUrl: boolean;
57
- isUnavailable?: boolean;
58
- tagIds?: number[];
59
- agentAdressId?: number;
60
- remarks?: string;
61
- voucherCodes?: string[];
62
- bookingOptions: BookingOptions;
63
- bookingType: string;
64
- currentStep: BookingStep;
65
- translations?: {
66
- language: string;
67
- value: any;
68
- }[];
69
- accommodationViewId?: number;
70
- accommodationViews?: { [key: string]: string };
71
- }
72
-
73
- const initialState: BookingState = {
74
- officeId: 1,
75
- languageCode: "nl-BE",
76
- bookingOptions: {
77
- b2b: {
78
- tagIds: [],
79
- entryStatus: 2,
80
- customEntryStatusId: undefined,
81
- },
82
- b2b2c: {
83
- tagIds: [],
84
- entryStatus: 2,
85
- customEntryStatusId: undefined,
86
- },
87
- b2c: {
88
- tagIds: [],
89
- entryStatus: 0,
90
- customEntryStatusId: undefined,
91
- },
92
- },
93
- bookingType: "b2c",
94
- productAttributes: undefined,
95
- bookingAttributes: undefined,
96
- calculateDeposit: false,
97
- bookingNumber: undefined,
98
- isRetry: false,
99
- package: undefined,
100
- isBusy: false,
101
- skipPaymentWithAgent: false,
102
- generatePaymentUrl: false,
103
- tagIds: [],
104
- agentAdressId: undefined,
105
- currentStep: OPTIONS_FORM_STEP,
106
- translations: undefined,
107
- };
108
-
109
- export const fetchPackage = createAsyncThunk(
110
- "booking/fetchPackage",
111
- async (_, { dispatch }) => {
112
- dispatch(setFetchingPackage(true));
113
- await dispatch(fetchAgents());
114
- await dispatch(fetchPackageDetails());
115
- await dispatch(fetchAccommodationViews());
116
- dispatch(setFetchingPackage(false));
117
- }
118
- );
119
-
120
- const fetchAgents = createAsyncThunk(
121
- "booking/agents",
122
- async (_, { dispatch, getState, signal }) => {
123
- const settings = getState() as RootState;
124
- return await packageApi.fetchAgents(signal, settings.apiSettings);
125
- }
126
- );
127
-
128
- const fetchPackageDetails = createAsyncThunk(
129
- "booking/details",
130
- async (_, { dispatch, getState, signal }) => {
131
- const state = getState() as RootState;
132
-
133
- const officeId = selectOfficeId(state);
134
- const productAttributes = selectProductAttributes(state);
135
- const bookingAttributes = selectBookingAttributes(state);
136
- const agentId = selectAgentId(state);
137
- const rooms = selectBookingRooms(state);
138
- const languageCode = selectLanguageCode(state);
139
-
140
- if (isNil(productAttributes)) {
141
- throw Error("productAttributes could not be found");
142
- }
143
-
144
- if (isNil(bookingAttributes)) {
145
- throw Error("bookingAttributes could not be found");
146
- }
147
-
148
- if (!rooms?.length) {
149
- throw Error("rooms could not be found");
150
- }
151
-
152
- var requestRooms = rooms?.map((x, i) => {
153
- var room = { index: i, pax: [] } as BookingPackageRequestRoom;
154
- range(0, x.adults).forEach(() => {
155
- room.pax.push({
156
- age: 30,
157
- } as BookingPackagePax);
158
- });
159
- x.childAges.forEach((x) => {
160
- room.pax.push({
161
- age: x,
162
- } as BookingPackagePax);
163
- });
164
- return room;
165
- });
166
-
167
- const isAllotment =
168
- bookingAttributes.tourCode ||
169
- bookingAttributes.allotmentName ||
170
- (bookingAttributes.allotmentIds && bookingAttributes.allotmentIds.length);
171
-
172
- let searchType = isAllotment
173
- ? 1 // ALLOTMENT
174
- : 0; // DEFAULT;
175
-
176
- let outwardFlight: SelectedFlight | undefined;
177
- let returnFlight: SelectedFlight | undefined;
178
- if (bookingAttributes.flightRouteId && bookingAttributes.flight) {
179
- searchType = 3; // FLIGHT;
180
-
181
- outwardFlight = {
182
- flightCode: bookingAttributes.flight.outwardCode,
183
- startDateTime: bookingAttributes.flight.outwardDepartureDate,
184
- endDateTime: bookingAttributes.flight.outwardArrivalDate,
185
- } as SelectedFlight;
186
-
187
- if (bookingAttributes.flight.returnCode) {
188
- returnFlight = {
189
- flightCode: bookingAttributes.flight.returnCode,
190
- startDateTime: bookingAttributes.flight.returnDepartureDate,
191
- endDateTime: bookingAttributes.flight.returnArrivalDate,
192
- } as SelectedFlight;
193
- }
194
- }
195
-
196
- console.log("bookingAttributes", bookingAttributes);
197
-
198
- const request = {
199
- officeId: officeId,
200
- agentId: agentId,
201
- payload: {
202
- searchType: searchType,
203
- catalogueId: bookingAttributes.catalog,
204
- productCode: productAttributes.productCode,
205
- fromDate: bookingAttributes.startDate,
206
- toDate: bookingAttributes.endDate,
207
- includeFlights: bookingAttributes.includeFlights,
208
- allotmentName: bookingAttributes.allotmentName,
209
- allotmentIds: bookingAttributes.allotmentIds ?? [],
210
- tourCode: bookingAttributes.tourCode,
211
- rooms: requestRooms,
212
- routeId: bookingAttributes.flightRouteId,
213
- outwardFlight: outwardFlight,
214
- returnFlight: returnFlight,
215
- vendorConfigurationId: bookingAttributes.vendorConfigurationId,
216
- } as BookingPackageDetailsRequest,
217
- } as BookingPackageRequest<BookingPackageDetailsRequest>;
218
-
219
- return await packageApi.fetchDetails(
220
- request,
221
- signal,
222
- languageCode,
223
- state.apiSettings
224
- );
225
- }
226
- );
227
-
228
- const fetchAccommodationViews = createAsyncThunk(
229
- "booking/accommodationViews",
230
- async (_, { dispatch, getState, signal }) => {
231
- const state = getState() as RootState;
232
- if (!state.booking.accommodationViewId) return Promise.resolve();
233
-
234
- const languageCode = selectLanguageCode(state);
235
- const accommodationCodes = selectAccommodationCodes(state);
236
- const productCode = selectProductCode(state);
237
-
238
- if (!productCode) {
239
- throw Error("No product selected");
240
- }
241
-
242
- const request = {
243
- languageCode: languageCode,
244
- productCode: productCode,
245
- accommodationCodes: accommodationCodes,
246
- contentViewId: state.booking.accommodationViewId,
247
- } as GenerateBookingAccommodationRequest;
248
-
249
- return await packageApi.fetchAccommodationViews(
250
- request,
251
- signal,
252
- state.apiSettings
253
- );
254
- }
255
- );
256
-
257
- const getActiveOption = (state: BookingState) => {
258
- if (state.package) return state.package.options.find((x) => x.isSelected);
259
- return null;
260
- };
261
-
262
- const changeOutwardFlight = (
263
- state: BookingPackage,
264
- flight: BookingPackageFlight
265
- ) => {
266
- const currentOutwardFlight = state.outwardFlights.find((x) => x.isSelected)!;
267
- const currentReturnFlight = state.returnFlights.find((x) => x.isSelected)!;
268
-
269
- if (currentOutwardFlight?.entryLineGuid == flight.entryLineGuid) return;
270
-
271
- const newFlight = state.outwardFlights.find(
272
- (x) => x.entryLineGuid == flight.entryLineGuid
273
- );
274
- if (newFlight) {
275
- newFlight.isSelected = true;
276
- currentOutwardFlight.isSelected = false;
277
-
278
- if (newFlight.externalGuid) {
279
- if (currentOutwardFlight.externalGuid !== newFlight.externalGuid) {
280
- const newReturnFlight = state.returnFlights.find(
281
- (x) => x.externalGuid === newFlight.externalGuid
282
- )!;
283
-
284
- currentReturnFlight.isSelected = false;
285
- newReturnFlight.isSelected = true;
286
- }
287
- } else if (currentReturnFlight.externalGuid) {
288
- const firstInternal = state.returnFlights.find((x) => !x.externalGuid);
289
-
290
- if (firstInternal) {
291
- currentReturnFlight.isSelected = false;
292
- firstInternal.isSelected = true;
293
- }
294
- }
295
- }
296
- };
297
-
298
- const changeReturnFlight = (
299
- state: BookingPackage,
300
- flight: BookingPackageFlight
301
- ) => {
302
- const currentReturnFlight = state.returnFlights.find((x) => x.isSelected)!;
303
-
304
- if (currentReturnFlight?.entryLineGuid == flight.entryLineGuid) return;
305
-
306
- const newFlight = state.outwardFlights.find(
307
- (x) => x.entryLineGuid == flight.entryLineGuid
308
- );
309
- if (newFlight) {
310
- newFlight.isSelected = true;
311
- currentReturnFlight.isSelected = false;
312
- }
313
- };
314
-
315
- const changePackageOption = (state: BookingPackage) => {
316
- const selectedOutward = state.outwardFlights.find((x) => x.isSelected)!;
317
- const selectedReturn = state.returnFlights.find((x) => x.isSelected)!;
318
- const validOptions = selectedOutward.validOptions.filter((x) =>
319
- selectedReturn.validOptions.some((y) => x === y)
320
- );
321
-
322
- const currentOption = state.options.find((x) => x.isSelected)!;
323
- if (validOptions.some((x) => x === currentOption.id)) return;
324
-
325
- const firstOption = state.options.find((x) =>
326
- validOptions.some((y) => y === x.id)
327
- )!;
328
- currentOption.isSelected = false;
329
- firstOption.isSelected = true;
330
-
331
- const currentRooms = currentOption.rooms.map((r) => {
332
- const selectedOption = r.options.find((o) => o.isSelected)!;
333
-
334
- return {
335
- accommodation: selectedOption?.accommodationCode,
336
- regime: selectedOption?.regimeCode,
337
- };
338
- });
339
-
340
- firstOption.rooms.forEach((r, i) => {
341
- const currentRoom = currentRooms[i];
342
-
343
- const selectedOption = r.options.find((o) => o.isSelected);
344
- const selection = r.options.find(
345
- (x) =>
346
- x.accommodationCode === currentRoom.accommodation &&
347
- x.regimeCode === currentRoom.regime
348
- );
349
-
350
- if (selection) {
351
- if (selection.entryLineGuid !== selectedOption?.entryLineGuid) {
352
- if (selectedOption) selectedOption.isSelected = false;
353
- selection.isSelected = true;
354
- }
355
- } else {
356
- const accommodationSelection = r.options.find(
357
- (x) => x.accommodationCode === currentRoom.accommodation
358
- );
359
- if (accommodationSelection) {
360
- if (
361
- accommodationSelection.entryLineGuid !== selectedOption?.entryLineGuid
362
- ) {
363
- if (selectedOption) selectedOption.isSelected = false;
364
- accommodationSelection.isSelected = true;
365
- }
366
- } else {
367
- const firstOption = r.options[0];
368
- if (firstOption.entryLineGuid !== selectedOption?.entryLineGuid) {
369
- if (selectedOption) selectedOption.isSelected = false;
370
- firstOption.isSelected = true;
371
- }
372
- }
373
- }
374
- });
375
- };
376
-
377
- const bookingSlice = createSlice({
378
- name: "booking",
379
- initialState,
380
- reducers: {
381
- setOfficeId(state, action: PayloadAction<number>) {
382
- state.officeId = action.payload;
383
- },
384
- setLanguageCode(state, action: PayloadAction<string>) {
385
- state.languageCode = action.payload;
386
- },
387
- setTranslations(state, action: PayloadAction<any>) {
388
- state.translations = action.payload;
389
- },
390
- setBookingOptions(state, action: PayloadAction<BookingOptions>) {
391
- state.bookingOptions = action.payload;
392
- },
393
- setBookingType(state, action: PayloadAction<string>) {
394
- state.bookingType = action.payload;
395
- },
396
- setProductAttributes(state, action: PayloadAction<ProductAttributes>) {
397
- state.productAttributes = action.payload;
398
- },
399
- setBookingAttributes(state, action: PayloadAction<BookingAttributes>) {
400
- state.bookingAttributes = action.payload;
401
- },
402
- setCalculateDeposit(state, action: PayloadAction<boolean>) {
403
- state.calculateDeposit = action.payload;
404
- },
405
- setBookingNumber(state, action: PayloadAction<string>) {
406
- state.bookingNumber = action.payload;
407
- },
408
- setIsRetry(state, action: PayloadAction<boolean>) {
409
- state.isRetry = action.payload;
410
- },
411
- setFetchingPackage(state, action: PayloadAction<boolean>) {
412
- state.isBusy = action.payload;
413
- },
414
- setPackage(state, action: PayloadAction<BookingPackage>) {
415
- state.package = action.payload;
416
- },
417
- setPackageRooms(state, action: PayloadAction<BookingPackageRoom[]>) {
418
- const option = getActiveOption(state);
419
- if (option) option.rooms = action.payload;
420
- },
421
- setPackageOptionPax(state, action: PayloadAction<BookingOptionPax[]>) {
422
- const option = getActiveOption(state);
423
- if (option) option.optionPax = action.payload;
424
- },
425
- setPackageOptionUnits(state, action: PayloadAction<BookingOptionUnit[]>) {
426
- const option = getActiveOption(state);
427
- if (option) option.optionUnits = action.payload;
428
- },
429
- setSkipPayment(state, action: PayloadAction<boolean>) {
430
- state.skipPaymentWithAgent = action.payload;
431
- },
432
- setGeneratePaymentUrl(state, action: PayloadAction<boolean>) {
433
- state.generatePaymentUrl = action.payload;
434
- },
435
- setPackageGroups(
436
- state,
437
- action: PayloadAction<BookingOptionGroup<PerBookingPackageOption>[]>
438
- ) {
439
- const option = getActiveOption(state);
440
- if (option) option.groups = action.payload;
441
- },
442
- setPackageAirlineGroups(
443
- state,
444
- action: PayloadAction<BookingAirlineGroup<AirlineBookingPackageOption>[]>
445
- ) {
446
- const option = getActiveOption(state);
447
- if (option) option.airlineGroups = action.payload;
448
- },
449
- setPackageAirportGroups(
450
- state,
451
- action: PayloadAction<BookingAirportGroup<AirportBookingPackageOption>[]>
452
- ) {
453
- const option = getActiveOption(state);
454
- if (option) option.airportGroups = action.payload;
455
- },
456
- setTagIds(state, action: PayloadAction<number[] | undefined>) {
457
- state.tagIds = action.payload;
458
- },
459
- setAgentAdressId(state, action: PayloadAction<number | undefined>) {
460
- state.agentAdressId = action.payload;
461
- },
462
- setBookingRemarks(state, action: PayloadAction<string>) {
463
- state.remarks = action.payload;
464
- },
465
- setVoucherCodes(state, action: PayloadAction<string[]>) {
466
- state.voucherCodes = action.payload;
467
- },
468
- setCurrentStep(state, action: PayloadAction<BookingStep>) {
469
- document.body.scrollTop = 0; // For Safari
470
- document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera
471
-
472
- state.currentStep = action.payload;
473
- },
474
- setFlights(state, action: PayloadAction<GroupedFlights>) {
475
- if (!state.package) return;
476
-
477
- changeOutwardFlight(state.package, action.payload.selectedOutward);
478
- changeReturnFlight(state.package, action.payload.selectedReturn);
479
- changePackageOption(state.package);
480
- },
481
- setAccommodationViewId(state, action: PayloadAction<number>) {
482
- state.accommodationViewId = action.payload;
483
- },
484
- },
485
- extraReducers: (builder) => {
486
- builder.addCase(fetchPackageDetails.fulfilled, (state, action) => {
487
- if (action.payload) {
488
- if (action.payload.errorCode) {
489
- console.error(
490
- action.payload.errorCode,
491
- action.payload.errorMessage,
492
- action.payload.errorDetails
493
- );
494
-
495
- state.isUnavailable = true;
496
- return;
497
- }
498
-
499
- if (!action.payload.payload) {
500
- state.isUnavailable = true;
501
- return;
502
- }
503
-
504
- const bookingRooms = state.bookingAttributes?.rooms;
505
- const flight = state.bookingAttributes?.flight;
506
- const packageDetails = action.payload.payload;
507
-
508
- let activeOption = packageDetails.options.find((x) => x.isSelected)!;
509
-
510
- if (flight) {
511
- const selectedOutward = packageDetails.outwardFlights.find(
512
- (x) => x.isSelected
513
- );
514
- const outwardFlights = packageDetails.outwardFlights.filter(
515
- (x) =>
516
- x.code === flight.outwardCode &&
517
- x.flightMetaData.flightLines[0]!.flightClass ===
518
- flight.outwardClass &&
519
- x.flightMetaData.flightLines.map((y) => y.number).join(",") ===
520
- flight.outwardNumbers.join(",")
521
- );
522
-
523
- // ook bij identieke vertrekvluchten eerst kijken als de returnflight kan gekoppeld worden.
524
- // op die manier moet het juiste koppel selected worden.
525
- // Enkel werkend met externe vluchten
526
- let outwardFlight: BookingPackageFlight | undefined = undefined;
527
- if (!isEmpty(outwardFlights)) {
528
- const returnExternalGuids = packageDetails.returnFlights
529
- .filter(
530
- (x) =>
531
- x.code === flight.returnCode &&
532
- x.flightMetaData.flightLines[0]!.flightClass ===
533
- flight.returnClass &&
534
- x.flightMetaData.flightLines
535
- .map((y) => y.number)
536
- .join(",") === flight.returnNumbers.join(",")
537
- )
538
- .map((f) => f.externalGuid)
539
- .filter((e) => e);
540
- outwardFlight = outwardFlights.find((o) =>
541
- returnExternalGuids.includes(o.externalGuid)
542
- );
543
- if (!outwardFlight) {
544
- outwardFlight = first(outwardFlights);
545
- }
546
- }
547
-
548
- if (selectedOutward && outwardFlight) {
549
- selectedOutward.isSelected = false;
550
- outwardFlight.isSelected = true;
551
- }
552
-
553
- const selectedReturn = packageDetails.returnFlights.find(
554
- (x) => x.isSelected
555
- );
556
- const returnFlight = outwardFlight?.externalGuid
557
- ? packageDetails.returnFlights.find(
558
- (x) => x.externalGuid === outwardFlight?.externalGuid
559
- )
560
- : packageDetails.returnFlights.find(
561
- (x) =>
562
- x.code === flight.returnCode &&
563
- x.flightMetaData.flightLines[0]!.flightClass ===
564
- flight.returnClass &&
565
- x.flightMetaData.flightLines
566
- .map((y) => y.number)
567
- .join(",") === flight.returnNumbers.join(",")
568
- );
569
-
570
- if (selectedReturn && returnFlight) {
571
- selectedReturn.isSelected = false;
572
- returnFlight.isSelected = true;
573
- }
574
-
575
- if (outwardFlight && returnFlight) {
576
- if (!outwardFlight.validOptions.some((x) => x == activeOption.id)) {
577
- activeOption.isSelected = false;
578
-
579
- activeOption = packageDetails.options.find((x) =>
580
- outwardFlight?.validOptions.some((y) => y === x.id)
581
- )!;
582
- activeOption.isSelected = true;
583
- }
584
- }
585
- }
586
-
587
- if (
588
- activeOption &&
589
- bookingRooms?.some((x) => x.accommodationCode || x.regimeCode)
590
- ) {
591
- bookingRooms.forEach((room, i) => {
592
- if (room.accommodationCode || room.regimeCode) {
593
- activeOption.rooms[i].options = activeOption.rooms[i].options.map(
594
- (ro) => ({
595
- ...ro,
596
- isSelected:
597
- ro.accommodationCode == room.accommodationCode &&
598
- ro.regimeCode == room.regimeCode,
599
- })
600
- );
601
- }
602
-
603
- // Fallback to an option that has the requested accommodation OR regime if the requested option is not available. If no fallback is available, select the first option.
604
- if (!activeOption.rooms[i].options.some((x) => x.isSelected)) {
605
- const fallbackOption = activeOption.rooms[i].options.find(
606
- (x) =>
607
- x.accommodationCode == room.accommodationCode ||
608
- x.regimeCode == room.regimeCode
609
- );
610
- if (fallbackOption) {
611
- fallbackOption.isSelected = true;
612
- } else {
613
- activeOption.rooms[i].options[0].isSelected = true;
614
- }
615
- }
616
- });
617
- }
618
-
619
- state.package = packageDetails;
620
- }
621
- });
622
- builder.addCase(fetchAgents.fulfilled, (state, action) => {
623
- if (action.payload) {
624
- state.agents = action.payload;
625
- }
626
- });
627
- builder.addCase(fetchAccommodationViews.fulfilled, (state, action) => {
628
- if (action.payload) {
629
- state.accommodationViews = action.payload;
630
- }
631
- });
632
- },
633
- });
634
-
635
- export const {
636
- setOfficeId,
637
- setLanguageCode,
638
- setTranslations,
639
- setBookingOptions,
640
- setBookingType,
641
- setProductAttributes,
642
- setBookingAttributes,
643
- setCalculateDeposit,
644
- setBookingNumber,
645
- setIsRetry,
646
- setFetchingPackage,
647
- setPackage,
648
- setPackageRooms,
649
- setPackageOptionPax,
650
- setPackageOptionUnits,
651
- setPackageGroups,
652
- setSkipPayment,
653
- setGeneratePaymentUrl,
654
- setTagIds,
655
- setAgentAdressId,
656
- setBookingRemarks,
657
- setVoucherCodes,
658
- setCurrentStep,
659
- setPackageAirlineGroups,
660
- setPackageAirportGroups,
661
- setFlights,
662
- setAccommodationViewId,
663
- } = bookingSlice.actions;
664
-
665
- export default bookingSlice.reducer;
1
+ import { PayloadAction, createAsyncThunk, createSlice } from "@reduxjs/toolkit";
2
+ import {
3
+ BookingAttributes,
4
+ BookingOptions,
5
+ GroupedFlights,
6
+ ProductAttributes,
7
+ } from "../../types";
8
+
9
+ import {
10
+ AirlineBookingPackageOption,
11
+ AirportBookingPackageOption,
12
+ BookingAirlineGroup,
13
+ BookingAirportGroup,
14
+ BookingOptionGroup,
15
+ BookingOptionPax,
16
+ BookingOptionUnit,
17
+ BookingPackage,
18
+ BookingPackageDetailsRequest,
19
+ BookingPackageFlight,
20
+ BookingPackagePax,
21
+ BookingPackageRequest,
22
+ BookingPackageRequestRoom,
23
+ BookingPackageRoom,
24
+ BookingTravelAgent,
25
+ GenerateBookingAccommodationRequest,
26
+ PerBookingPackageOption,
27
+ SelectedFlight,
28
+ } from "@qite/tide-client/build/types";
29
+ import { first, isEmpty, isNil, range } from "lodash";
30
+ import { RootState } from "../../store";
31
+ import { selectAgentId } from "../travelers-form/travelers-form-slice";
32
+ import packageApi from "./api";
33
+ import { BookingStep, OPTIONS_FORM_STEP } from "./constants";
34
+ import {
35
+ selectAccommodationCodes,
36
+ selectBookingAttributes,
37
+ selectBookingRooms,
38
+ selectLanguageCode,
39
+ selectOfficeId,
40
+ selectProductAttributes,
41
+ selectProductCode,
42
+ } from "./selectors";
43
+
44
+ export interface BookingState {
45
+ officeId: number;
46
+ languageCode: string;
47
+ productAttributes?: ProductAttributes;
48
+ bookingAttributes?: BookingAttributes;
49
+ calculateDeposit: boolean;
50
+ bookingNumber?: string;
51
+ isRetry: boolean;
52
+ package?: BookingPackage;
53
+ agents?: BookingTravelAgent[];
54
+ isBusy: boolean;
55
+ skipPaymentWithAgent: boolean;
56
+ generatePaymentUrl: boolean;
57
+ isUnavailable?: boolean;
58
+ tagIds?: number[];
59
+ agentAdressId?: number;
60
+ remarks?: string;
61
+ voucherCodes?: string[];
62
+ bookingOptions: BookingOptions;
63
+ bookingType: string;
64
+ currentStep: BookingStep;
65
+ translations?: {
66
+ language: string;
67
+ value: any;
68
+ }[];
69
+ accommodationViewId?: number;
70
+ accommodationViews?: { [key: string]: string };
71
+ }
72
+
73
+ const initialState: BookingState = {
74
+ officeId: 1,
75
+ languageCode: "nl-BE",
76
+ bookingOptions: {
77
+ b2b: {
78
+ tagIds: [],
79
+ entryStatus: 2,
80
+ customEntryStatusId: undefined,
81
+ },
82
+ b2b2c: {
83
+ tagIds: [],
84
+ entryStatus: 2,
85
+ customEntryStatusId: undefined,
86
+ },
87
+ b2c: {
88
+ tagIds: [],
89
+ entryStatus: 0,
90
+ customEntryStatusId: undefined,
91
+ },
92
+ },
93
+ bookingType: "b2c",
94
+ productAttributes: undefined,
95
+ bookingAttributes: undefined,
96
+ calculateDeposit: false,
97
+ bookingNumber: undefined,
98
+ isRetry: false,
99
+ package: undefined,
100
+ isBusy: false,
101
+ skipPaymentWithAgent: false,
102
+ generatePaymentUrl: false,
103
+ tagIds: [],
104
+ agentAdressId: undefined,
105
+ currentStep: OPTIONS_FORM_STEP,
106
+ translations: undefined,
107
+ };
108
+
109
+ export const fetchPackage = createAsyncThunk(
110
+ "booking/fetchPackage",
111
+ async (_, { dispatch }) => {
112
+ dispatch(setFetchingPackage(true));
113
+ await dispatch(fetchAgents());
114
+ await dispatch(fetchPackageDetails());
115
+ await dispatch(fetchAccommodationViews());
116
+ dispatch(setFetchingPackage(false));
117
+ }
118
+ );
119
+
120
+ const fetchAgents = createAsyncThunk(
121
+ "booking/agents",
122
+ async (_, { dispatch, getState, signal }) => {
123
+ const settings = getState() as RootState;
124
+ return await packageApi.fetchAgents(signal, settings.apiSettings);
125
+ }
126
+ );
127
+
128
+ const fetchPackageDetails = createAsyncThunk(
129
+ "booking/details",
130
+ async (_, { dispatch, getState, signal }) => {
131
+ const state = getState() as RootState;
132
+
133
+ const officeId = selectOfficeId(state);
134
+ const productAttributes = selectProductAttributes(state);
135
+ const bookingAttributes = selectBookingAttributes(state);
136
+ const agentId = selectAgentId(state);
137
+ const rooms = selectBookingRooms(state);
138
+ const languageCode = selectLanguageCode(state);
139
+
140
+ if (isNil(productAttributes)) {
141
+ throw Error("productAttributes could not be found");
142
+ }
143
+
144
+ if (isNil(bookingAttributes)) {
145
+ throw Error("bookingAttributes could not be found");
146
+ }
147
+
148
+ if (!rooms?.length) {
149
+ throw Error("rooms could not be found");
150
+ }
151
+
152
+ var requestRooms = rooms?.map((x, i) => {
153
+ var room = { index: i, pax: [] } as BookingPackageRequestRoom;
154
+ range(0, x.adults).forEach(() => {
155
+ room.pax.push({
156
+ age: 30,
157
+ } as BookingPackagePax);
158
+ });
159
+ x.childAges.forEach((x) => {
160
+ room.pax.push({
161
+ age: x,
162
+ } as BookingPackagePax);
163
+ });
164
+ return room;
165
+ });
166
+
167
+ const isAllotment =
168
+ bookingAttributes.tourCode ||
169
+ bookingAttributes.allotmentName ||
170
+ (bookingAttributes.allotmentIds && bookingAttributes.allotmentIds.length);
171
+
172
+ let searchType = isAllotment
173
+ ? 1 // ALLOTMENT
174
+ : 0; // DEFAULT;
175
+
176
+ let outwardFlight: SelectedFlight | undefined;
177
+ let returnFlight: SelectedFlight | undefined;
178
+ if (bookingAttributes.flightRouteId && bookingAttributes.flight) {
179
+ searchType = 3; // FLIGHT;
180
+
181
+ outwardFlight = {
182
+ flightCode: bookingAttributes.flight.outwardCode,
183
+ startDateTime: bookingAttributes.flight.outwardDepartureDate,
184
+ endDateTime: bookingAttributes.flight.outwardArrivalDate,
185
+ } as SelectedFlight;
186
+
187
+ if (bookingAttributes.flight.returnCode) {
188
+ returnFlight = {
189
+ flightCode: bookingAttributes.flight.returnCode,
190
+ startDateTime: bookingAttributes.flight.returnDepartureDate,
191
+ endDateTime: bookingAttributes.flight.returnArrivalDate,
192
+ } as SelectedFlight;
193
+ }
194
+ }
195
+
196
+ const request = {
197
+ officeId: officeId,
198
+ agentId: agentId,
199
+ payload: {
200
+ searchType: searchType,
201
+ catalogueId: bookingAttributes.catalog,
202
+ productCode: productAttributes.productCode,
203
+ fromDate: bookingAttributes.startDate,
204
+ toDate: bookingAttributes.endDate,
205
+ includeFlights: bookingAttributes.includeFlights,
206
+ allotmentName: bookingAttributes.allotmentName,
207
+ allotmentIds: bookingAttributes.allotmentIds ?? [],
208
+ tourCode: bookingAttributes.tourCode,
209
+ rooms: requestRooms,
210
+ routeId: bookingAttributes.flightRouteId,
211
+ outwardFlight: outwardFlight,
212
+ returnFlight: returnFlight,
213
+ vendorConfigurationId: bookingAttributes.vendorConfigurationId,
214
+ } as BookingPackageDetailsRequest,
215
+ } as BookingPackageRequest<BookingPackageDetailsRequest>;
216
+
217
+ return await packageApi.fetchDetails(
218
+ request,
219
+ signal,
220
+ languageCode,
221
+ state.apiSettings
222
+ );
223
+ }
224
+ );
225
+
226
+ const fetchAccommodationViews = createAsyncThunk(
227
+ "booking/accommodationViews",
228
+ async (_, { dispatch, getState, signal }) => {
229
+ const state = getState() as RootState;
230
+ if (!state.booking.accommodationViewId) return Promise.resolve();
231
+
232
+ const languageCode = selectLanguageCode(state);
233
+ const accommodationCodes = selectAccommodationCodes(state);
234
+ const productCode = selectProductCode(state);
235
+
236
+ if (!productCode) {
237
+ throw Error("No product selected");
238
+ }
239
+
240
+ const request = {
241
+ languageCode: languageCode,
242
+ productCode: productCode,
243
+ accommodationCodes: accommodationCodes,
244
+ contentViewId: state.booking.accommodationViewId,
245
+ } as GenerateBookingAccommodationRequest;
246
+
247
+ return await packageApi.fetchAccommodationViews(
248
+ request,
249
+ signal,
250
+ state.apiSettings
251
+ );
252
+ }
253
+ );
254
+
255
+ const getActiveOption = (state: BookingState) => {
256
+ if (state.package) return state.package.options.find((x) => x.isSelected);
257
+ return null;
258
+ };
259
+
260
+ const changeOutwardFlight = (
261
+ state: BookingPackage,
262
+ flight: BookingPackageFlight
263
+ ) => {
264
+ const currentOutwardFlight = state.outwardFlights.find((x) => x.isSelected)!;
265
+ const currentReturnFlight = state.returnFlights.find((x) => x.isSelected)!;
266
+
267
+ if (currentOutwardFlight?.entryLineGuid == flight.entryLineGuid) return;
268
+
269
+ const newFlight = state.outwardFlights.find(
270
+ (x) => x.entryLineGuid == flight.entryLineGuid
271
+ );
272
+ if (newFlight) {
273
+ newFlight.isSelected = true;
274
+ currentOutwardFlight.isSelected = false;
275
+
276
+ if (newFlight.externalGuid) {
277
+ if (currentOutwardFlight.externalGuid !== newFlight.externalGuid) {
278
+ const newReturnFlight = state.returnFlights.find(
279
+ (x) => x.externalGuid === newFlight.externalGuid
280
+ )!;
281
+
282
+ currentReturnFlight.isSelected = false;
283
+ newReturnFlight.isSelected = true;
284
+ }
285
+ } else if (currentReturnFlight.externalGuid) {
286
+ const firstInternal = state.returnFlights.find((x) => !x.externalGuid);
287
+
288
+ if (firstInternal) {
289
+ currentReturnFlight.isSelected = false;
290
+ firstInternal.isSelected = true;
291
+ }
292
+ }
293
+ }
294
+ };
295
+
296
+ const changeReturnFlight = (
297
+ state: BookingPackage,
298
+ flight: BookingPackageFlight
299
+ ) => {
300
+ const currentReturnFlight = state.returnFlights.find((x) => x.isSelected)!;
301
+
302
+ if (currentReturnFlight?.entryLineGuid == flight.entryLineGuid) return;
303
+
304
+ const newFlight = state.outwardFlights.find(
305
+ (x) => x.entryLineGuid == flight.entryLineGuid
306
+ );
307
+ if (newFlight) {
308
+ newFlight.isSelected = true;
309
+ currentReturnFlight.isSelected = false;
310
+ }
311
+ };
312
+
313
+ const changePackageOption = (state: BookingPackage) => {
314
+ const selectedOutward = state.outwardFlights.find((x) => x.isSelected)!;
315
+ const selectedReturn = state.returnFlights.find((x) => x.isSelected)!;
316
+ const validOptions = selectedOutward.validOptions.filter((x) =>
317
+ selectedReturn.validOptions.some((y) => x === y)
318
+ );
319
+
320
+ const currentOption = state.options.find((x) => x.isSelected)!;
321
+ if (validOptions.some((x) => x === currentOption.id)) return;
322
+
323
+ const firstOption = state.options.find((x) =>
324
+ validOptions.some((y) => y === x.id)
325
+ )!;
326
+ currentOption.isSelected = false;
327
+ firstOption.isSelected = true;
328
+
329
+ const currentRooms = currentOption.rooms.map((r) => {
330
+ const selectedOption = r.options.find((o) => o.isSelected)!;
331
+
332
+ return {
333
+ accommodation: selectedOption?.accommodationCode,
334
+ regime: selectedOption?.regimeCode,
335
+ };
336
+ });
337
+
338
+ firstOption.rooms.forEach((r, i) => {
339
+ const currentRoom = currentRooms[i];
340
+
341
+ const selectedOption = r.options.find((o) => o.isSelected);
342
+ const selection = r.options.find(
343
+ (x) =>
344
+ x.accommodationCode === currentRoom.accommodation &&
345
+ x.regimeCode === currentRoom.regime
346
+ );
347
+
348
+ if (selection) {
349
+ if (selection.entryLineGuid !== selectedOption?.entryLineGuid) {
350
+ if (selectedOption) selectedOption.isSelected = false;
351
+ selection.isSelected = true;
352
+ }
353
+ } else {
354
+ const accommodationSelection = r.options.find(
355
+ (x) => x.accommodationCode === currentRoom.accommodation
356
+ );
357
+ if (accommodationSelection) {
358
+ if (
359
+ accommodationSelection.entryLineGuid !== selectedOption?.entryLineGuid
360
+ ) {
361
+ if (selectedOption) selectedOption.isSelected = false;
362
+ accommodationSelection.isSelected = true;
363
+ }
364
+ } else {
365
+ const firstOption = r.options[0];
366
+ if (firstOption.entryLineGuid !== selectedOption?.entryLineGuid) {
367
+ if (selectedOption) selectedOption.isSelected = false;
368
+ firstOption.isSelected = true;
369
+ }
370
+ }
371
+ }
372
+ });
373
+ };
374
+
375
+ const bookingSlice = createSlice({
376
+ name: "booking",
377
+ initialState,
378
+ reducers: {
379
+ setOfficeId(state, action: PayloadAction<number>) {
380
+ state.officeId = action.payload;
381
+ },
382
+ setLanguageCode(state, action: PayloadAction<string>) {
383
+ state.languageCode = action.payload;
384
+ },
385
+ setTranslations(state, action: PayloadAction<any>) {
386
+ state.translations = action.payload;
387
+ },
388
+ setBookingOptions(state, action: PayloadAction<BookingOptions>) {
389
+ state.bookingOptions = action.payload;
390
+ },
391
+ setBookingType(state, action: PayloadAction<string>) {
392
+ state.bookingType = action.payload;
393
+ },
394
+ setProductAttributes(state, action: PayloadAction<ProductAttributes>) {
395
+ state.productAttributes = action.payload;
396
+ },
397
+ setBookingAttributes(state, action: PayloadAction<BookingAttributes>) {
398
+ state.bookingAttributes = action.payload;
399
+ },
400
+ setCalculateDeposit(state, action: PayloadAction<boolean>) {
401
+ state.calculateDeposit = action.payload;
402
+ },
403
+ setBookingNumber(state, action: PayloadAction<string>) {
404
+ state.bookingNumber = action.payload;
405
+ },
406
+ setIsRetry(state, action: PayloadAction<boolean>) {
407
+ state.isRetry = action.payload;
408
+ },
409
+ setFetchingPackage(state, action: PayloadAction<boolean>) {
410
+ state.isBusy = action.payload;
411
+ },
412
+ setPackage(state, action: PayloadAction<BookingPackage>) {
413
+ state.package = action.payload;
414
+ },
415
+ setPackageRooms(state, action: PayloadAction<BookingPackageRoom[]>) {
416
+ const option = getActiveOption(state);
417
+ if (option) option.rooms = action.payload;
418
+ },
419
+ setPackageOptionPax(state, action: PayloadAction<BookingOptionPax[]>) {
420
+ const option = getActiveOption(state);
421
+ if (option) option.optionPax = action.payload;
422
+ },
423
+ setPackageOptionUnits(state, action: PayloadAction<BookingOptionUnit[]>) {
424
+ const option = getActiveOption(state);
425
+ if (option) option.optionUnits = action.payload;
426
+ },
427
+ setSkipPayment(state, action: PayloadAction<boolean>) {
428
+ state.skipPaymentWithAgent = action.payload;
429
+ },
430
+ setGeneratePaymentUrl(state, action: PayloadAction<boolean>) {
431
+ state.generatePaymentUrl = action.payload;
432
+ },
433
+ setPackageGroups(
434
+ state,
435
+ action: PayloadAction<BookingOptionGroup<PerBookingPackageOption>[]>
436
+ ) {
437
+ const option = getActiveOption(state);
438
+ if (option) option.groups = action.payload;
439
+ },
440
+ setPackageAirlineGroups(
441
+ state,
442
+ action: PayloadAction<BookingAirlineGroup<AirlineBookingPackageOption>[]>
443
+ ) {
444
+ const option = getActiveOption(state);
445
+ if (option) option.airlineGroups = action.payload;
446
+ },
447
+ setPackageAirportGroups(
448
+ state,
449
+ action: PayloadAction<BookingAirportGroup<AirportBookingPackageOption>[]>
450
+ ) {
451
+ const option = getActiveOption(state);
452
+ if (option) option.airportGroups = action.payload;
453
+ },
454
+ setTagIds(state, action: PayloadAction<number[] | undefined>) {
455
+ state.tagIds = action.payload;
456
+ },
457
+ setAgentAdressId(state, action: PayloadAction<number | undefined>) {
458
+ state.agentAdressId = action.payload;
459
+ },
460
+ setBookingRemarks(state, action: PayloadAction<string>) {
461
+ state.remarks = action.payload;
462
+ },
463
+ setVoucherCodes(state, action: PayloadAction<string[]>) {
464
+ state.voucherCodes = action.payload;
465
+ },
466
+ setCurrentStep(state, action: PayloadAction<BookingStep>) {
467
+ document.body.scrollTop = 0; // For Safari
468
+ document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera
469
+
470
+ state.currentStep = action.payload;
471
+ },
472
+ setFlights(state, action: PayloadAction<GroupedFlights>) {
473
+ if (!state.package) return;
474
+
475
+ changeOutwardFlight(state.package, action.payload.selectedOutward);
476
+ changeReturnFlight(state.package, action.payload.selectedReturn);
477
+ changePackageOption(state.package);
478
+ },
479
+ setAccommodationViewId(state, action: PayloadAction<number>) {
480
+ state.accommodationViewId = action.payload;
481
+ },
482
+ },
483
+ extraReducers: (builder) => {
484
+ builder.addCase(fetchPackageDetails.fulfilled, (state, action) => {
485
+ if (action.payload) {
486
+ if (action.payload.errorCode) {
487
+ console.error(
488
+ action.payload.errorCode,
489
+ action.payload.errorMessage,
490
+ action.payload.errorDetails
491
+ );
492
+
493
+ state.isUnavailable = true;
494
+ return;
495
+ }
496
+
497
+ if (!action.payload.payload) {
498
+ state.isUnavailable = true;
499
+ return;
500
+ }
501
+
502
+ const bookingRooms = state.bookingAttributes?.rooms;
503
+ const flight = state.bookingAttributes?.flight;
504
+ const packageDetails = action.payload.payload;
505
+
506
+ let activeOption = packageDetails.options.find((x) => x.isSelected)!;
507
+
508
+ if (flight) {
509
+ const selectedOutward = packageDetails.outwardFlights.find(
510
+ (x) => x.isSelected
511
+ );
512
+ const outwardFlights = packageDetails.outwardFlights.filter(
513
+ (x) =>
514
+ x.code === flight.outwardCode &&
515
+ x.flightMetaData.flightLines[0]!.flightClass ===
516
+ flight.outwardClass &&
517
+ x.flightMetaData.flightLines.map((y) => y.number).join(",") ===
518
+ flight.outwardNumbers.join(",")
519
+ );
520
+
521
+ // ook bij identieke vertrekvluchten eerst kijken als de returnflight kan gekoppeld worden.
522
+ // op die manier moet het juiste koppel selected worden.
523
+ // Enkel werkend met externe vluchten
524
+ let outwardFlight: BookingPackageFlight | undefined = undefined;
525
+ if (!isEmpty(outwardFlights)) {
526
+ const returnExternalGuids = packageDetails.returnFlights
527
+ .filter(
528
+ (x) =>
529
+ x.code === flight.returnCode &&
530
+ x.flightMetaData.flightLines[0]!.flightClass ===
531
+ flight.returnClass &&
532
+ x.flightMetaData.flightLines
533
+ .map((y) => y.number)
534
+ .join(",") === flight.returnNumbers.join(",")
535
+ )
536
+ .map((f) => f.externalGuid)
537
+ .filter((e) => e);
538
+ outwardFlight = outwardFlights.find((o) =>
539
+ returnExternalGuids.includes(o.externalGuid)
540
+ );
541
+ if (!outwardFlight) {
542
+ outwardFlight = first(outwardFlights);
543
+ }
544
+ }
545
+
546
+ if (selectedOutward && outwardFlight) {
547
+ selectedOutward.isSelected = false;
548
+ outwardFlight.isSelected = true;
549
+ }
550
+
551
+ const selectedReturn = packageDetails.returnFlights.find(
552
+ (x) => x.isSelected
553
+ );
554
+ const returnFlight = outwardFlight?.externalGuid
555
+ ? packageDetails.returnFlights.find(
556
+ (x) => x.externalGuid === outwardFlight?.externalGuid
557
+ )
558
+ : packageDetails.returnFlights.find(
559
+ (x) =>
560
+ x.code === flight.returnCode &&
561
+ x.flightMetaData.flightLines[0]!.flightClass ===
562
+ flight.returnClass &&
563
+ x.flightMetaData.flightLines
564
+ .map((y) => y.number)
565
+ .join(",") === flight.returnNumbers.join(",")
566
+ );
567
+
568
+ if (selectedReturn && returnFlight) {
569
+ selectedReturn.isSelected = false;
570
+ returnFlight.isSelected = true;
571
+ }
572
+
573
+ if (outwardFlight && returnFlight) {
574
+ if (!outwardFlight.validOptions.some((x) => x == activeOption.id)) {
575
+ activeOption.isSelected = false;
576
+
577
+ activeOption = packageDetails.options.find((x) =>
578
+ outwardFlight?.validOptions.some((y) => y === x.id)
579
+ )!;
580
+ activeOption.isSelected = true;
581
+ }
582
+ }
583
+ }
584
+
585
+ if (
586
+ activeOption &&
587
+ bookingRooms?.some((x) => x.accommodationCode || x.regimeCode)
588
+ ) {
589
+ bookingRooms.forEach((room, i) => {
590
+ if (room.accommodationCode || room.regimeCode) {
591
+ activeOption.rooms[i].options = activeOption.rooms[i].options.map(
592
+ (ro) => ({
593
+ ...ro,
594
+ isSelected:
595
+ ro.accommodationCode == room.accommodationCode &&
596
+ ro.regimeCode == room.regimeCode,
597
+ })
598
+ );
599
+ }
600
+
601
+ // Fallback to an option that has the requested accommodation OR regime if the requested option is not available. If no fallback is available, select the first option.
602
+ if (!activeOption.rooms[i].options.some((x) => x.isSelected)) {
603
+ const fallbackOption = activeOption.rooms[i].options.find(
604
+ (x) =>
605
+ x.accommodationCode == room.accommodationCode ||
606
+ x.regimeCode == room.regimeCode
607
+ );
608
+ if (fallbackOption) {
609
+ fallbackOption.isSelected = true;
610
+ } else {
611
+ activeOption.rooms[i].options[0].isSelected = true;
612
+ }
613
+ }
614
+ });
615
+ }
616
+
617
+ state.package = packageDetails;
618
+ }
619
+ });
620
+ builder.addCase(fetchAgents.fulfilled, (state, action) => {
621
+ if (action.payload) {
622
+ state.agents = action.payload;
623
+ }
624
+ });
625
+ builder.addCase(fetchAccommodationViews.fulfilled, (state, action) => {
626
+ if (action.payload) {
627
+ state.accommodationViews = action.payload;
628
+ }
629
+ });
630
+ },
631
+ });
632
+
633
+ export const {
634
+ setOfficeId,
635
+ setLanguageCode,
636
+ setTranslations,
637
+ setBookingOptions,
638
+ setBookingType,
639
+ setProductAttributes,
640
+ setBookingAttributes,
641
+ setCalculateDeposit,
642
+ setBookingNumber,
643
+ setIsRetry,
644
+ setFetchingPackage,
645
+ setPackage,
646
+ setPackageRooms,
647
+ setPackageOptionPax,
648
+ setPackageOptionUnits,
649
+ setPackageGroups,
650
+ setSkipPayment,
651
+ setGeneratePaymentUrl,
652
+ setTagIds,
653
+ setAgentAdressId,
654
+ setBookingRemarks,
655
+ setVoucherCodes,
656
+ setCurrentStep,
657
+ setPackageAirlineGroups,
658
+ setPackageAirportGroups,
659
+ setFlights,
660
+ setAccommodationViewId,
661
+ } = bookingSlice.actions;
662
+
663
+ export default bookingSlice.reducer;