@qite/tide-booking-component 1.4.99 → 1.4.100

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.
@@ -12791,7 +12791,7 @@ PERFORMANCE OF THIS SOFTWARE.
12791
12791
  return ENDPOINT$8 + '/details/' + transactionId + '/alternate-flights';
12792
12792
  };
12793
12793
  var ENDPOINT_BOOKABLE_DATES = ENDPOINT$8 + '/bookable-dates';
12794
- var ENDPOINT_PRICE_DETAILS = ENDPOINT$8 + '/price-details';
12794
+ var ENDPOINT_PRICE_DETAILS$1 = ENDPOINT$8 + '/price-details';
12795
12795
  var ENDPOINT_BOOK = ENDPOINT$8 + '/book';
12796
12796
  var ENDPOINT_UPDATE = ENDPOINT$8 + '/update';
12797
12797
  var ENDPOINT_AGENTS = ENDPOINT$8 + '/agents';
@@ -12891,7 +12891,7 @@ PERFORMANCE OF THIS SOFTWARE.
12891
12891
  return post(url, apiKey, body, config.token, signal, true);
12892
12892
  };
12893
12893
  var priceDetails = function (config, request, signal, languageCode) {
12894
- var url = '' + config.host + ENDPOINT_PRICE_DETAILS;
12894
+ var url = '' + config.host + ENDPOINT_PRICE_DETAILS$1;
12895
12895
  var apiKey = config.apiKey;
12896
12896
  var body = JSON.stringify(request);
12897
12897
  return post(url, apiKey, body, config.token, signal, true, languageCode);
@@ -13417,6 +13417,7 @@ PERFORMANCE OF THIS SOFTWARE.
13417
13417
  var ENDPOINT = '/api/web/packaging';
13418
13418
  var ENDPOINT_START_TRANSACTION = ENDPOINT + '/start';
13419
13419
  var ENDPOINT_ACCOMMODATIONS = ENDPOINT + '/accommodations';
13420
+ var ENDPOINT_PRICE_DETAILS = ENDPOINT + '/price-details';
13420
13421
  var ENDPOINT_ENTRY = function (magicLinkCode) {
13421
13422
  return ENDPOINT + '/entry/' + magicLinkCode;
13422
13423
  };
@@ -13437,6 +13438,12 @@ PERFORMANCE OF THIS SOFTWARE.
13437
13438
  var url = '' + config.host + ENDPOINT_ENTRY(magicLinkCode);
13438
13439
  return get(url, apiKey, config.token, signal, true);
13439
13440
  };
13441
+ var getPriceDetails = function (config, request, signal) {
13442
+ var url = '' + config.host + ENDPOINT_PRICE_DETAILS;
13443
+ var apiKey = config.apiKey;
13444
+ var body = JSON.stringify(request);
13445
+ return post(url, apiKey, body, config.token, signal, true);
13446
+ };
13440
13447
 
13441
13448
  exports.AllotmentType = AllotmentType;
13442
13449
  exports.ContactForm = ContactForm;
@@ -13492,6 +13499,7 @@ PERFORMANCE OF THIS SOFTWARE.
13492
13499
  exports.getLocations = getLocations;
13493
13500
  exports.getMolliePayment = getMolliePayment;
13494
13501
  exports.getPortal = getPortal;
13502
+ exports.getPriceDetails = getPriceDetails;
13495
13503
  exports.getPrintActions = getPrintActions;
13496
13504
  exports.getStyleSheet = getStyleSheet;
13497
13505
  exports.getTranslationDictionary = getTranslationDictionary;
@@ -33812,7 +33820,8 @@ var initialState$1 = {
33812
33820
  flyInIsOpen: false,
33813
33821
  editablePackagingEntry: null,
33814
33822
  transactionId: null,
33815
- accommodationFlyInStep: 'details'
33823
+ accommodationFlyInStep: 'details',
33824
+ priceDetails: null
33816
33825
  };
33817
33826
  var searchResultsSlice = toolkit.createSlice({
33818
33827
  name: 'searchResults',
@@ -33905,6 +33914,9 @@ var searchResultsSlice = toolkit.createSlice({
33905
33914
  },
33906
33915
  setAccommodationFlyInStep: function (state, action) {
33907
33916
  state.accommodationFlyInStep = action.payload;
33917
+ },
33918
+ setPriceDetails: function (state, action) {
33919
+ state.priceDetails = action.payload;
33908
33920
  }
33909
33921
  }
33910
33922
  });
@@ -33929,7 +33941,8 @@ _a.resetSearchState;
33929
33941
  var setFlyInIsOpen = _a.setFlyInIsOpen,
33930
33942
  setEditablePackagingEntry = _a.setEditablePackagingEntry,
33931
33943
  setTransactionId = _a.setTransactionId,
33932
- setAccommodationFlyInStep = _a.setAccommodationFlyInStep;
33944
+ setAccommodationFlyInStep = _a.setAccommodationFlyInStep,
33945
+ setPriceDetails = _a.setPriceDetails;
33933
33946
  var searchResultsReducer = searchResultsSlice.reducer;
33934
33947
 
33935
33948
  var ItemPicker = function (_a) {
@@ -35195,14 +35208,16 @@ var getSegmentTitle = function (segment) {
35195
35208
  var Itinerary = function (_a) {
35196
35209
  var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
35197
35210
  var isOpen = _a.isOpen,
35198
- handleSetIsOpen = _a.handleSetIsOpen;
35199
- _a.isLoading;
35200
- var onEditAccommodation = _a.onEditAccommodation;
35211
+ handleSetIsOpen = _a.handleSetIsOpen,
35212
+ isLoading = _a.isLoading,
35213
+ onEditAccommodation = _a.onEditAccommodation;
35201
35214
  var context = React.useContext(SearchResultsConfigurationContext);
35202
35215
  var translations = getTranslations((_b = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _b !== void 0 ? _b : 'en-GB');
35203
- var editablePackagingEntry = reactRedux.useSelector(function (state) {
35204
- return state.searchResults;
35205
- }).editablePackagingEntry;
35216
+ var _q = reactRedux.useSelector(function (state) {
35217
+ return state.searchResults;
35218
+ }),
35219
+ editablePackagingEntry = _q.editablePackagingEntry,
35220
+ priceDetails = _q.priceDetails;
35206
35221
  var packagingEntry =
35207
35222
  editablePackagingEntry !== null && editablePackagingEntry !== void 0
35208
35223
  ? editablePackagingEntry
@@ -35290,7 +35305,7 @@ var Itinerary = function (_a) {
35290
35305
  console.log('otherSegments', otherSegments);
35291
35306
  console.log('groupedOtherSegments', groupedOtherSegments);
35292
35307
  var numberOfPax = ((_p = packagingEntry.pax) === null || _p === void 0 ? void 0 : _p.length) || 1;
35293
- var totalPrice = packagingEntry.price || 0;
35308
+ var totalPrice = (priceDetails === null || priceDetails === void 0 ? void 0 : priceDetails.total) || packagingEntry.price || 0;
35294
35309
  var pricePerPerson = totalPrice / numberOfPax;
35295
35310
  return React__default['default'].createElement(
35296
35311
  'div',
@@ -35346,18 +35361,24 @@ var Itinerary = function (_a) {
35346
35361
  React__default['default'].createElement(
35347
35362
  'div',
35348
35363
  { className: 'search__filter__prices' },
35349
- React__default['default'].createElement(
35350
- 'div',
35351
- { className: 'search__filter__prices__wrapper' },
35352
- React__default['default'].createElement('h3', { className: 'search__filter__prices--amount' }, formatPrice$2(pricePerPerson, 'EUR')),
35353
- React__default['default'].createElement('p', null, translations.SRP.PACKAGE_PRICE_PER_PERSON),
35354
- React__default['default'].createElement(
35355
- 'p',
35356
- null,
35357
- React__default['default'].createElement('strong', null, '(', formatPrice$2(totalPrice, 'EUR'), ' ', translations.SRP.TOTAL, ')')
35358
- )
35359
- ),
35360
- React__default['default'].createElement('button', { className: 'cta' }, translations.QSM.CONFIRM)
35364
+ isLoading
35365
+ ? React__default['default'].createElement(Spinner, null)
35366
+ : React__default['default'].createElement(
35367
+ React__default['default'].Fragment,
35368
+ null,
35369
+ React__default['default'].createElement(
35370
+ 'div',
35371
+ { className: 'search__filter__prices__wrapper' },
35372
+ React__default['default'].createElement('h3', { className: 'search__filter__prices--amount' }, formatPrice$2(pricePerPerson, 'EUR')),
35373
+ React__default['default'].createElement('p', null, translations.SRP.PACKAGE_PRICE_PER_PERSON),
35374
+ React__default['default'].createElement(
35375
+ 'p',
35376
+ null,
35377
+ React__default['default'].createElement('strong', null, '(', formatPrice$2(totalPrice, 'EUR'), ' ', translations.SRP.TOTAL, ')')
35378
+ )
35379
+ ),
35380
+ React__default['default'].createElement('button', { className: 'cta' }, translations.QSM.CONFIRM)
35381
+ )
35361
35382
  ),
35362
35383
  React__default['default'].createElement(
35363
35384
  'div',
@@ -47236,14 +47257,6 @@ var getSelectedOptionsPerRoom = function (details) {
47236
47257
  };
47237
47258
  });
47238
47259
  };
47239
- var getRoomIndexFromLine = function (line) {
47240
- var _a, _b;
47241
- if (!((_a = line.pax) === null || _a === void 0 ? void 0 : _a.length)) return 0;
47242
- var firstPax = __spreadArray([], line.pax, true).sort(function (a, b) {
47243
- return a.order - b.order;
47244
- })[0];
47245
- return (_b = firstPax === null || firstPax === void 0 ? void 0 : firstPax.room) !== null && _b !== void 0 ? _b : 0;
47246
- };
47247
47260
  var getRequestRoomsFromPackagingSegments = function (entry, segments) {
47248
47261
  var _a;
47249
47262
  var accommodationLines = __spreadArray([], segments !== null && segments !== void 0 ? segments : [], true)
@@ -47347,11 +47360,14 @@ var SearchResultsContainer = function () {
47347
47360
  detailsIsLoading = _g[0],
47348
47361
  setDetailsIsLoading = _g[1];
47349
47362
  var _h = React.useState(false),
47350
- itineraryOpen = _h[0],
47351
- setItineraryOpen = _h[1];
47352
- var _j = React.useState(null),
47353
- selectedAccommodationSeed = _j[0],
47354
- setSelectedAccommodationSeed = _j[1];
47363
+ pricesAreLoading = _h[0],
47364
+ setPricesAreLoading = _h[1];
47365
+ var _j = React.useState(false),
47366
+ itineraryOpen = _j[0],
47367
+ setItineraryOpen = _j[1];
47368
+ var _k = React.useState(null),
47369
+ selectedAccommodationSeed = _k[0],
47370
+ setSelectedAccommodationSeed = _k[1];
47355
47371
  var panelRef = React.useRef(null);
47356
47372
  var sortByTypes = [
47357
47373
  { direction: 'asc', label: 'default' },
@@ -47568,20 +47584,21 @@ var SearchResultsContainer = function () {
47568
47584
  var details = packagingAccoSearchDetails;
47569
47585
  if (!sourceEntry || !(details === null || details === void 0 ? void 0 : details.length)) return null;
47570
47586
  var selectedOptionsPerRoom = getSelectedOptionsPerRoom(details);
47587
+ console.log('Selected options per room', selectedOptionsPerRoom);
47571
47588
  if (!selectedOptionsPerRoom.length) return null;
47572
47589
  var selectedHotel = details[0];
47590
+ var roomIndex = 0;
47573
47591
  var updatedLines = sourceEntry.lines.map(function (line) {
47574
47592
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
47575
47593
  if (line.serviceType !== ACCOMMODATION_SERVICE_TYPE) {
47576
47594
  return line;
47577
47595
  }
47578
- // TODO: fix roomIndex
47579
- var roomIndex = getRoomIndexFromLine(line);
47580
- console.log('Processing line', line, 'with room index', roomIndex);
47581
47596
  var selectedRoom = selectedOptionsPerRoom.find(function (x) {
47582
47597
  return x.roomIndex === roomIndex;
47583
47598
  });
47584
47599
  var selectedOption = selectedRoom === null || selectedRoom === void 0 ? void 0 : selectedRoom.option;
47600
+ console.log('selectedRoom and selectedOption for line', line, selectedRoom, selectedOption);
47601
+ roomIndex++;
47585
47602
  if (!selectedOption) {
47586
47603
  return line;
47587
47604
  }
@@ -48131,6 +48148,52 @@ var SearchResultsContainer = function () {
48131
48148
  rooms: getRequestRoomsFromPackagingSegments(entry, sortedSegments)
48132
48149
  };
48133
48150
  };
48151
+ React.useEffect(
48152
+ function () {
48153
+ var fetchPriceDetails = function () {
48154
+ return __awaiter(void 0, void 0, void 0, function () {
48155
+ var config, priceDetails, err_6;
48156
+ return __generator(this, function (_a) {
48157
+ switch (_a.label) {
48158
+ case 0:
48159
+ console.log(
48160
+ 'Fetching price details for entry',
48161
+ editablePackagingEntry !== null && editablePackagingEntry !== void 0
48162
+ ? editablePackagingEntry
48163
+ : context === null || context === void 0
48164
+ ? void 0
48165
+ : context.packagingEntry
48166
+ );
48167
+ if (!context || !editablePackagingEntry) return [2 /*return*/];
48168
+ setPricesAreLoading(true);
48169
+ _a.label = 1;
48170
+ case 1:
48171
+ _a.trys.push([1, 3, , 4]);
48172
+ config = {
48173
+ host: context.tideConnection.host,
48174
+ apiKey: context.tideConnection.apiKey
48175
+ };
48176
+ return [4 /*yield*/, build.getPriceDetails(config, editablePackagingEntry)];
48177
+ case 2:
48178
+ priceDetails = _a.sent();
48179
+ dispatch(setPriceDetails(priceDetails));
48180
+ setPricesAreLoading(false);
48181
+ return [3 /*break*/, 4];
48182
+ case 3:
48183
+ err_6 = _a.sent();
48184
+ console.error('Error fetching price details', err_6);
48185
+ setPricesAreLoading(false);
48186
+ return [3 /*break*/, 4];
48187
+ case 4:
48188
+ return [2 /*return*/];
48189
+ }
48190
+ });
48191
+ });
48192
+ };
48193
+ fetchPriceDetails();
48194
+ },
48195
+ [editablePackagingEntry]
48196
+ );
48134
48197
  return React__default['default'].createElement(
48135
48198
  'div',
48136
48199
  { id: 'tide-booking', className: 'search__bg' },
@@ -48182,7 +48245,7 @@ var SearchResultsContainer = function () {
48182
48245
  handleSetIsOpen: function () {
48183
48246
  return setItineraryOpen(!itineraryOpen);
48184
48247
  },
48185
- isLoading: isLoading,
48248
+ isLoading: pricesAreLoading,
48186
48249
  onEditAccommodation: handleEditAccommodation
48187
48250
  }),
48188
48251
  React__default['default'].createElement(
@@ -1,5 +1,5 @@
1
1
  import { AccommodationFlyInStep, ExtendedFlightSearchResponseItem, Filter, SortByType } from '../types';
2
- import { BookingPackage, BookingPackageItem, PackagingAccommodationResponse, PackagingEntry } from '@qite/tide-client/build/types';
2
+ import { BookingPackage, BookingPackageItem, BookingPriceDetails, PackagingAccommodationResponse, PackagingEntry } from '@qite/tide-client/build/types';
3
3
  export interface SearchResultsState {
4
4
  results: BookingPackageItem[];
5
5
  filteredResults: BookingPackageItem[];
@@ -20,6 +20,7 @@ export interface SearchResultsState {
20
20
  editablePackagingEntry: PackagingEntry | null;
21
21
  transactionId: string | null;
22
22
  accommodationFlyInStep: AccommodationFlyInStep;
23
+ priceDetails: BookingPriceDetails | null;
23
24
  }
24
25
  export declare const setResults: import('@reduxjs/toolkit').ActionCreatorWithPayload<BookingPackageItem[], 'searchResults/setResults'>,
25
26
  setFilteredResults: import('@reduxjs/toolkit').ActionCreatorWithPayload<BookingPackageItem[], 'searchResults/setFilteredResults'>,
@@ -62,6 +63,7 @@ export declare const setResults: import('@reduxjs/toolkit').ActionCreatorWithPay
62
63
  setFlyInIsOpen: import('@reduxjs/toolkit').ActionCreatorWithPayload<boolean, 'searchResults/setFlyInIsOpen'>,
63
64
  setEditablePackagingEntry: import('@reduxjs/toolkit').ActionCreatorWithPayload<PackagingEntry | null, 'searchResults/setEditablePackagingEntry'>,
64
65
  setTransactionId: import('@reduxjs/toolkit').ActionCreatorWithPayload<string | null, 'searchResults/setTransactionId'>,
65
- setAccommodationFlyInStep: import('@reduxjs/toolkit').ActionCreatorWithPayload<AccommodationFlyInStep, 'searchResults/setAccommodationFlyInStep'>;
66
+ setAccommodationFlyInStep: import('@reduxjs/toolkit').ActionCreatorWithPayload<AccommodationFlyInStep, 'searchResults/setAccommodationFlyInStep'>,
67
+ setPriceDetails: import('@reduxjs/toolkit').ActionCreatorWithPayload<BookingPriceDetails | null, 'searchResults/setPriceDetails'>;
66
68
  declare const _default: import('@reduxjs/toolkit').Reducer<SearchResultsState>;
67
69
  export default _default;
@@ -12823,7 +12823,7 @@ PERFORMANCE OF THIS SOFTWARE.
12823
12823
  return ENDPOINT$8 + '/details/' + transactionId + '/alternate-flights';
12824
12824
  };
12825
12825
  var ENDPOINT_BOOKABLE_DATES = ENDPOINT$8 + '/bookable-dates';
12826
- var ENDPOINT_PRICE_DETAILS = ENDPOINT$8 + '/price-details';
12826
+ var ENDPOINT_PRICE_DETAILS$1 = ENDPOINT$8 + '/price-details';
12827
12827
  var ENDPOINT_BOOK = ENDPOINT$8 + '/book';
12828
12828
  var ENDPOINT_UPDATE = ENDPOINT$8 + '/update';
12829
12829
  var ENDPOINT_AGENTS = ENDPOINT$8 + '/agents';
@@ -12923,7 +12923,7 @@ PERFORMANCE OF THIS SOFTWARE.
12923
12923
  return post(url, apiKey, body, config.token, signal, true);
12924
12924
  };
12925
12925
  var priceDetails = function (config, request, signal, languageCode) {
12926
- var url = '' + config.host + ENDPOINT_PRICE_DETAILS;
12926
+ var url = '' + config.host + ENDPOINT_PRICE_DETAILS$1;
12927
12927
  var apiKey = config.apiKey;
12928
12928
  var body = JSON.stringify(request);
12929
12929
  return post(url, apiKey, body, config.token, signal, true, languageCode);
@@ -13449,6 +13449,7 @@ PERFORMANCE OF THIS SOFTWARE.
13449
13449
  var ENDPOINT = '/api/web/packaging';
13450
13450
  var ENDPOINT_START_TRANSACTION = ENDPOINT + '/start';
13451
13451
  var ENDPOINT_ACCOMMODATIONS = ENDPOINT + '/accommodations';
13452
+ var ENDPOINT_PRICE_DETAILS = ENDPOINT + '/price-details';
13452
13453
  var ENDPOINT_ENTRY = function (magicLinkCode) {
13453
13454
  return ENDPOINT + '/entry/' + magicLinkCode;
13454
13455
  };
@@ -13469,6 +13470,12 @@ PERFORMANCE OF THIS SOFTWARE.
13469
13470
  var url = '' + config.host + ENDPOINT_ENTRY(magicLinkCode);
13470
13471
  return get(url, apiKey, config.token, signal, true);
13471
13472
  };
13473
+ var getPriceDetails = function (config, request, signal) {
13474
+ var url = '' + config.host + ENDPOINT_PRICE_DETAILS;
13475
+ var apiKey = config.apiKey;
13476
+ var body = JSON.stringify(request);
13477
+ return post(url, apiKey, body, config.token, signal, true);
13478
+ };
13472
13479
 
13473
13480
  exports.AllotmentType = AllotmentType;
13474
13481
  exports.ContactForm = ContactForm;
@@ -13524,6 +13531,7 @@ PERFORMANCE OF THIS SOFTWARE.
13524
13531
  exports.getLocations = getLocations;
13525
13532
  exports.getMolliePayment = getMolliePayment;
13526
13533
  exports.getPortal = getPortal;
13534
+ exports.getPriceDetails = getPriceDetails;
13527
13535
  exports.getPrintActions = getPrintActions;
13528
13536
  exports.getStyleSheet = getStyleSheet;
13529
13537
  exports.getTranslationDictionary = getTranslationDictionary;
@@ -33671,7 +33679,8 @@ var initialState$1 = {
33671
33679
  flyInIsOpen: false,
33672
33680
  editablePackagingEntry: null,
33673
33681
  transactionId: null,
33674
- accommodationFlyInStep: 'details'
33682
+ accommodationFlyInStep: 'details',
33683
+ priceDetails: null
33675
33684
  };
33676
33685
  var searchResultsSlice = createSlice({
33677
33686
  name: 'searchResults',
@@ -33764,6 +33773,9 @@ var searchResultsSlice = createSlice({
33764
33773
  },
33765
33774
  setAccommodationFlyInStep: function (state, action) {
33766
33775
  state.accommodationFlyInStep = action.payload;
33776
+ },
33777
+ setPriceDetails: function (state, action) {
33778
+ state.priceDetails = action.payload;
33767
33779
  }
33768
33780
  }
33769
33781
  });
@@ -33788,7 +33800,8 @@ _a.resetSearchState;
33788
33800
  var setFlyInIsOpen = _a.setFlyInIsOpen,
33789
33801
  setEditablePackagingEntry = _a.setEditablePackagingEntry,
33790
33802
  setTransactionId = _a.setTransactionId,
33791
- setAccommodationFlyInStep = _a.setAccommodationFlyInStep;
33803
+ setAccommodationFlyInStep = _a.setAccommodationFlyInStep,
33804
+ setPriceDetails = _a.setPriceDetails;
33792
33805
  var searchResultsReducer = searchResultsSlice.reducer;
33793
33806
 
33794
33807
  var ItemPicker = function (_a) {
@@ -35052,14 +35065,16 @@ var getSegmentTitle = function (segment) {
35052
35065
  var Itinerary = function (_a) {
35053
35066
  var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
35054
35067
  var isOpen = _a.isOpen,
35055
- handleSetIsOpen = _a.handleSetIsOpen;
35056
- _a.isLoading;
35057
- var onEditAccommodation = _a.onEditAccommodation;
35068
+ handleSetIsOpen = _a.handleSetIsOpen,
35069
+ isLoading = _a.isLoading,
35070
+ onEditAccommodation = _a.onEditAccommodation;
35058
35071
  var context = useContext(SearchResultsConfigurationContext);
35059
35072
  var translations = getTranslations((_b = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _b !== void 0 ? _b : 'en-GB');
35060
- var editablePackagingEntry = useSelector(function (state) {
35061
- return state.searchResults;
35062
- }).editablePackagingEntry;
35073
+ var _q = useSelector(function (state) {
35074
+ return state.searchResults;
35075
+ }),
35076
+ editablePackagingEntry = _q.editablePackagingEntry,
35077
+ priceDetails = _q.priceDetails;
35063
35078
  var packagingEntry =
35064
35079
  editablePackagingEntry !== null && editablePackagingEntry !== void 0
35065
35080
  ? editablePackagingEntry
@@ -35147,7 +35162,7 @@ var Itinerary = function (_a) {
35147
35162
  console.log('otherSegments', otherSegments);
35148
35163
  console.log('groupedOtherSegments', groupedOtherSegments);
35149
35164
  var numberOfPax = ((_p = packagingEntry.pax) === null || _p === void 0 ? void 0 : _p.length) || 1;
35150
- var totalPrice = packagingEntry.price || 0;
35165
+ var totalPrice = (priceDetails === null || priceDetails === void 0 ? void 0 : priceDetails.total) || packagingEntry.price || 0;
35151
35166
  var pricePerPerson = totalPrice / numberOfPax;
35152
35167
  return React__default.createElement(
35153
35168
  'div',
@@ -35199,18 +35214,24 @@ var Itinerary = function (_a) {
35199
35214
  React__default.createElement(
35200
35215
  'div',
35201
35216
  { className: 'search__filter__prices' },
35202
- React__default.createElement(
35203
- 'div',
35204
- { className: 'search__filter__prices__wrapper' },
35205
- React__default.createElement('h3', { className: 'search__filter__prices--amount' }, formatPrice$2(pricePerPerson, 'EUR')),
35206
- React__default.createElement('p', null, translations.SRP.PACKAGE_PRICE_PER_PERSON),
35207
- React__default.createElement(
35208
- 'p',
35209
- null,
35210
- React__default.createElement('strong', null, '(', formatPrice$2(totalPrice, 'EUR'), ' ', translations.SRP.TOTAL, ')')
35211
- )
35212
- ),
35213
- React__default.createElement('button', { className: 'cta' }, translations.QSM.CONFIRM)
35217
+ isLoading
35218
+ ? React__default.createElement(Spinner, null)
35219
+ : React__default.createElement(
35220
+ React__default.Fragment,
35221
+ null,
35222
+ React__default.createElement(
35223
+ 'div',
35224
+ { className: 'search__filter__prices__wrapper' },
35225
+ React__default.createElement('h3', { className: 'search__filter__prices--amount' }, formatPrice$2(pricePerPerson, 'EUR')),
35226
+ React__default.createElement('p', null, translations.SRP.PACKAGE_PRICE_PER_PERSON),
35227
+ React__default.createElement(
35228
+ 'p',
35229
+ null,
35230
+ React__default.createElement('strong', null, '(', formatPrice$2(totalPrice, 'EUR'), ' ', translations.SRP.TOTAL, ')')
35231
+ )
35232
+ ),
35233
+ React__default.createElement('button', { className: 'cta' }, translations.QSM.CONFIRM)
35234
+ )
35214
35235
  ),
35215
35236
  React__default.createElement(
35216
35237
  'div',
@@ -46990,14 +47011,6 @@ var getSelectedOptionsPerRoom = function (details) {
46990
47011
  };
46991
47012
  });
46992
47013
  };
46993
- var getRoomIndexFromLine = function (line) {
46994
- var _a, _b;
46995
- if (!((_a = line.pax) === null || _a === void 0 ? void 0 : _a.length)) return 0;
46996
- var firstPax = __spreadArray([], line.pax, true).sort(function (a, b) {
46997
- return a.order - b.order;
46998
- })[0];
46999
- return (_b = firstPax === null || firstPax === void 0 ? void 0 : firstPax.room) !== null && _b !== void 0 ? _b : 0;
47000
- };
47001
47014
  var getRequestRoomsFromPackagingSegments = function (entry, segments) {
47002
47015
  var _a;
47003
47016
  var accommodationLines = __spreadArray([], segments !== null && segments !== void 0 ? segments : [], true)
@@ -47101,11 +47114,14 @@ var SearchResultsContainer = function () {
47101
47114
  detailsIsLoading = _g[0],
47102
47115
  setDetailsIsLoading = _g[1];
47103
47116
  var _h = useState(false),
47104
- itineraryOpen = _h[0],
47105
- setItineraryOpen = _h[1];
47106
- var _j = useState(null),
47107
- selectedAccommodationSeed = _j[0],
47108
- setSelectedAccommodationSeed = _j[1];
47117
+ pricesAreLoading = _h[0],
47118
+ setPricesAreLoading = _h[1];
47119
+ var _j = useState(false),
47120
+ itineraryOpen = _j[0],
47121
+ setItineraryOpen = _j[1];
47122
+ var _k = useState(null),
47123
+ selectedAccommodationSeed = _k[0],
47124
+ setSelectedAccommodationSeed = _k[1];
47109
47125
  var panelRef = useRef(null);
47110
47126
  var sortByTypes = [
47111
47127
  { direction: 'asc', label: 'default' },
@@ -47322,20 +47338,21 @@ var SearchResultsContainer = function () {
47322
47338
  var details = packagingAccoSearchDetails;
47323
47339
  if (!sourceEntry || !(details === null || details === void 0 ? void 0 : details.length)) return null;
47324
47340
  var selectedOptionsPerRoom = getSelectedOptionsPerRoom(details);
47341
+ console.log('Selected options per room', selectedOptionsPerRoom);
47325
47342
  if (!selectedOptionsPerRoom.length) return null;
47326
47343
  var selectedHotel = details[0];
47344
+ var roomIndex = 0;
47327
47345
  var updatedLines = sourceEntry.lines.map(function (line) {
47328
47346
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
47329
47347
  if (line.serviceType !== ACCOMMODATION_SERVICE_TYPE) {
47330
47348
  return line;
47331
47349
  }
47332
- // TODO: fix roomIndex
47333
- var roomIndex = getRoomIndexFromLine(line);
47334
- console.log('Processing line', line, 'with room index', roomIndex);
47335
47350
  var selectedRoom = selectedOptionsPerRoom.find(function (x) {
47336
47351
  return x.roomIndex === roomIndex;
47337
47352
  });
47338
47353
  var selectedOption = selectedRoom === null || selectedRoom === void 0 ? void 0 : selectedRoom.option;
47354
+ console.log('selectedRoom and selectedOption for line', line, selectedRoom, selectedOption);
47355
+ roomIndex++;
47339
47356
  if (!selectedOption) {
47340
47357
  return line;
47341
47358
  }
@@ -47885,6 +47902,52 @@ var SearchResultsContainer = function () {
47885
47902
  rooms: getRequestRoomsFromPackagingSegments(entry, sortedSegments)
47886
47903
  };
47887
47904
  };
47905
+ useEffect(
47906
+ function () {
47907
+ var fetchPriceDetails = function () {
47908
+ return __awaiter(void 0, void 0, void 0, function () {
47909
+ var config, priceDetails, err_6;
47910
+ return __generator(this, function (_a) {
47911
+ switch (_a.label) {
47912
+ case 0:
47913
+ console.log(
47914
+ 'Fetching price details for entry',
47915
+ editablePackagingEntry !== null && editablePackagingEntry !== void 0
47916
+ ? editablePackagingEntry
47917
+ : context === null || context === void 0
47918
+ ? void 0
47919
+ : context.packagingEntry
47920
+ );
47921
+ if (!context || !editablePackagingEntry) return [2 /*return*/];
47922
+ setPricesAreLoading(true);
47923
+ _a.label = 1;
47924
+ case 1:
47925
+ _a.trys.push([1, 3, , 4]);
47926
+ config = {
47927
+ host: context.tideConnection.host,
47928
+ apiKey: context.tideConnection.apiKey
47929
+ };
47930
+ return [4 /*yield*/, build.getPriceDetails(config, editablePackagingEntry)];
47931
+ case 2:
47932
+ priceDetails = _a.sent();
47933
+ dispatch(setPriceDetails(priceDetails));
47934
+ setPricesAreLoading(false);
47935
+ return [3 /*break*/, 4];
47936
+ case 3:
47937
+ err_6 = _a.sent();
47938
+ console.error('Error fetching price details', err_6);
47939
+ setPricesAreLoading(false);
47940
+ return [3 /*break*/, 4];
47941
+ case 4:
47942
+ return [2 /*return*/];
47943
+ }
47944
+ });
47945
+ });
47946
+ };
47947
+ fetchPriceDetails();
47948
+ },
47949
+ [editablePackagingEntry]
47950
+ );
47888
47951
  return React__default.createElement(
47889
47952
  'div',
47890
47953
  { id: 'tide-booking', className: 'search__bg' },
@@ -47936,7 +47999,7 @@ var SearchResultsContainer = function () {
47936
47999
  handleSetIsOpen: function () {
47937
48000
  return setItineraryOpen(!itineraryOpen);
47938
48001
  },
47939
- isLoading: isLoading,
48002
+ isLoading: pricesAreLoading,
47940
48003
  onEditAccommodation: handleEditAccommodation
47941
48004
  }),
47942
48005
  React__default.createElement(
@@ -1,5 +1,5 @@
1
1
  import { AccommodationFlyInStep, ExtendedFlightSearchResponseItem, Filter, SortByType } from '../types';
2
- import { BookingPackage, BookingPackageItem, PackagingAccommodationResponse, PackagingEntry } from '@qite/tide-client/build/types';
2
+ import { BookingPackage, BookingPackageItem, BookingPriceDetails, PackagingAccommodationResponse, PackagingEntry } from '@qite/tide-client/build/types';
3
3
  export interface SearchResultsState {
4
4
  results: BookingPackageItem[];
5
5
  filteredResults: BookingPackageItem[];
@@ -20,6 +20,7 @@ export interface SearchResultsState {
20
20
  editablePackagingEntry: PackagingEntry | null;
21
21
  transactionId: string | null;
22
22
  accommodationFlyInStep: AccommodationFlyInStep;
23
+ priceDetails: BookingPriceDetails | null;
23
24
  }
24
25
  export declare const setResults: import('@reduxjs/toolkit').ActionCreatorWithPayload<BookingPackageItem[], 'searchResults/setResults'>,
25
26
  setFilteredResults: import('@reduxjs/toolkit').ActionCreatorWithPayload<BookingPackageItem[], 'searchResults/setFilteredResults'>,
@@ -62,6 +63,7 @@ export declare const setResults: import('@reduxjs/toolkit').ActionCreatorWithPay
62
63
  setFlyInIsOpen: import('@reduxjs/toolkit').ActionCreatorWithPayload<boolean, 'searchResults/setFlyInIsOpen'>,
63
64
  setEditablePackagingEntry: import('@reduxjs/toolkit').ActionCreatorWithPayload<PackagingEntry | null, 'searchResults/setEditablePackagingEntry'>,
64
65
  setTransactionId: import('@reduxjs/toolkit').ActionCreatorWithPayload<string | null, 'searchResults/setTransactionId'>,
65
- setAccommodationFlyInStep: import('@reduxjs/toolkit').ActionCreatorWithPayload<AccommodationFlyInStep, 'searchResults/setAccommodationFlyInStep'>;
66
+ setAccommodationFlyInStep: import('@reduxjs/toolkit').ActionCreatorWithPayload<AccommodationFlyInStep, 'searchResults/setAccommodationFlyInStep'>,
67
+ setPriceDetails: import('@reduxjs/toolkit').ActionCreatorWithPayload<BookingPriceDetails | null, 'searchResults/setPriceDetails'>;
66
68
  declare const _default: import('@reduxjs/toolkit').Reducer<SearchResultsState>;
67
69
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qite/tide-booking-component",
3
- "version": "1.4.99",
3
+ "version": "1.4.100",
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",
@@ -29,7 +29,7 @@
29
29
  "devDependencies": {
30
30
  "@jsonurl/jsonurl": "^1.1.4",
31
31
  "@popperjs/core": "^2.10.2",
32
- "@qite/tide-client": "^1.1.155",
32
+ "@qite/tide-client": "^1.1.157",
33
33
  "@reduxjs/toolkit": "^2.8.2",
34
34
  "@rollup/plugin-commonjs": "^19.0.1",
35
35
  "@rollup/plugin-json": "^4.1.0",
@@ -8,6 +8,7 @@ import { formatPrice, getTranslations } from '../../../shared/utils/localization
8
8
  import { useSelector } from 'react-redux';
9
9
  import { SearchResultsRootState } from '../../store/search-results-store';
10
10
  import { ACCOMMODATION_SERVICE_TYPE, FLIGHT_SERVICE_TYPE } from '../../utils/query-utils';
11
+ import Spinner from '../spinner/spinner';
11
12
 
12
13
  interface ItineraryProps {
13
14
  isOpen: boolean;
@@ -104,7 +105,7 @@ const getSegmentTitle = (segment: PackagingEntryLine) => {
104
105
  const Itinerary: React.FC<ItineraryProps> = ({ isOpen, handleSetIsOpen, isLoading, onEditAccommodation }) => {
105
106
  const context = useContext(SearchResultsConfigurationContext);
106
107
  const translations = getTranslations(context?.languageCode ?? 'en-GB');
107
- const { editablePackagingEntry } = useSelector((state: SearchResultsRootState) => state.searchResults);
108
+ const { editablePackagingEntry, priceDetails } = useSelector((state: SearchResultsRootState) => state.searchResults);
108
109
 
109
110
  const packagingEntry = editablePackagingEntry ?? context?.packagingEntry;
110
111
 
@@ -151,7 +152,7 @@ const Itinerary: React.FC<ItineraryProps> = ({ isOpen, handleSetIsOpen, isLoadin
151
152
  console.log('groupedOtherSegments', groupedOtherSegments);
152
153
 
153
154
  const numberOfPax = packagingEntry.pax?.length || 1;
154
- const totalPrice = packagingEntry.price || 0;
155
+ const totalPrice = priceDetails?.total || packagingEntry.price || 0;
155
156
  const pricePerPerson = totalPrice / numberOfPax;
156
157
 
157
158
  return (
@@ -187,16 +188,22 @@ const Itinerary: React.FC<ItineraryProps> = ({ isOpen, handleSetIsOpen, isLoadin
187
188
  </div>
188
189
 
189
190
  <div className="search__filter__prices">
190
- <div className="search__filter__prices__wrapper">
191
- <h3 className="search__filter__prices--amount">{formatPrice(pricePerPerson, 'EUR')}</h3>
192
- <p>{translations.SRP.PACKAGE_PRICE_PER_PERSON}</p>
193
- <p>
194
- <strong>
195
- ({formatPrice(totalPrice, 'EUR')} {translations.SRP.TOTAL})
196
- </strong>
197
- </p>
198
- </div>
199
- <button className="cta">{translations.QSM.CONFIRM}</button>
191
+ {isLoading ? (
192
+ <Spinner />
193
+ ) : (
194
+ <>
195
+ <div className="search__filter__prices__wrapper">
196
+ <h3 className="search__filter__prices--amount">{formatPrice(pricePerPerson, 'EUR')}</h3>
197
+ <p>{translations.SRP.PACKAGE_PRICE_PER_PERSON}</p>
198
+ <p>
199
+ <strong>
200
+ ({formatPrice(totalPrice, 'EUR')} {translations.SRP.TOTAL})
201
+ </strong>
202
+ </p>
203
+ </div>
204
+ <button className="cta">{translations.QSM.CONFIRM}</button>
205
+ </>
206
+ )}
200
207
  </div>
201
208
 
202
209
  <div className="search__filter__itinerary">
@@ -16,7 +16,8 @@ import {
16
16
  setPackagingAccoSearchDetails,
17
17
  setEditablePackagingEntry,
18
18
  setTransactionId,
19
- setAccommodationFlyInStep
19
+ setAccommodationFlyInStep,
20
+ setPriceDetails
20
21
  } from '../../store/search-results-slice';
21
22
  import { AccommodationFlyInStep, Filter, SearchSeed, SortByType } from '../../types';
22
23
  import useMediaQuery from '../../../shared/utils/use-media-query-util';
@@ -37,7 +38,8 @@ import {
37
38
  PortalQsmType,
38
39
  PackagingEntry,
39
40
  startTransaction,
40
- PackagingEntryLine
41
+ PackagingEntryLine,
42
+ getPriceDetails
41
43
  } from '@qite/tide-client';
42
44
  import { getDateFromParams, getNumberFromParams, getRoomsFromParams, getStringFromParams } from '../../../shared/utils/query-string-util';
43
45
  import { first, last, range } from 'lodash';
@@ -106,6 +108,7 @@ const SearchResultsContainer: React.FC = () => {
106
108
  const [filtersOpen, setFiltersOpen] = useState(false);
107
109
 
108
110
  const [detailsIsLoading, setDetailsIsLoading] = useState(false);
111
+ const [pricesAreLoading, setPricesAreLoading] = useState(false);
109
112
 
110
113
  const [itineraryOpen, setItineraryOpen] = useState(false);
111
114
 
@@ -326,7 +329,6 @@ const SearchResultsContainer: React.FC = () => {
326
329
 
327
330
  const handleConfirmHotelSwap = () => {
328
331
  const updatedEntry = swapHotelInPackagingEntry();
329
- console.log('Updated entry after hotel swap', updatedEntry);
330
332
  if (!updatedEntry) return;
331
333
 
332
334
  dispatch(setEditablePackagingEntry(updatedEntry));
@@ -344,16 +346,15 @@ const SearchResultsContainer: React.FC = () => {
344
346
 
345
347
  const selectedHotel = details[0];
346
348
 
349
+ let roomIndex = 0;
347
350
  const updatedLines = sourceEntry.lines.map((line) => {
348
351
  if (line.serviceType !== ACCOMMODATION_SERVICE_TYPE) {
349
352
  return line;
350
353
  }
351
354
 
352
- // TODO: fix roomIndex
353
- const roomIndex = getRoomIndexFromLine(line);
354
- console.log('Processing line', line, 'with room index', roomIndex);
355
355
  const selectedRoom = selectedOptionsPerRoom.find((x) => x.roomIndex === roomIndex);
356
356
  const selectedOption = selectedRoom?.option;
357
+ roomIndex++;
357
358
 
358
359
  if (!selectedOption) {
359
360
  return line;
@@ -443,8 +444,6 @@ const SearchResultsContainer: React.FC = () => {
443
444
  const searchRequest = buildSearchFromSeed(seed);
444
445
  const packageSearchResults = await search(config, searchRequest);
445
446
 
446
- console.log('Search results', packageSearchResults);
447
-
448
447
  const enrichedFilters = enrichFiltersWithResults(packageSearchResults, context.filters, context.tags ?? []);
449
448
  if (!initialFiltersSet) {
450
449
  dispatch(resetFilters(enrichedFilters));
@@ -503,7 +502,6 @@ const SearchResultsContainer: React.FC = () => {
503
502
  searchRequest.portalId = context.portalId;
504
503
  searchRequest.agentId = context.agentId;
505
504
 
506
- console.log('Packaging accommodation search request', searchRequest);
507
505
  const packageAccoSearchResults = await searchPackagingAccommodations(config, searchRequest);
508
506
 
509
507
  const enrichedFilters = enrichFiltersWithPackageAccoResults(packageAccoSearchResults, context.filters, context.tags ?? []);
@@ -528,7 +526,6 @@ const SearchResultsContainer: React.FC = () => {
528
526
  if (!context || context.showMockup) return;
529
527
 
530
528
  let currentTransactionId = context?.packagingEntry?.transactionId || transactionId;
531
- console.log('Current transaction ID', currentTransactionId);
532
529
  if (!currentTransactionId) {
533
530
  dispatch(setIsLoading(true));
534
531
  currentTransactionId = await runStartTransaction();
@@ -726,7 +723,6 @@ const SearchResultsContainer: React.FC = () => {
726
723
  };
727
724
 
728
725
  const packageAccoSearchDetails = await searchPackagingAccommodations(config, detailSearchRequest);
729
- console.log('Packaging Acco Search details', packageAccoSearchDetails);
730
726
  dispatch(setPackagingAccoSearchDetails(packageAccoSearchDetails));
731
727
  setDetailsIsLoading(false);
732
728
  } catch (err) {
@@ -801,6 +797,28 @@ const SearchResultsContainer: React.FC = () => {
801
797
  };
802
798
  };
803
799
 
800
+ useEffect(() => {
801
+ const fetchPriceDetails = async () => {
802
+ if (!context || !editablePackagingEntry) return;
803
+ setPricesAreLoading(true);
804
+ try {
805
+ const config: TideClientConfig = {
806
+ host: context.tideConnection.host,
807
+ apiKey: context.tideConnection.apiKey
808
+ };
809
+
810
+ const priceDetails = await getPriceDetails(config, editablePackagingEntry);
811
+ dispatch(setPriceDetails(priceDetails));
812
+ setPricesAreLoading(false);
813
+ } catch (err) {
814
+ console.error('Error fetching price details', err);
815
+ setPricesAreLoading(false);
816
+ }
817
+ };
818
+
819
+ fetchPriceDetails();
820
+ }, [editablePackagingEntry]);
821
+
804
822
  return (
805
823
  <div id="tide-booking" className="search__bg">
806
824
  {context && (
@@ -838,7 +856,7 @@ const SearchResultsContainer: React.FC = () => {
838
856
  <Itinerary
839
857
  isOpen={itineraryOpen}
840
858
  handleSetIsOpen={() => setItineraryOpen(!itineraryOpen)}
841
- isLoading={isLoading}
859
+ isLoading={pricesAreLoading}
842
860
  onEditAccommodation={handleEditAccommodation}
843
861
  />
844
862
  )}
@@ -1,6 +1,6 @@
1
1
  import { createSlice, PayloadAction } from '@reduxjs/toolkit';
2
2
  import { AccommodationFlyInStep, ExtendedFlightSearchResponseItem, Filter, SortByType } from '../types';
3
- import { BookingPackage, BookingPackageItem, PackagingAccommodationResponse, PackagingEntry } from '@qite/tide-client/build/types';
3
+ import { BookingPackage, BookingPackageItem, BookingPriceDetails, PackagingAccommodationResponse, PackagingEntry } from '@qite/tide-client/build/types';
4
4
 
5
5
  export interface SearchResultsState {
6
6
  results: BookingPackageItem[];
@@ -22,6 +22,7 @@ export interface SearchResultsState {
22
22
  editablePackagingEntry: PackagingEntry | null;
23
23
  transactionId: string | null;
24
24
  accommodationFlyInStep: AccommodationFlyInStep;
25
+ priceDetails: BookingPriceDetails | null;
25
26
  }
26
27
 
27
28
  const initialState: SearchResultsState = {
@@ -43,7 +44,8 @@ const initialState: SearchResultsState = {
43
44
  flyInIsOpen: false,
44
45
  editablePackagingEntry: null,
45
46
  transactionId: null,
46
- accommodationFlyInStep: 'details'
47
+ accommodationFlyInStep: 'details',
48
+ priceDetails: null
47
49
  };
48
50
 
49
51
  const searchResultsSlice = createSlice({
@@ -138,6 +140,9 @@ const searchResultsSlice = createSlice({
138
140
  },
139
141
  setAccommodationFlyInStep(state, action: PayloadAction<AccommodationFlyInStep>) {
140
142
  state.accommodationFlyInStep = action.payload;
143
+ },
144
+ setPriceDetails(state, action: PayloadAction<BookingPriceDetails | null>) {
145
+ state.priceDetails = action.payload;
141
146
  }
142
147
  }
143
148
  });
@@ -164,7 +169,8 @@ export const {
164
169
  setFlyInIsOpen,
165
170
  setEditablePackagingEntry,
166
171
  setTransactionId,
167
- setAccommodationFlyInStep
172
+ setAccommodationFlyInStep,
173
+ setPriceDetails
168
174
  } = searchResultsSlice.actions;
169
175
 
170
176
  export default searchResultsSlice.reducer;