@qite/tide-booking-component 1.4.100 → 1.4.102

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 (23) hide show
  1. package/build/build-cjs/index.js +990 -423
  2. package/build/build-cjs/src/index.d.ts +3 -1
  3. package/build/build-cjs/src/search-results/components/itinerary/full-itinerary.d.ts +6 -0
  4. package/build/build-cjs/src/search-results/store/search-results-slice.d.ts +18 -2
  5. package/build/build-cjs/src/search-results/types.d.ts +3 -1
  6. package/build/build-cjs/src/search-results/utils/flight-utils.d.ts +1 -0
  7. package/build/build-esm/index.js +990 -417
  8. package/build/build-esm/src/index.d.ts +3 -1
  9. package/build/build-esm/src/search-results/components/itinerary/full-itinerary.d.ts +6 -0
  10. package/build/build-esm/src/search-results/store/search-results-slice.d.ts +18 -2
  11. package/build/build-esm/src/search-results/types.d.ts +3 -1
  12. package/build/build-esm/src/search-results/utils/flight-utils.d.ts +1 -0
  13. package/package.json +2 -2
  14. package/src/index.ts +3 -1
  15. package/src/search-results/components/flight/flight-selection/independent-flight-option.tsx +1 -7
  16. package/src/search-results/components/flight/flight-selection/independent-flight-selection.tsx +2 -6
  17. package/src/search-results/components/itinerary/full-itinerary.tsx +266 -0
  18. package/src/search-results/components/itinerary/index.tsx +0 -2
  19. package/src/search-results/components/search-results-container/search-results-container.tsx +668 -78
  20. package/src/search-results/store/search-results-slice.ts +35 -3
  21. package/src/search-results/types.ts +3 -1
  22. package/src/search-results/utils/flight-utils.ts +5 -0
  23. package/src/shared/components/flyin/accommodation-flyin.tsx +4 -2
@@ -13417,11 +13417,12 @@ 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_FLIGHTS = ENDPOINT + '/flights';
13420
13421
  var ENDPOINT_PRICE_DETAILS = ENDPOINT + '/price-details';
13422
+ var ENDPOINT_ITINERARY = ENDPOINT + '/itinerary';
13421
13423
  var ENDPOINT_ENTRY = function (magicLinkCode) {
13422
13424
  return ENDPOINT + '/entry/' + magicLinkCode;
13423
13425
  };
13424
- // MANUAL PACKAGING SEARCH
13425
13426
  var startTransaction = function (config, signal) {
13426
13427
  var apiKey = config.apiKey;
13427
13428
  var url = '' + config.host + ENDPOINT_START_TRANSACTION;
@@ -13433,6 +13434,12 @@ PERFORMANCE OF THIS SOFTWARE.
13433
13434
  var body = JSON.stringify(request);
13434
13435
  return post(url, apiKey, body, config.token, signal, true);
13435
13436
  };
13437
+ var searchPackagingFlights = function (config, request, signal) {
13438
+ var url = '' + config.host + ENDPOINT_FLIGHTS;
13439
+ var apiKey = config.apiKey;
13440
+ var body = JSON.stringify(request);
13441
+ return post(url, apiKey, body, config.token, signal, true);
13442
+ };
13436
13443
  var getEntry = function (config, magicLinkCode, signal) {
13437
13444
  var apiKey = config.apiKey;
13438
13445
  var url = '' + config.host + ENDPOINT_ENTRY(magicLinkCode);
@@ -13444,6 +13451,12 @@ PERFORMANCE OF THIS SOFTWARE.
13444
13451
  var body = JSON.stringify(request);
13445
13452
  return post(url, apiKey, body, config.token, signal, true);
13446
13453
  };
13454
+ var getItinerary = function (config, request, signal) {
13455
+ var url = '' + config.host + ENDPOINT_ITINERARY;
13456
+ var apiKey = config.apiKey;
13457
+ var body = JSON.stringify(request);
13458
+ return post(url, apiKey, body, config.token, signal, true);
13459
+ };
13447
13460
 
13448
13461
  exports.AllotmentType = AllotmentType;
13449
13462
  exports.ContactForm = ContactForm;
@@ -13496,6 +13509,7 @@ PERFORMANCE OF THIS SOFTWARE.
13496
13509
  exports.getEntryStatus = getEntryStatus;
13497
13510
  exports.getEntryTotals = getEntryTotals;
13498
13511
  exports.getInvoiceList = getInvoiceList;
13512
+ exports.getItinerary = getItinerary;
13499
13513
  exports.getLocations = getLocations;
13500
13514
  exports.getMolliePayment = getMolliePayment;
13501
13515
  exports.getPortal = getPortal;
@@ -13517,6 +13531,7 @@ PERFORMANCE OF THIS SOFTWARE.
13517
13531
  exports.searchLocations = searchLocations;
13518
13532
  exports.searchOords = searchOords;
13519
13533
  exports.searchPackagingAccommodations = searchPackagingAccommodations;
13534
+ exports.searchPackagingFlights = searchPackagingFlights;
13520
13535
  exports.searchRegions = searchRegions;
13521
13536
  exports.searchWithErrorMapping = searchWithErrorMapping;
13522
13537
  exports.setCustomEntryStatus = setCustomEntryStatus;
@@ -20504,7 +20519,7 @@ var getFlightDetails = function (flight) {
20504
20519
  arrivalDate: lastLine.arrivalDate,
20505
20520
  arrivalTime: lastLine.arrivalTime,
20506
20521
  arrivalAirport: lastLine.arrivalAirportDescription,
20507
- travelDuration: formatDuration$1(flight.flightMetaData.durationInTicks),
20522
+ travelDuration: formatDuration(flight.flightMetaData.durationInTicks),
20508
20523
  travelDurationMinutes: minutesFromTicks(flight.flightMetaData.durationInTicks),
20509
20524
  changeDurationMinutes: getTotalChangeDuration(flight),
20510
20525
  numberOfStops: flight.flightMetaData.flightLines.length - 1,
@@ -20520,7 +20535,7 @@ var getFlightDetails = function (flight) {
20520
20535
  arrivalTime: x.arrivalTime,
20521
20536
  arrivalAirport: x.arrivalAirportDescription,
20522
20537
  number: ''.concat(x.airlineCode, ' ').concat(x.number),
20523
- travelDuration: formatDuration$1(x.durationInTicks),
20538
+ travelDuration: formatDuration(x.durationInTicks),
20524
20539
  waitDuration: waitDurations.length - 1 <= i ? waitDurations[i] : undefined
20525
20540
  };
20526
20541
  })
@@ -20596,7 +20611,7 @@ var minutesFromTicks = function (ticks) {
20596
20611
  var totalSeconds = ticks / 10000000;
20597
20612
  return Math.floor(totalSeconds / 60);
20598
20613
  };
20599
- var formatDuration$1 = function (ticks) {
20614
+ var formatDuration = function (ticks) {
20600
20615
  if (!ticks) return '';
20601
20616
  var totalSeconds = ticks / 10000000;
20602
20617
  var hh = Math.floor(totalSeconds / 3600);
@@ -33809,10 +33824,13 @@ var initialState$1 = {
33809
33824
  filteredPackagingAccoResults: [],
33810
33825
  packagingAccoSearchDetails: [],
33811
33826
  selectedPackagingAccoResultCode: null,
33827
+ packagingFlightResults: [],
33828
+ selectedPackagingFlight: null,
33812
33829
  selectedFlight: null,
33813
33830
  selectedFlightDetails: null,
33814
33831
  bookingPackageDetails: null,
33815
33832
  isLoading: false,
33833
+ flightsLoading: false,
33816
33834
  filters: [],
33817
33835
  selectedSortType: null,
33818
33836
  activeTab: 'compact',
@@ -33821,7 +33839,8 @@ var initialState$1 = {
33821
33839
  editablePackagingEntry: null,
33822
33840
  transactionId: null,
33823
33841
  accommodationFlyInStep: 'details',
33824
- priceDetails: null
33842
+ priceDetails: null,
33843
+ itinerary: null
33825
33844
  };
33826
33845
  var searchResultsSlice = toolkit.createSlice({
33827
33846
  name: 'searchResults',
@@ -33848,6 +33867,12 @@ var searchResultsSlice = toolkit.createSlice({
33848
33867
  setSelectedPackagingAccoResult: function (state, action) {
33849
33868
  state.selectedPackagingAccoResultCode = action.payload;
33850
33869
  },
33870
+ setPackagingFlightResults: function (state, action) {
33871
+ state.packagingFlightResults = action.payload;
33872
+ },
33873
+ setSelectedPackagingFlight: function (state, action) {
33874
+ state.selectedPackagingFlight = action.payload;
33875
+ },
33851
33876
  setSelectedFlight: function (state, action) {
33852
33877
  state.selectedFlight = action.payload;
33853
33878
  },
@@ -33870,6 +33895,9 @@ var searchResultsSlice = toolkit.createSlice({
33870
33895
  setIsLoading: function (state, action) {
33871
33896
  state.isLoading = action.payload;
33872
33897
  },
33898
+ setFlightsLoading: function (state, action) {
33899
+ state.flightsLoading = action.payload;
33900
+ },
33873
33901
  setFilters: function (state, action) {
33874
33902
  var updatedFilters = action.payload;
33875
33903
  updatedFilters.forEach(function (updatedFilter) {
@@ -33917,6 +33945,9 @@ var searchResultsSlice = toolkit.createSlice({
33917
33945
  },
33918
33946
  setPriceDetails: function (state, action) {
33919
33947
  state.priceDetails = action.payload;
33948
+ },
33949
+ setItinerary: function (state, action) {
33950
+ state.itinerary = action.payload;
33920
33951
  }
33921
33952
  }
33922
33953
  });
@@ -33927,11 +33958,14 @@ var setResults = ((_a = searchResultsSlice.actions), _a.setResults),
33927
33958
  setFilteredPackagingAccoResults = _a.setFilteredPackagingAccoResults,
33928
33959
  setPackagingAccoSearchDetails = _a.setPackagingAccoSearchDetails,
33929
33960
  setSelectedPackagingAccoResult = _a.setSelectedPackagingAccoResult,
33961
+ setPackagingFlightResults = _a.setPackagingFlightResults,
33962
+ setSelectedPackagingFlight = _a.setSelectedPackagingFlight,
33930
33963
  setSelectedFlight = _a.setSelectedFlight,
33931
33964
  setSelectedFlightDetails = _a.setSelectedFlightDetails,
33932
- setBookingPackageDetails = _a.setBookingPackageDetails,
33933
- selectFlight = _a.selectFlight,
33934
- setIsLoading = _a.setIsLoading,
33965
+ setBookingPackageDetails = _a.setBookingPackageDetails;
33966
+ _a.selectFlight;
33967
+ var setIsLoading = _a.setIsLoading,
33968
+ setFlightsLoading = _a.setFlightsLoading,
33935
33969
  setFilters = _a.setFilters,
33936
33970
  resetFilters = _a.resetFilters,
33937
33971
  setSortType = _a.setSortType,
@@ -33942,7 +33976,8 @@ var setFlyInIsOpen = _a.setFlyInIsOpen,
33942
33976
  setEditablePackagingEntry = _a.setEditablePackagingEntry,
33943
33977
  setTransactionId = _a.setTransactionId,
33944
33978
  setAccommodationFlyInStep = _a.setAccommodationFlyInStep,
33945
- setPriceDetails = _a.setPriceDetails;
33979
+ setPriceDetails = _a.setPriceDetails,
33980
+ setItinerary = _a.setItinerary;
33946
33981
  var searchResultsReducer = searchResultsSlice.reducer;
33947
33982
 
33948
33983
  var ItemPicker = function (_a) {
@@ -35302,8 +35337,6 @@ var Itinerary = function (_a) {
35302
35337
  segments: segments
35303
35338
  };
35304
35339
  });
35305
- console.log('otherSegments', otherSegments);
35306
- console.log('groupedOtherSegments', groupedOtherSegments);
35307
35340
  var numberOfPax = ((_p = packagingEntry.pax) === null || _p === void 0 ? void 0 : _p.length) || 1;
35308
35341
  var totalPrice = (priceDetails === null || priceDetails === void 0 ? void 0 : priceDetails.total) || packagingEntry.price || 0;
35309
35342
  var pricePerPerson = totalPrice / numberOfPax;
@@ -36887,6 +36920,14 @@ var Icon = function (_a) {
36887
36920
  }
36888
36921
  };
36889
36922
 
36923
+ var getFlightKey = function (segments) {
36924
+ if (!segments || segments.length === 0) return '';
36925
+ return segments
36926
+ .map(function (s) {
36927
+ return ''.concat(s.marketingAirlineCode).concat(s.flightNumber, '_').concat(s.departureDateTime);
36928
+ })
36929
+ .join('_');
36930
+ };
36890
36931
  // export const getAirportName = (airport: TideAirport | undefined, language: string): string => {
36891
36932
  // if (!airport || !airport.name) {
36892
36933
  // return "";
@@ -38447,13 +38488,11 @@ var FlightsFlyIn = function (_a) {
38447
38488
  };
38448
38489
 
38449
38490
  var formatPrice$1 = function (price, currencyCode) {
38450
- if (currencyCode === void 0) {
38451
- currencyCode = 'EUR';
38452
- }
38453
38491
  if (typeof price !== 'number') return '';
38492
+ var safeCurrency = currencyCode !== null && currencyCode !== void 0 ? currencyCode : 'EUR';
38454
38493
  return new Intl.NumberFormat('nl-BE', {
38455
38494
  style: 'currency',
38456
- currency: currencyCode
38495
+ currency: safeCurrency
38457
38496
  }).format(price);
38458
38497
  };
38459
38498
  var AccommodationFlyIn = function (_a) {
@@ -44126,266 +44165,6 @@ var RoundTripResults = function () {
44126
44165
  );
44127
44166
  };
44128
44167
 
44129
- var ticksToMinutes = function (ticks) {
44130
- return Math.floor(ticks / 600000000);
44131
- };
44132
- var formatDuration = function (ticks) {
44133
- var minutes = ticksToMinutes(ticks);
44134
- var h = Math.floor(minutes / 60);
44135
- var m = minutes % 60;
44136
- return ''.concat(h, 'h ').concat(m, 'm');
44137
- };
44138
- var FlightResults = function (_a) {
44139
- var _b;
44140
- var flights = _a.flights,
44141
- isDeparture = _a.isDeparture;
44142
- var context = React.useContext(SearchResultsConfigurationContext);
44143
- var translations = getTranslations((_b = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _b !== void 0 ? _b : 'en-GB');
44144
- var dispatch = reactRedux.useDispatch();
44145
- var _c = React.useState(null),
44146
- activeDetailId = _c[0],
44147
- setActiveDetailId = _c[1];
44148
- var handleDetailClick = function (flightOptionId) {
44149
- setActiveDetailId(function (prev) {
44150
- return prev === flightOptionId ? null : flightOptionId;
44151
- });
44152
- };
44153
- var firstResult = flights === null || flights === void 0 ? void 0 : flights[0];
44154
- var firstResultDate = (firstResult === null || firstResult === void 0 ? void 0 : firstResult.startDateTime)
44155
- ? dateFns.parseISO(firstResult.startDateTime)
44156
- : null;
44157
- return React__default['default'].createElement(
44158
- React__default['default'].Fragment,
44159
- null,
44160
- React__default['default'].createElement(
44161
- 'div',
44162
- { className: 'search__results__label' },
44163
- React__default['default'].createElement(
44164
- 'div',
44165
- { className: 'search__results__label__date' },
44166
- firstResultDate &&
44167
- React__default['default'].createElement(
44168
- React__default['default'].Fragment,
44169
- null,
44170
- React__default['default'].createElement('p', { className: 'search__results__label__date-date' }, dateFns.format(firstResultDate, 'd')),
44171
- React__default['default'].createElement('p', null, dateFns.format(firstResultDate, 'MMM'))
44172
- )
44173
- ),
44174
- React__default['default'].createElement(
44175
- 'div',
44176
- { className: 'search__results__label__text' },
44177
- React__default['default'].createElement(
44178
- 'h3',
44179
- null,
44180
- translations.SRP.SELECT,
44181
- ' ',
44182
- React__default['default'].createElement('strong', null, isDeparture ? translations.SRP.DEPARTURE : translations.SRP.RETURN)
44183
- )
44184
- )
44185
- ),
44186
- flights &&
44187
- flights.length > 0 &&
44188
- React__default['default'].createElement(
44189
- 'div',
44190
- { className: 'search__results__cards search__results__cards--extended' },
44191
- flights.map(function (flight, index) {
44192
- var lines = flight.flightMetaData.flightLines;
44193
- var firstLine = lines[0];
44194
- var lastLine = lines[lines.length - 1];
44195
- var stops = lines.length - 1;
44196
- return React__default['default'].createElement(
44197
- 'div',
44198
- { className: 'flight', key: 'flight-'.concat(flight.flightId, '-').concat(index) },
44199
- React__default['default'].createElement(
44200
- 'div',
44201
- { className: 'flight__option' },
44202
- React__default['default'].createElement(
44203
- 'div',
44204
- { className: 'flight__content' },
44205
- React__default['default'].createElement(
44206
- 'div',
44207
- { className: 'flight__flights' },
44208
- React__default['default'].createElement(
44209
- 'div',
44210
- { className: 'flight__flight' },
44211
- React__default['default'].createElement(
44212
- 'div',
44213
- { className: 'flight__flight__header' },
44214
- React__default['default'].createElement('div', { className: 'flight__status__container' }),
44215
- React__default['default'].createElement(
44216
- 'div',
44217
- { className: 'flight__price' },
44218
- React__default['default'].createElement('span', { className: 'price' }, '\u20AC ', flight.price.toFixed(2)),
44219
- React__default['default'].createElement(
44220
- 'button',
44221
- {
44222
- type: 'button',
44223
- className: 'cta '.concat(flight.isSelected ? 'cta--selected' : 'cta--select'),
44224
- onClick: function () {
44225
- return dispatch(selectFlight({ flightOptionId: flight.flightOptionId, isDeparture: !!isDeparture }));
44226
- }
44227
- },
44228
- flight.isSelected ? 'Selected' : 'Select'
44229
- )
44230
- )
44231
- )
44232
- ),
44233
- React__default['default'].createElement(
44234
- 'div',
44235
- { className: 'flight__flight' },
44236
- React__default['default'].createElement(
44237
- 'div',
44238
- { className: 'flight__flight__container' },
44239
- React__default['default'].createElement(
44240
- 'div',
44241
- { className: 'flight__flight__wrapper' },
44242
- React__default['default'].createElement(
44243
- 'div',
44244
- { className: 'flight__logo__wrapper' },
44245
- React__default['default'].createElement('img', {
44246
- src: 'https://media.tidesoftware.be/media/shared/Airlines/'.concat(firstLine.airlineCode, '.png?height=256'),
44247
- alt: flight.airlineDescription,
44248
- className: 'flight__logo'
44249
- }),
44250
- React__default['default'].createElement('span', null, flight.airlineDescription)
44251
- ),
44252
- React__default['default'].createElement(
44253
- 'div',
44254
- { className: 'flight__info' },
44255
- React__default['default'].createElement(
44256
- 'div',
44257
- { className: 'flight__info__times' },
44258
- React__default['default'].createElement('strong', null, firstLine.departureTime, ' ', firstLine.departureAirport),
44259
- React__default['default'].createElement('p', null, dateFns.format(dateFns.parseISO(firstLine.departureDate), 'EEE dd MMM yyyy'))
44260
- ),
44261
- React__default['default'].createElement(
44262
- 'div',
44263
- { className: 'flight__info__duration' },
44264
- React__default['default'].createElement('p', null, formatDuration(flight.flightMetaData.durationInTicks)),
44265
- React__default['default'].createElement(
44266
- 'div',
44267
- { className: 'flight__info__duration__stops' },
44268
- stops > 0 && React__default['default'].createElement('div', { className: 'flight__info__duration__stop' })
44269
- ),
44270
- React__default['default'].createElement(
44271
- 'span',
44272
- null,
44273
- stops === 0
44274
- ? translations.SRP.DIRECT
44275
- : ''
44276
- .concat(stops, ' ')
44277
- .concat(translations.SRP.STOP)
44278
- .concat(stops > 1 ? 's' : '')
44279
- )
44280
- ),
44281
- React__default['default'].createElement(
44282
- 'div',
44283
- { className: 'flight__info__times flight__info__times--arrival' },
44284
- React__default['default'].createElement('strong', null, lastLine.arrivalTime, ' ', lastLine.arrivalAirport),
44285
- React__default['default'].createElement('p', null, dateFns.format(dateFns.parseISO(lastLine.arrivalDate), 'EEE dd MMM yyyy'))
44286
- )
44287
- )
44288
- ),
44289
- React__default['default'].createElement(
44290
- 'div',
44291
- { className: 'flight__detail__btn__wrapper' },
44292
- React__default['default'].createElement(
44293
- 'div',
44294
- {
44295
- className: 'flight__detail__btn '.concat(activeDetailId === flight.flightOptionId ? 'flight__detail__btn--active' : ''),
44296
- onClick: function () {
44297
- return handleDetailClick(flight.flightOptionId);
44298
- }
44299
- },
44300
- React__default['default'].createElement(Icon$1, {
44301
- name: 'ui-chevron',
44302
- className: 'flight__detail__btn__arrow',
44303
- width: 16,
44304
- height: 16
44305
- })
44306
- )
44307
- )
44308
- ),
44309
- React__default['default'].createElement(
44310
- 'div',
44311
- { className: 'flight__detail '.concat(activeDetailId === flight.flightOptionId ? 'flight__detail--active' : '') },
44312
- lines.map(function (line, index) {
44313
- var nextLine = lines[index + 1];
44314
- return React__default['default'].createElement(
44315
- React__default['default'].Fragment,
44316
- { key: index },
44317
- React__default['default'].createElement(
44318
- 'div',
44319
- { className: 'flight__info' },
44320
- React__default['default'].createElement(
44321
- 'div',
44322
- { className: 'flight__info__times__wrapper' },
44323
- React__default['default'].createElement(
44324
- 'div',
44325
- { className: 'flight__info__times' },
44326
- React__default['default'].createElement('p', null, line.departureTime),
44327
- React__default['default'].createElement('strong', null, line.departureAirport),
44328
- React__default['default'].createElement('p', null, dateFns.format(dateFns.parseISO(line.departureDate), 'EEE dd MMM yyyy'))
44329
- ),
44330
- React__default['default'].createElement(Icon$1, { name: 'ui-plane-depart', width: 30, height: 20 })
44331
- ),
44332
- React__default['default'].createElement(
44333
- 'div',
44334
- { className: 'flight__info__duration' },
44335
- React__default['default'].createElement('p', null, formatDuration(line.durationInTicks)),
44336
- React__default['default'].createElement('span', null, line.airline, ' ', line.number)
44337
- ),
44338
- React__default['default'].createElement(
44339
- 'div',
44340
- { className: 'flight__info__times__wrapper flight__info__times__wrapper--arrival' },
44341
- React__default['default'].createElement(Icon$1, { name: 'ui-plane-arrive', width: 30, height: 20 }),
44342
- React__default['default'].createElement(
44343
- 'div',
44344
- { className: 'flight__info__times flight__info__times--arrival' },
44345
- React__default['default'].createElement('p', null, line.arrivalTime),
44346
- React__default['default'].createElement('strong', null, line.arrivalAirport),
44347
- React__default['default'].createElement('p', null, dateFns.format(dateFns.parseISO(line.arrivalDate), 'EEE dd MMM yyyy'))
44348
- )
44349
- )
44350
- ),
44351
- nextLine &&
44352
- React__default['default'].createElement(
44353
- 'div',
44354
- { className: 'flight__info' },
44355
- React__default['default'].createElement(
44356
- 'div',
44357
- { className: 'flight__info__duration flight__info__duration--waittime' },
44358
- React__default['default'].createElement(
44359
- 'div',
44360
- { className: 'flight__info__duration__stops flight__info__duration__stops--stoptime' },
44361
- React__default['default'].createElement(Icon$1, { name: 'ui-clock', width: 24, height: 24 })
44362
- ),
44363
- React__default['default'].createElement(
44364
- 'div',
44365
- { className: 'flight__info__duration__stoptime' },
44366
- React__default['default'].createElement('span', null, translations.SRP.STOP_TIME),
44367
- React__default['default'].createElement(
44368
- 'strong',
44369
- null,
44370
- formatDuration(dateFns.parseISO(nextLine.departureDate).getTime() - dateFns.parseISO(line.arrivalDate).getTime())
44371
- )
44372
- )
44373
- )
44374
- )
44375
- );
44376
- })
44377
- )
44378
- )
44379
- ),
44380
- React__default['default'].createElement('div', { className: 'flight__rate' })
44381
- )
44382
- )
44383
- );
44384
- })
44385
- )
44386
- );
44387
- };
44388
-
44389
44168
  var PairedFlightOption = function (_a) {
44390
44169
  var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
44391
44170
  var item = _a.item;
@@ -44856,7 +44635,6 @@ var IndependentFlightOption = function (_a) {
44856
44635
  guid = _a.guid,
44857
44636
  selectedGuid = _a.selectedGuid;
44858
44637
  _a.isOutward;
44859
- reactRedux.useDispatch();
44860
44638
  var context = React.useContext(SearchResultsConfigurationContext);
44861
44639
  var language = (_b = context === null || context === void 0 ? void 0 : context.languageCode) !== null && _b !== void 0 ? _b : 'en-GB';
44862
44640
  var translations = getTranslations(language);
@@ -45083,14 +44861,6 @@ var IndependentFlightOption = function (_a) {
45083
44861
  );
45084
44862
  };
45085
44863
 
45086
- var getFlightKey = function (segments) {
45087
- if (!segments || segments.length === 0) return '';
45088
- return segments
45089
- .map(function (s) {
45090
- return ''.concat(s.marketingAirlineCode).concat(s.flightNumber, '_').concat(s.departureDateTime);
45091
- })
45092
- .join('_');
45093
- };
45094
44864
  var IndependentFlightSelection = function (_a) {
45095
44865
  var _b;
45096
44866
  var searchResults = _a.searchResults;
@@ -47322,6 +47092,118 @@ var getRequestRoomsFromPackagingSegments = function (entry, segments) {
47322
47092
  });
47323
47093
  };
47324
47094
 
47095
+ var formatNodeDate = function (date) {
47096
+ if (!date) return '';
47097
+ try {
47098
+ return new Intl.DateTimeFormat('nl-BE', {
47099
+ weekday: 'long',
47100
+ day: '2-digit',
47101
+ month: '2-digit',
47102
+ year: 'numeric'
47103
+ }).format(date);
47104
+ } catch (_a) {
47105
+ return '';
47106
+ }
47107
+ };
47108
+ var escapeHtml = function (value) {
47109
+ if (!value) return '';
47110
+ return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
47111
+ };
47112
+ var buildItineraryHtml = function (itinerary) {
47113
+ var _a;
47114
+ if (!itinerary) {
47115
+ return '\n <div class="itinerary-shell">\n <div class="itinerary-empty">Geen reisroute beschikbaar.</div>\n </div>\n ';
47116
+ }
47117
+ var nodesHtml = ((_a = itinerary.nodes) !== null && _a !== void 0 ? _a : [])
47118
+ .map(function (node) {
47119
+ var hasItems = Array.isArray(node.items) && node.items.length > 0;
47120
+ var itemsHtml = hasItems
47121
+ ? node.items
47122
+ .map(function (item) {
47123
+ var _a;
47124
+ return '\n <article class="itinerary-item" data-template="'
47125
+ .concat(escapeHtml(item.templateName), '">\n ')
47126
+ .concat((_a = item.contents) !== null && _a !== void 0 ? _a : '', '\n </article>\n ');
47127
+ })
47128
+ .join('')
47129
+ : '<div class="itinerary-node__empty">Geen items voor deze dag.</div>';
47130
+ return '\n <section class="itinerary-node">\n <header class="itinerary-node__header">\n <div class="itinerary-node__day">Dag '
47131
+ .concat(node.startDay)
47132
+ .concat(
47133
+ node.endDay > node.startDay ? ' - '.concat(node.endDay) : '',
47134
+ '</div>\n <div class="itinerary-node__meta">\n <h2 class="itinerary-node__title">'
47135
+ )
47136
+ .concat(escapeHtml(node.title), '</h2>\n <div class="itinerary-node__date">')
47137
+ .concat(
47138
+ escapeHtml(formatNodeDate(node.startDate)),
47139
+ '</div>\n </div>\n </header>\n\n <div class="itinerary-node__content">\n '
47140
+ )
47141
+ .concat(itemsHtml, '\n </div>\n </section>\n ');
47142
+ })
47143
+ .join('');
47144
+ var defaultItemsHtml =
47145
+ itinerary.defaultItems && itinerary.defaultItems.length > 0
47146
+ ? '\n <section class="itinerary-default-items">\n <h2 class="itinerary-default-items__title">Algemene info</h2>\n '.concat(
47147
+ itinerary.defaultItems
47148
+ .map(function (item) {
47149
+ var _a;
47150
+ return '\n <article class="itinerary-item" data-template="'
47151
+ .concat(escapeHtml(item.templateName), '">\n ')
47152
+ .concat((_a = item.contents) !== null && _a !== void 0 ? _a : '', '\n </article>\n ');
47153
+ })
47154
+ .join(''),
47155
+ '\n </section>\n '
47156
+ )
47157
+ : '';
47158
+ return '\n <div class="itinerary-shell">\n '
47159
+ .concat(
47160
+ itinerary.title
47161
+ ? '<header class="itinerary-shell__header"><h1 class="itinerary-shell__title">'.concat(escapeHtml(itinerary.title), '</h1></header>')
47162
+ : '',
47163
+ '\n\n <div class="itinerary-shell__content">\n '
47164
+ )
47165
+ .concat(nodesHtml, '\n ')
47166
+ .concat(defaultItemsHtml, '\n </div>\n </div>\n ');
47167
+ };
47168
+ var FullItinerary = function (_a) {
47169
+ var isLoading = _a.isLoading;
47170
+ if (isLoading) {
47171
+ return React__default['default'].createElement(Spinner, null);
47172
+ }
47173
+ var itinerary = reactRedux.useSelector(function (state) {
47174
+ return state.searchResults;
47175
+ }).itinerary;
47176
+ var hostRef = React.useRef(null);
47177
+ var shadowRootRef = React.useRef(null);
47178
+ var html = React.useMemo(
47179
+ function () {
47180
+ return buildItineraryHtml(itinerary);
47181
+ },
47182
+ [itinerary]
47183
+ );
47184
+ React.useEffect(
47185
+ function () {
47186
+ var _a;
47187
+ if (!hostRef.current) {
47188
+ return;
47189
+ }
47190
+ if (!shadowRootRef.current) {
47191
+ shadowRootRef.current = hostRef.current.attachShadow({ mode: 'open' });
47192
+ }
47193
+ var shadowRoot = shadowRootRef.current;
47194
+ shadowRoot.innerHTML =
47195
+ "\n <style>\n :host {\n all: initial;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n .itinerary-shell {\n width: 100%;\n margin: 0 auto;\n font-family: 'Outfit', sans-serif;\n color: #222;\n }\n\n .itinerary-shell__header {\n margin-bottom: 24px;\n }\n\n .itinerary-shell__title {\n margin: 0;\n font-size: 32px;\n line-height: 1.2;\n }\n\n .itinerary-shell__content {\n display: grid;\n gap: 24px;\n }\n\n .itinerary-node {\n border: 1px solid #e5e7eb;\n border-radius: 16px;\n overflow: hidden;\n background: #fff;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.04);\n }\n\n .itinerary-node__header {\n display: flex;\n gap: 16px;\n align-items: flex-start;\n padding: 20px 20px 16px;\n border-bottom: 1px solid #eef0f2;\n background: #fafafa;\n }\n\n .itinerary-node__day {\n flex: 0 0 auto;\n min-width: 72px;\n padding: 8px 12px;\n border-radius: 999px;\n font-size: 14px;\n font-weight: 700;\n line-height: 1;\n background: #111827;\n color: #fff;\n text-align: center;\n }\n\n .itinerary-node__meta {\n min-width: 0;\n }\n\n .itinerary-node__title {\n margin: 0;\n font-size: 22px;\n line-height: 1.25;\n }\n\n .itinerary-node__date {\n margin-top: 6px;\n font-size: 14px;\n color: #6b7280;\n }\n\n .itinerary-node__content {\n display: grid;\n gap: 20px;\n padding: 20px;\n }\n\n .itinerary-item {\n display: block;\n border-radius: 12px;\n overflow: hidden;\n background: #fff;\n }\n\n .itinerary-node__empty,\n .itinerary-empty {\n padding: 20px;\n border: 1px dashed #d1d5db;\n border-radius: 12px;\n color: #6b7280;\n background: #fafafa;\n }\n\n .itinerary-default-items {\n border: 1px solid #e5e7eb;\n border-radius: 16px;\n padding: 20px;\n background: #fff;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.04);\n }\n\n .itinerary-default-items__title {\n margin: 0 0 16px;\n font-size: 22px;\n }\n\n @media (max-width: 768px) {\n .itinerary-shell {\n padding: 16px;\n }\n\n .itinerary-node__header {\n flex-direction: column;\n }\n\n .itinerary-node__day {\n min-width: auto;\n }\n }\n\n "
47196
+ .concat(
47197
+ (_a = itinerary === null || itinerary === void 0 ? void 0 : itinerary.styleSheetBody) !== null && _a !== void 0 ? _a : '',
47198
+ '\n </style>\n\n '
47199
+ )
47200
+ .concat(html, '\n ');
47201
+ },
47202
+ [html, itinerary === null || itinerary === void 0 ? void 0 : itinerary.styleSheetBody]
47203
+ );
47204
+ return React__default['default'].createElement('div', { ref: hostRef });
47205
+ };
47206
+
47325
47207
  var SearchResultsContainer = function () {
47326
47208
  var _a, _b;
47327
47209
  var currentSearch = typeof window !== 'undefined' ? window.location.search : '';
@@ -47334,9 +47216,9 @@ var SearchResultsContainer = function () {
47334
47216
  results = _c.results,
47335
47217
  filteredResults = _c.filteredResults,
47336
47218
  packagingAccoResults = _c.packagingAccoResults,
47337
- filteredPackagingAccoResults = _c.filteredPackagingAccoResults,
47338
- bookingPackageDetails = _c.bookingPackageDetails,
47339
- isLoading = _c.isLoading,
47219
+ filteredPackagingAccoResults = _c.filteredPackagingAccoResults;
47220
+ _c.bookingPackageDetails;
47221
+ var isLoading = _c.isLoading,
47340
47222
  filters = _c.filters,
47341
47223
  selectedSortType = _c.selectedSortType,
47342
47224
  selectedSearchResult = _c.selectedSearchResult,
@@ -47345,7 +47227,9 @@ var SearchResultsContainer = function () {
47345
47227
  packagingAccoSearchDetails = _c.packagingAccoSearchDetails,
47346
47228
  editablePackagingEntry = _c.editablePackagingEntry,
47347
47229
  transactionId = _c.transactionId,
47348
- accommodationFlyInStep = _c.accommodationFlyInStep;
47230
+ accommodationFlyInStep = _c.accommodationFlyInStep,
47231
+ itinerary = _c.itinerary,
47232
+ packagingFlightResults = _c.packagingFlightResults;
47349
47233
  var isMobile = useMediaQuery('(max-width: 1200px)');
47350
47234
  var _d = React.useState(false),
47351
47235
  initialFiltersSet = _d[0],
@@ -47363,11 +47247,15 @@ var SearchResultsContainer = function () {
47363
47247
  pricesAreLoading = _h[0],
47364
47248
  setPricesAreLoading = _h[1];
47365
47249
  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];
47250
+ itineraryIsLoading = _j[0],
47251
+ setItineraryIsLoading = _j[1];
47252
+ var _k = React.useState(false),
47253
+ itineraryOpen = _k[0],
47254
+ setItineraryOpen = _k[1];
47255
+ var _l = React.useState(null),
47256
+ selectedAccommodationSeed = _l[0],
47257
+ setSelectedAccommodationSeed = _l[1];
47258
+ var skipInitialPackagingAccoDetailsRef = React.useRef(false);
47371
47259
  var panelRef = React.useRef(null);
47372
47260
  var sortByTypes = [
47373
47261
  { direction: 'asc', label: 'default' },
@@ -47479,7 +47367,7 @@ var SearchResultsContainer = function () {
47479
47367
  };
47480
47368
  };
47481
47369
  var buildPackagingAccommodationRequestFromSeed = function (seed, currentTransactionId) {
47482
- var _a, _b, _c, _d;
47370
+ var _a, _b, _c, _d, _e, _f;
47483
47371
  var country = seed.country;
47484
47372
  var region = seed.region;
47485
47373
  var oord = seed.oord;
@@ -47515,11 +47403,15 @@ var SearchResultsContainer = function () {
47515
47403
  }
47516
47404
  return {
47517
47405
  transactionId: currentTransactionId,
47518
- officeId: 1,
47519
- agentId: (_b = context === null || context === void 0 ? void 0 : context.agentId) !== null && _b !== void 0 ? _b : null,
47520
- catalogueId: (_c = context.searchConfiguration.defaultCatalogueId) !== null && _c !== void 0 ? _c : 0,
47406
+ officeId:
47407
+ (_c = (_b = context === null || context === void 0 ? void 0 : context.tideConnection) === null || _b === void 0 ? void 0 : _b.officeId) !== null &&
47408
+ _c !== void 0
47409
+ ? _c
47410
+ : 1,
47411
+ agentId: (_d = context === null || context === void 0 ? void 0 : context.agentId) !== null && _d !== void 0 ? _d : null,
47412
+ catalogueId: (_e = context.searchConfiguration.defaultCatalogueId) !== null && _e !== void 0 ? _e : 0,
47521
47413
  searchConfigurationId: context.searchConfiguration.id,
47522
- language: (_d = context.languageCode) !== null && _d !== void 0 ? _d : 'en-GB',
47414
+ language: (_f = context.languageCode) !== null && _f !== void 0 ? _f : 'en-GB',
47523
47415
  serviceType: ACCOMMODATION_SERVICE_TYPE,
47524
47416
  fromDate: seed.fromDate,
47525
47417
  toDate: seed.toDate,
@@ -47537,6 +47429,75 @@ var SearchResultsContainer = function () {
47537
47429
  tagIds: tagId ? [tagId] : []
47538
47430
  };
47539
47431
  };
47432
+ var buildPackagingFlightRequestFromSeed = function (seed, currentTransactionId) {
47433
+ var _a, _b, _c, _d;
47434
+ if (typeof window !== 'undefined') {
47435
+ window.scrollTo(0, 0);
47436
+ }
47437
+ var adults = seed.rooms
47438
+ .flatMap(function (x) {
47439
+ return x.pax;
47440
+ })
47441
+ .filter(function (x) {
47442
+ return x.age >= 18;
47443
+ }).length;
47444
+ var kids = seed.rooms
47445
+ .flatMap(function (x) {
47446
+ return x.pax;
47447
+ })
47448
+ .filter(function (x) {
47449
+ return x.age >= 2 && x.age < 18;
47450
+ }).length;
47451
+ var babies = seed.rooms
47452
+ .flatMap(function (x) {
47453
+ return x.pax;
47454
+ })
47455
+ .filter(function (x) {
47456
+ return x.age < 2;
47457
+ }).length;
47458
+ return {
47459
+ transactionId: currentTransactionId,
47460
+ officeId:
47461
+ (_b = (_a = context === null || context === void 0 ? void 0 : context.tideConnection) === null || _a === void 0 ? void 0 : _a.officeId) !== null &&
47462
+ _b !== void 0
47463
+ ? _b
47464
+ : 1,
47465
+ catalogueId:
47466
+ (_d = lodash.first(
47467
+ (_c = context === null || context === void 0 ? void 0 : context.tideConnection) === null || _c === void 0 ? void 0 : _c.catalogueIds
47468
+ )) !== null && _d !== void 0
47469
+ ? _d
47470
+ : 0,
47471
+ departureAirportCode: seed.departureAirport,
47472
+ arrivalAirportCode: seed.destinationAirport,
47473
+ returnAirportCode: seed.returnAirport,
47474
+ luggageIncluded: null,
47475
+ maxStops: null,
47476
+ travelClass: seed.travelClass,
47477
+ pax: lodash.concat(
47478
+ Array.from({ length: adults !== null && adults !== void 0 ? adults : 0 }, function (_, index) {
47479
+ return {
47480
+ id: index,
47481
+ age: 31
47482
+ };
47483
+ }),
47484
+ Array.from({ length: kids !== null && kids !== void 0 ? kids : 0 }, function (_, index) {
47485
+ return {
47486
+ id: index + (adults !== null && adults !== void 0 ? adults : 0),
47487
+ age: 8
47488
+ };
47489
+ }),
47490
+ Array.from({ length: babies !== null && babies !== void 0 ? babies : 0 }, function (_, index) {
47491
+ return {
47492
+ id: index + (adults !== null && adults !== void 0 ? adults : 0) + (kids !== null && kids !== void 0 ? kids : 0),
47493
+ age: 1
47494
+ };
47495
+ })
47496
+ ),
47497
+ outward: seed.fromDate ? { date: dateToDateStruct(new Date(seed.fromDate)) } : null,
47498
+ return: seed.toDate ? { date: dateToDateStruct(new Date(seed.toDate)) } : null
47499
+ };
47500
+ };
47540
47501
  var buildSearchSeedFromQueryParams = function (params) {
47541
47502
  var from = getDateFromParams(params, 'fromDate');
47542
47503
  var to = getDateFromParams(params, 'toDate');
@@ -47549,6 +47510,8 @@ var SearchResultsContainer = function () {
47549
47510
  var tagId = getNumberFromParams(params, 'tagId');
47550
47511
  var destinationAirport = getStringFromParams(params, 'destinationAirport');
47551
47512
  var departureAirport = getStringFromParams(params, 'departureAirport');
47513
+ var travelClass = getStringFromParams(params, 'travelClass');
47514
+ var nationality = getStringFromParams(params, 'nationality');
47552
47515
  if (!from || !to) {
47553
47516
  return null;
47554
47517
  }
@@ -47564,12 +47527,68 @@ var SearchResultsContainer = function () {
47564
47527
  tagId: tagId,
47565
47528
  destinationAirport: destinationAirport,
47566
47529
  departureAirport: departureAirport,
47530
+ travelClass: travelClass,
47531
+ nationality: nationality,
47567
47532
  rooms: getRequestRooms(rooms)
47568
47533
  };
47569
47534
  };
47535
+ var buildSearchSeedFromAccommodationSegments = function (entry, segments) {
47536
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
47537
+ if (!(segments === null || segments === void 0 ? void 0 : segments.length)) return null;
47538
+ var sortedSegments = __spreadArray([], segments, true).sort(function (a, b) {
47539
+ return new Date(a.from).getTime() - new Date(b.from).getTime();
47540
+ });
47541
+ var firstSegment = lodash.first(sortedSegments);
47542
+ var lastSegment = lodash.last(sortedSegments);
47543
+ if (!firstSegment || !lastSegment) return null;
47544
+ return {
47545
+ fromDate: toDateOnlyString(firstSegment.from),
47546
+ toDate: toDateOnlyString(lastSegment.to),
47547
+ country: (_b = (_a = firstSegment.country) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : null,
47548
+ region: (_d = (_c = firstSegment.region) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : null,
47549
+ oord: (_f = (_e = firstSegment.oord) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : null,
47550
+ location: (_h = (_g = firstSegment.location) === null || _g === void 0 ? void 0 : _g.id) !== null && _h !== void 0 ? _h : null,
47551
+ hotel: parseHotelId(firstSegment),
47552
+ hotelCode: (_j = firstSegment.productCode) !== null && _j !== void 0 ? _j : null,
47553
+ tagId: null,
47554
+ destinationAirport: getDestinationAirportFromEntry((_k = entry.lines) !== null && _k !== void 0 ? _k : []),
47555
+ departureAirport: getDepartureAirportFromEntry((_l = entry.lines) !== null && _l !== void 0 ? _l : []),
47556
+ rooms: getRequestRoomsFromPackagingSegments(entry, sortedSegments)
47557
+ };
47558
+ };
47559
+ var handleEditAccommodation = function (segments) {
47560
+ return __awaiter(void 0, void 0, void 0, function () {
47561
+ var sourceEntry, seed, currentTransactionId;
47562
+ return __generator(this, function (_a) {
47563
+ switch (_a.label) {
47564
+ case 0:
47565
+ sourceEntry =
47566
+ editablePackagingEntry !== null && editablePackagingEntry !== void 0
47567
+ ? editablePackagingEntry
47568
+ : context === null || context === void 0
47569
+ ? void 0
47570
+ : context.packagingEntry;
47571
+ if (!sourceEntry) return [2 /*return*/];
47572
+ seed = buildSearchSeedFromAccommodationSegments(sourceEntry, segments);
47573
+ if (!seed) return [2 /*return*/];
47574
+ setDetailsIsLoading(true);
47575
+ setSelectedAccommodationSeed(seed);
47576
+ dispatch(setAccommodationFlyInStep('results'));
47577
+ handleFlyInToggle(true);
47578
+ return [4 /*yield*/, getOrCreateTransactionId()];
47579
+ case 1:
47580
+ currentTransactionId = _a.sent();
47581
+ return [4 /*yield*/, runAccommodationFlow(seed, currentTransactionId !== null && currentTransactionId !== void 0 ? currentTransactionId : '')];
47582
+ case 2:
47583
+ _a.sent();
47584
+ setDetailsIsLoading(false);
47585
+ return [2 /*return*/];
47586
+ }
47587
+ });
47588
+ });
47589
+ };
47570
47590
  var handleConfirmHotelSwap = function () {
47571
47591
  var updatedEntry = swapHotelInPackagingEntry();
47572
- console.log('Updated entry after hotel swap', updatedEntry);
47573
47592
  if (!updatedEntry) return;
47574
47593
  dispatch(setEditablePackagingEntry(updatedEntry));
47575
47594
  handleFlyInToggle(false);
@@ -47584,7 +47603,6 @@ var SearchResultsContainer = function () {
47584
47603
  var details = packagingAccoSearchDetails;
47585
47604
  if (!sourceEntry || !(details === null || details === void 0 ? void 0 : details.length)) return null;
47586
47605
  var selectedOptionsPerRoom = getSelectedOptionsPerRoom(details);
47587
- console.log('Selected options per room', selectedOptionsPerRoom);
47588
47606
  if (!selectedOptionsPerRoom.length) return null;
47589
47607
  var selectedHotel = details[0];
47590
47608
  var roomIndex = 0;
@@ -47597,7 +47615,6 @@ var SearchResultsContainer = function () {
47597
47615
  return x.roomIndex === roomIndex;
47598
47616
  });
47599
47617
  var selectedOption = selectedRoom === null || selectedRoom === void 0 ? void 0 : selectedRoom.option;
47600
- console.log('selectedRoom and selectedOption for line', line, selectedRoom, selectedOption);
47601
47618
  roomIndex++;
47602
47619
  if (!selectedOption) {
47603
47620
  return line;
@@ -47670,6 +47687,25 @@ var SearchResultsContainer = function () {
47670
47687
  },
47671
47688
  [filtersOpen]
47672
47689
  );
47690
+ var getOrCreateTransactionId = function () {
47691
+ return __awaiter(void 0, void 0, void 0, function () {
47692
+ var _a;
47693
+ return __generator(this, function (_b) {
47694
+ switch (_b.label) {
47695
+ case 0:
47696
+ if ((_a = context === null || context === void 0 ? void 0 : context.packagingEntry) === null || _a === void 0 ? void 0 : _a.transactionId) {
47697
+ return [2 /*return*/, context.packagingEntry.transactionId];
47698
+ }
47699
+ if (transactionId) {
47700
+ return [2 /*return*/, transactionId];
47701
+ }
47702
+ return [4 /*yield*/, runStartTransaction()];
47703
+ case 1:
47704
+ return [2 /*return*/, _b.sent()];
47705
+ }
47706
+ });
47707
+ });
47708
+ };
47673
47709
  var runSearch = function () {
47674
47710
  return __awaiter(void 0, void 0, void 0, function () {
47675
47711
  var config, seed, searchRequest, packageSearchResults, enrichedFilters, initialFilteredResults, err_1;
@@ -47692,7 +47728,6 @@ var SearchResultsContainer = function () {
47692
47728
  return [4 /*yield*/, build.search(config, searchRequest)];
47693
47729
  case 1:
47694
47730
  packageSearchResults = _b.sent();
47695
- console.log('Search results', packageSearchResults);
47696
47731
  enrichedFilters = enrichFiltersWithResults(packageSearchResults, context.filters, (_a = context.tags) !== null && _a !== void 0 ? _a : []);
47697
47732
  if (!initialFiltersSet) {
47698
47733
  dispatch(resetFilters(enrichedFilters));
@@ -47752,11 +47787,11 @@ var SearchResultsContainer = function () {
47752
47787
  var runHotelSearch = function (currentTransactionId, seed) {
47753
47788
  return __awaiter(void 0, void 0, void 0, function () {
47754
47789
  var config, searchRequest, packageAccoSearchResults, enrichedFilters, initialFilteredResults, err_3;
47755
- var _a;
47756
- return __generator(this, function (_b) {
47757
- switch (_b.label) {
47790
+ var _a, _b, _c;
47791
+ return __generator(this, function (_d) {
47792
+ switch (_d.label) {
47758
47793
  case 0:
47759
- _b.trys.push([0, 2, , 3]);
47794
+ _d.trys.push([0, 2, , 3]);
47760
47795
  if (!context) return [2 /*return*/];
47761
47796
  dispatch(setIsLoading(true));
47762
47797
  config = {
@@ -47766,10 +47801,9 @@ var SearchResultsContainer = function () {
47766
47801
  searchRequest = buildPackagingAccommodationRequestFromSeed(seed, currentTransactionId);
47767
47802
  searchRequest.portalId = context.portalId;
47768
47803
  searchRequest.agentId = context.agentId;
47769
- console.log('Packaging accommodation search request', searchRequest);
47770
47804
  return [4 /*yield*/, build.searchPackagingAccommodations(config, searchRequest)];
47771
47805
  case 1:
47772
- packageAccoSearchResults = _b.sent();
47806
+ packageAccoSearchResults = _d.sent();
47773
47807
  enrichedFilters = enrichFiltersWithPackageAccoResults(
47774
47808
  packageAccoSearchResults,
47775
47809
  context.filters,
@@ -47783,11 +47817,19 @@ var SearchResultsContainer = function () {
47783
47817
  dispatch(setPackagingAccoResults(packageAccoSearchResults));
47784
47818
  initialFilteredResults = applyFiltersToPackageAccoResults(packageAccoSearchResults, filters, null);
47785
47819
  dispatch(setFilteredPackagingAccoResults(initialFilteredResults));
47820
+ if (initialFilteredResults.length > 0) {
47821
+ skipInitialPackagingAccoDetailsRef.current = true;
47822
+ dispatch(
47823
+ setSelectedPackagingAccoResult(
47824
+ (_c = (_b = lodash.first(initialFilteredResults)) === null || _b === void 0 ? void 0 : _b.code) !== null && _c !== void 0 ? _c : null
47825
+ )
47826
+ );
47827
+ }
47786
47828
  dispatch(setIsLoading(false));
47787
47829
  return [3 /*break*/, 3];
47788
47830
  case 2:
47789
- err_3 = _b.sent();
47790
- console.error('Search failed', err_3);
47831
+ err_3 = _d.sent();
47832
+ console.error('HotelSearch failed', err_3);
47791
47833
  dispatch(setIsLoading(false));
47792
47834
  return [3 /*break*/, 3];
47793
47835
  case 3:
@@ -47796,32 +47838,61 @@ var SearchResultsContainer = function () {
47796
47838
  });
47797
47839
  });
47798
47840
  };
47799
- var runAccommodationFlow = function (seed) {
47841
+ var runAccommodationFlow = function (seed, currentTransactionId) {
47800
47842
  return __awaiter(void 0, void 0, void 0, function () {
47801
- var currentTransactionId;
47802
- var _a;
47803
- return __generator(this, function (_b) {
47804
- switch (_b.label) {
47843
+ return __generator(this, function (_a) {
47844
+ switch (_a.label) {
47805
47845
  case 0:
47806
47846
  if (!context || context.showMockup) return [2 /*return*/];
47807
- currentTransactionId =
47808
- ((_a = context === null || context === void 0 ? void 0 : context.packagingEntry) === null || _a === void 0 ? void 0 : _a.transactionId) ||
47809
- transactionId;
47810
- console.log('Current transaction ID', currentTransactionId);
47811
- if (!!currentTransactionId) return [3 /*break*/, 2];
47812
- dispatch(setIsLoading(true));
47813
- return [4 /*yield*/, runStartTransaction()];
47847
+ return [4 /*yield*/, runHotelSearch(currentTransactionId, seed)];
47814
47848
  case 1:
47815
- currentTransactionId = _b.sent();
47816
- _b.label = 2;
47849
+ _a.sent();
47850
+ return [2 /*return*/];
47851
+ }
47852
+ });
47853
+ });
47854
+ };
47855
+ var runFlightSearch = function (currentTransactionId, seed) {
47856
+ return __awaiter(void 0, void 0, void 0, function () {
47857
+ var config, searchRequest, packageFlightSearchResults, err_4;
47858
+ return __generator(this, function (_a) {
47859
+ switch (_a.label) {
47860
+ case 0:
47861
+ _a.trys.push([0, 2, , 3]);
47862
+ if (!context) return [2 /*return*/];
47863
+ dispatch(setFlightsLoading(true));
47864
+ config = {
47865
+ host: context.tideConnection.host,
47866
+ apiKey: context.tideConnection.apiKey
47867
+ };
47868
+ searchRequest = buildPackagingFlightRequestFromSeed(seed, currentTransactionId);
47869
+ searchRequest.agentId = context.agentId;
47870
+ return [4 /*yield*/, build.searchPackagingFlights(config, searchRequest)];
47871
+ case 1:
47872
+ packageFlightSearchResults = _a.sent();
47873
+ dispatch(setPackagingFlightResults(packageFlightSearchResults));
47874
+ dispatch(setFlightsLoading(false));
47875
+ return [3 /*break*/, 3];
47817
47876
  case 2:
47818
- if (!currentTransactionId) {
47819
- dispatch(setIsLoading(false));
47820
- return [2 /*return*/];
47821
- }
47822
- return [4 /*yield*/, runHotelSearch(currentTransactionId, seed)];
47877
+ err_4 = _a.sent();
47878
+ console.error('FlightSearch failed', err_4);
47879
+ dispatch(setFlightsLoading(false));
47880
+ return [3 /*break*/, 3];
47823
47881
  case 3:
47824
- _b.sent();
47882
+ return [2 /*return*/];
47883
+ }
47884
+ });
47885
+ });
47886
+ };
47887
+ var runFlightFlow = function (seed, currentTransactionId) {
47888
+ return __awaiter(void 0, void 0, void 0, function () {
47889
+ return __generator(this, function (_a) {
47890
+ switch (_a.label) {
47891
+ case 0:
47892
+ if (!context || context.showMockup) return [2 /*return*/];
47893
+ return [4 /*yield*/, runFlightSearch(currentTransactionId, seed)];
47894
+ case 1:
47895
+ _a.sent();
47825
47896
  return [2 /*return*/];
47826
47897
  }
47827
47898
  });
@@ -47838,20 +47909,60 @@ var SearchResultsContainer = function () {
47838
47909
  runSearch();
47839
47910
  }
47840
47911
  if ((context === null || context === void 0 ? void 0 : context.searchConfiguration.qsmType) === build.PortalQsmType.Accommodation) {
47841
- var seed = activeSearchSeed;
47842
- if (seed) {
47843
- runAccommodationFlow(seed);
47912
+ var seed_1 = activeSearchSeed;
47913
+ if (seed_1) {
47914
+ (function () {
47915
+ return __awaiter(void 0, void 0, void 0, function () {
47916
+ var transactionId;
47917
+ return __generator(this, function (_a) {
47918
+ switch (_a.label) {
47919
+ case 0:
47920
+ return [4 /*yield*/, getOrCreateTransactionId()];
47921
+ case 1:
47922
+ transactionId = _a.sent();
47923
+ if (!transactionId) return [2 /*return*/];
47924
+ return [4 /*yield*/, runAccommodationFlow(seed_1, transactionId)];
47925
+ case 2:
47926
+ _a.sent();
47927
+ return [2 /*return*/];
47928
+ }
47929
+ });
47930
+ });
47931
+ })();
47844
47932
  }
47845
47933
  }
47846
47934
  if (
47847
47935
  (context === null || context === void 0 ? void 0 : context.searchConfiguration.qsmType) === build.PortalQsmType.AccommodationAndFlight &&
47848
47936
  context.searchConfiguration.enableManualPackaging &&
47849
- context.searchConfiguration.allowAccommodations &&
47850
47937
  !(context === null || context === void 0 ? void 0 : context.packagingEntry)
47851
47938
  ) {
47852
- var seed = activeSearchSeed;
47853
- if (seed) {
47854
- runAccommodationFlow(seed);
47939
+ var seed_2 = activeSearchSeed;
47940
+ if (seed_2) {
47941
+ (function () {
47942
+ return __awaiter(void 0, void 0, void 0, function () {
47943
+ var sharedTransactionId, tasks;
47944
+ return __generator(this, function (_a) {
47945
+ switch (_a.label) {
47946
+ case 0:
47947
+ return [4 /*yield*/, getOrCreateTransactionId()];
47948
+ case 1:
47949
+ sharedTransactionId = _a.sent();
47950
+ if (!sharedTransactionId) return [2 /*return*/];
47951
+ tasks = [];
47952
+ if (context.searchConfiguration.allowAccommodations) {
47953
+ tasks.push(runAccommodationFlow(seed_2, sharedTransactionId));
47954
+ }
47955
+ if (context.searchConfiguration.allowFlights) {
47956
+ tasks.push(runFlightFlow(seed_2, sharedTransactionId));
47957
+ }
47958
+ return [4 /*yield*/, Promise.all(tasks)];
47959
+ case 2:
47960
+ _a.sent();
47961
+ return [2 /*return*/];
47962
+ }
47963
+ });
47964
+ });
47965
+ })();
47855
47966
  }
47856
47967
  }
47857
47968
  },
@@ -47867,6 +47978,7 @@ var SearchResultsContainer = function () {
47867
47978
  );
47868
47979
  React.useEffect(
47869
47980
  function () {
47981
+ console.log('packaging entry from context', context === null || context === void 0 ? void 0 : context.packagingEntry);
47870
47982
  if (context === null || context === void 0 ? void 0 : context.packagingEntry) {
47871
47983
  console.log('original packaging entry from context', context.packagingEntry);
47872
47984
  dispatch(setEditablePackagingEntry(structuredClone(context.packagingEntry)));
@@ -47880,7 +47992,7 @@ var SearchResultsContainer = function () {
47880
47992
  function () {
47881
47993
  var fetchDetails = function () {
47882
47994
  return __awaiter(void 0, void 0, void 0, function () {
47883
- var config, selectedItem, requestRooms, seed, detailsRequest, detailsResponse, err_4;
47995
+ var config, selectedItem, requestRooms, seed, detailsRequest, detailsResponse, err_5;
47884
47996
  var _a;
47885
47997
  return __generator(this, function (_b) {
47886
47998
  switch (_b.label) {
@@ -47943,8 +48055,8 @@ var SearchResultsContainer = function () {
47943
48055
  setDetailsIsLoading(false);
47944
48056
  return [3 /*break*/, 4];
47945
48057
  case 3:
47946
- err_4 = _b.sent();
47947
- console.error('Failed to fetch package details', err_4);
48058
+ err_5 = _b.sent();
48059
+ console.error('Failed to fetch package details', err_5);
47948
48060
  setDetailsIsLoading(false);
47949
48061
  return [3 /*break*/, 4];
47950
48062
  case 4:
@@ -47969,12 +48081,16 @@ var SearchResultsContainer = function () {
47969
48081
  destinationIsAirport,
47970
48082
  detailSearchRequest,
47971
48083
  packageAccoSearchDetails,
47972
- err_5;
48084
+ err_6;
47973
48085
  var _a, _b, _c, _d, _e;
47974
48086
  return __generator(this, function (_f) {
47975
48087
  switch (_f.label) {
47976
48088
  case 0:
47977
48089
  if (!selectedPackagingAccoResultCode || !context) return [2 /*return*/];
48090
+ if (skipInitialPackagingAccoDetailsRef.current) {
48091
+ skipInitialPackagingAccoDetailsRef.current = false;
48092
+ return [2 /*return*/];
48093
+ }
47978
48094
  setDetailsIsLoading(true);
47979
48095
  if (
47980
48096
  (context === null || context === void 0 ? void 0 : context.searchConfiguration.qsmType) === build.PortalQsmType.Accommodation ||
@@ -48053,13 +48169,12 @@ var SearchResultsContainer = function () {
48053
48169
  return [4 /*yield*/, build.searchPackagingAccommodations(config, detailSearchRequest)];
48054
48170
  case 2:
48055
48171
  packageAccoSearchDetails = _f.sent();
48056
- console.log('Packaging Acco Search details', packageAccoSearchDetails);
48057
48172
  dispatch(setPackagingAccoSearchDetails(packageAccoSearchDetails));
48058
48173
  setDetailsIsLoading(false);
48059
48174
  return [3 /*break*/, 4];
48060
48175
  case 3:
48061
- err_5 = _f.sent();
48062
- console.error('Failed to fetch package details', err_5);
48176
+ err_6 = _f.sent();
48177
+ console.error('Failed to fetch package details', err_6);
48063
48178
  setDetailsIsLoading(false);
48064
48179
  return [3 /*break*/, 4];
48065
48180
  case 4:
@@ -48096,75 +48211,15 @@ var SearchResultsContainer = function () {
48096
48211
  },
48097
48212
  [activeSearchSeed]
48098
48213
  );
48099
- var handleEditAccommodation = function (segments) {
48100
- return __awaiter(void 0, void 0, void 0, function () {
48101
- var sourceEntry, seed;
48102
- return __generator(this, function (_a) {
48103
- switch (_a.label) {
48104
- case 0:
48105
- sourceEntry =
48106
- editablePackagingEntry !== null && editablePackagingEntry !== void 0
48107
- ? editablePackagingEntry
48108
- : context === null || context === void 0
48109
- ? void 0
48110
- : context.packagingEntry;
48111
- if (!sourceEntry) return [2 /*return*/];
48112
- seed = buildSearchSeedFromAccommodationSegments(sourceEntry, segments);
48113
- if (!seed) return [2 /*return*/];
48114
- setDetailsIsLoading(true);
48115
- setSelectedAccommodationSeed(seed);
48116
- dispatch(setAccommodationFlyInStep('results'));
48117
- handleFlyInToggle(true);
48118
- return [4 /*yield*/, runAccommodationFlow(seed)];
48119
- case 1:
48120
- _a.sent();
48121
- setDetailsIsLoading(false);
48122
- return [2 /*return*/];
48123
- }
48124
- });
48125
- });
48126
- };
48127
- var buildSearchSeedFromAccommodationSegments = function (entry, segments) {
48128
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
48129
- if (!(segments === null || segments === void 0 ? void 0 : segments.length)) return null;
48130
- var sortedSegments = __spreadArray([], segments, true).sort(function (a, b) {
48131
- return new Date(a.from).getTime() - new Date(b.from).getTime();
48132
- });
48133
- var firstSegment = lodash.first(sortedSegments);
48134
- var lastSegment = lodash.last(sortedSegments);
48135
- if (!firstSegment || !lastSegment) return null;
48136
- return {
48137
- fromDate: toDateOnlyString(firstSegment.from),
48138
- toDate: toDateOnlyString(lastSegment.to),
48139
- country: (_b = (_a = firstSegment.country) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : null,
48140
- region: (_d = (_c = firstSegment.region) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : null,
48141
- oord: (_f = (_e = firstSegment.oord) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : null,
48142
- location: (_h = (_g = firstSegment.location) === null || _g === void 0 ? void 0 : _g.id) !== null && _h !== void 0 ? _h : null,
48143
- hotel: parseHotelId(firstSegment),
48144
- hotelCode: (_j = firstSegment.productCode) !== null && _j !== void 0 ? _j : null,
48145
- tagId: null,
48146
- destinationAirport: getDestinationAirportFromEntry((_k = entry.lines) !== null && _k !== void 0 ? _k : []),
48147
- departureAirport: getDepartureAirportFromEntry((_l = entry.lines) !== null && _l !== void 0 ? _l : []),
48148
- rooms: getRequestRoomsFromPackagingSegments(entry, sortedSegments)
48149
- };
48150
- };
48151
48214
  React.useEffect(
48152
48215
  function () {
48153
48216
  var fetchPriceDetails = function () {
48154
48217
  return __awaiter(void 0, void 0, void 0, function () {
48155
- var config, priceDetails, err_6;
48218
+ var config, priceDetails, err_7;
48156
48219
  return __generator(this, function (_a) {
48157
48220
  switch (_a.label) {
48158
48221
  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*/];
48222
+ if (!context || !editablePackagingEntry || lodash.isEmpty(editablePackagingEntry.lines)) return [2 /*return*/];
48168
48223
  setPricesAreLoading(true);
48169
48224
  _a.label = 1;
48170
48225
  case 1:
@@ -48180,8 +48235,8 @@ var SearchResultsContainer = function () {
48180
48235
  setPricesAreLoading(false);
48181
48236
  return [3 /*break*/, 4];
48182
48237
  case 3:
48183
- err_6 = _a.sent();
48184
- console.error('Error fetching price details', err_6);
48238
+ err_7 = _a.sent();
48239
+ console.error('Error fetching price details', err_7);
48185
48240
  setPricesAreLoading(false);
48186
48241
  return [3 /*break*/, 4];
48187
48242
  case 4:
@@ -48190,10 +48245,431 @@ var SearchResultsContainer = function () {
48190
48245
  });
48191
48246
  });
48192
48247
  };
48248
+ var fetchItinerary = function () {
48249
+ return __awaiter(void 0, void 0, void 0, function () {
48250
+ var config, itinerary_1, err_8;
48251
+ return __generator(this, function (_a) {
48252
+ switch (_a.label) {
48253
+ case 0:
48254
+ console.log('Fetching itinerary for entry', editablePackagingEntry);
48255
+ if (!context || !editablePackagingEntry || lodash.isEmpty(editablePackagingEntry.lines)) return [2 /*return*/];
48256
+ setItineraryIsLoading(true);
48257
+ _a.label = 1;
48258
+ case 1:
48259
+ _a.trys.push([1, 3, , 4]);
48260
+ config = {
48261
+ host: context.tideConnection.host,
48262
+ apiKey: context.tideConnection.apiKey
48263
+ };
48264
+ return [4 /*yield*/, build.getItinerary(config, editablePackagingEntry)];
48265
+ case 2:
48266
+ itinerary_1 = _a.sent();
48267
+ console.log('Fetched itinerary', itinerary_1);
48268
+ dispatch(setItinerary(itinerary_1));
48269
+ setItineraryIsLoading(false);
48270
+ return [3 /*break*/, 4];
48271
+ case 3:
48272
+ err_8 = _a.sent();
48273
+ console.error('Error fetching itinerary', err_8);
48274
+ setItineraryIsLoading(false);
48275
+ return [3 /*break*/, 4];
48276
+ case 4:
48277
+ return [2 /*return*/];
48278
+ }
48279
+ });
48280
+ });
48281
+ };
48193
48282
  fetchPriceDetails();
48283
+ fetchItinerary();
48194
48284
  },
48195
48285
  [editablePackagingEntry]
48196
48286
  );
48287
+ // Flight selection
48288
+ var _m = React.useState(null),
48289
+ selectedOutwardKey = _m[0],
48290
+ setSelectedOutwardKey = _m[1];
48291
+ var _o = React.useState(null),
48292
+ selectedReturnKey = _o[0],
48293
+ setSelectedReturnKey = _o[1];
48294
+ var uniqueOutwardFlights = React__default['default'].useMemo(
48295
+ function () {
48296
+ var map = new Map();
48297
+ packagingFlightResults.forEach(function (flight) {
48298
+ var key = getFlightKey(flight.outward.segments);
48299
+ if (!map.has(key)) {
48300
+ map.set(key, flight);
48301
+ }
48302
+ });
48303
+ return Array.from(map.values());
48304
+ },
48305
+ [packagingFlightResults]
48306
+ );
48307
+ var _p = React.useState([]),
48308
+ uniqueReturnFlights = _p[0],
48309
+ setUniqueReturnFlights = _p[1];
48310
+ React.useEffect(
48311
+ function () {
48312
+ if (!selectedOutwardKey) {
48313
+ setUniqueReturnFlights([]);
48314
+ setSelectedReturnKey(null);
48315
+ return;
48316
+ }
48317
+ // Filter combinations that match selected outward fare
48318
+ var matchingCombinations = packagingFlightResults.filter(function (flight) {
48319
+ return getFlightKey(flight.outward.segments) === selectedOutwardKey;
48320
+ });
48321
+ var returnMap = new Map();
48322
+ matchingCombinations.forEach(function (flight) {
48323
+ var key = getFlightKey(flight.return.segments);
48324
+ if (!returnMap.has(key)) {
48325
+ returnMap.set(key, flight);
48326
+ }
48327
+ });
48328
+ var returns = Array.from(returnMap.values());
48329
+ setUniqueReturnFlights(returns);
48330
+ },
48331
+ [selectedOutwardKey, packagingFlightResults]
48332
+ );
48333
+ var selectedOutward = React__default['default'].useMemo(
48334
+ function () {
48335
+ if (!selectedOutwardKey) return null;
48336
+ return (
48337
+ packagingFlightResults.find(function (flight) {
48338
+ return getFlightKey(flight.outward.segments) === selectedOutwardKey;
48339
+ }) || null
48340
+ );
48341
+ },
48342
+ [packagingFlightResults, selectedOutwardKey]
48343
+ );
48344
+ var selectedReturn = React__default['default'].useMemo(
48345
+ function () {
48346
+ if (!selectedReturnKey) return null;
48347
+ return (
48348
+ packagingFlightResults.find(function (flight) {
48349
+ return getFlightKey(flight.return.segments) === selectedReturnKey;
48350
+ }) || null
48351
+ );
48352
+ },
48353
+ [packagingFlightResults, selectedReturnKey]
48354
+ );
48355
+ var selectedCombinationFlight = React__default['default'].useMemo(
48356
+ function () {
48357
+ if (!selectedOutwardKey || !selectedReturnKey) return undefined;
48358
+ return packagingFlightResults.find(function (flight) {
48359
+ return getFlightKey(flight.outward.segments) === selectedOutwardKey && getFlightKey(flight.return.segments) === selectedReturnKey;
48360
+ });
48361
+ },
48362
+ [packagingFlightResults, selectedOutwardKey, selectedReturnKey]
48363
+ );
48364
+ // TODO: get details for selected combination flight and show in fly-in
48365
+ // useEffect(() => {
48366
+ // if (!selectedCombinationFlight) return;
48367
+ // dispatch(setSelectedPackagingFlight(selectedCombinationFlight));
48368
+ // // onFlightSearch(selectedCombinationFlight); // Trigger search to update accommodation options based on selected flight
48369
+ // dispatch(setFlyInIsOpen(true));
48370
+ // }, [selectedCombinationFlight, dispatch]);
48371
+ React.useEffect(
48372
+ function () {
48373
+ var _a, _b, _c, _d;
48374
+ if (!context) return;
48375
+ var seed = activeSearchSeed;
48376
+ if (!seed) return;
48377
+ var nextEntry = buildOrUpdatePackagingEntryPartial({
48378
+ sourceEntry:
48379
+ (_a = editablePackagingEntry !== null && editablePackagingEntry !== void 0 ? editablePackagingEntry : context.packagingEntry) !== null &&
48380
+ _a !== void 0
48381
+ ? _a
48382
+ : null,
48383
+ selectedHotelCode: selectedPackagingAccoResultCode,
48384
+ accommodationResults: packagingAccoResults,
48385
+ selectedFlight: selectedCombinationFlight !== null && selectedCombinationFlight !== void 0 ? selectedCombinationFlight : null,
48386
+ seed: seed,
48387
+ transactionId:
48388
+ (_c =
48389
+ transactionId !== null && transactionId !== void 0
48390
+ ? transactionId
48391
+ : (_b = context.packagingEntry) === null || _b === void 0
48392
+ ? void 0
48393
+ : _b.transactionId) !== null && _c !== void 0
48394
+ ? _c
48395
+ : '',
48396
+ language: (_d = context.languageCode) !== null && _d !== void 0 ? _d : 'en-GB'
48397
+ });
48398
+ console.log('Built next packaging entry', nextEntry);
48399
+ if (!nextEntry) return;
48400
+ dispatch(setEditablePackagingEntry(nextEntry));
48401
+ if (selectedCombinationFlight) {
48402
+ dispatch(setSelectedPackagingFlight(selectedCombinationFlight));
48403
+ }
48404
+ },
48405
+ [
48406
+ context,
48407
+ activeSearchSeed,
48408
+ selectedPackagingAccoResultCode,
48409
+ packagingAccoResults,
48410
+ packagingAccoSearchDetails,
48411
+ selectedCombinationFlight,
48412
+ transactionId,
48413
+ dispatch
48414
+ ]
48415
+ );
48416
+ var removeAccommodationLines = function (lines) {
48417
+ return lines.filter(function (line) {
48418
+ return line.serviceType !== ACCOMMODATION_SERVICE_TYPE;
48419
+ });
48420
+ };
48421
+ var removeFlightLines = function (lines) {
48422
+ return lines.filter(function (line) {
48423
+ return line.serviceType !== FLIGHT_SERVICE_TYPE;
48424
+ });
48425
+ };
48426
+ var buildAccommodationLinesFromSelection = function (selectedHotel, seed) {
48427
+ if (!selectedHotel) return [];
48428
+ var parentGuid = crypto.randomUUID();
48429
+ return selectedHotel.rooms
48430
+ .filter(function (room) {
48431
+ return room.options.some(function (o) {
48432
+ return o.isSelected;
48433
+ });
48434
+ })
48435
+ .map(function (room, index) {
48436
+ var _a, _b, _c, _d, _e;
48437
+ var option = room.options.find(function (o) {
48438
+ return o.isSelected;
48439
+ });
48440
+ var pax =
48441
+ (_b =
48442
+ (_a = seed.rooms) === null || _a === void 0
48443
+ ? void 0
48444
+ : _a.flatMap(function (room, roomIndex) {
48445
+ return room.pax.map(function (p, paxIndex) {
48446
+ return {
48447
+ paxId: p.id,
48448
+ room: roomIndex,
48449
+ order: paxIndex
48450
+ };
48451
+ });
48452
+ })) !== null && _b !== void 0
48453
+ ? _b
48454
+ : [];
48455
+ return {
48456
+ guid: (_c = option.guid) !== null && _c !== void 0 ? _c : crypto.randomUUID(),
48457
+ moment: '',
48458
+ parentGuid: index === 0 ? null : parentGuid,
48459
+ order: index,
48460
+ isChanged: true,
48461
+ from: selectedHotel.fromDate,
48462
+ to: selectedHotel.toDate,
48463
+ serviceType: ACCOMMODATION_SERVICE_TYPE,
48464
+ productName: selectedHotel.name,
48465
+ productCode: selectedHotel.code,
48466
+ accommodationName: option.accommodationName,
48467
+ accommodationCode: option.accommodationCode,
48468
+ regimeName: option.regimeName,
48469
+ regimeCode: option.regimeCode,
48470
+ country: selectedHotel.countryId ? { id: selectedHotel.countryId, name: selectedHotel.countryName, localizations: [] } : null,
48471
+ region: selectedHotel.regionId ? { id: selectedHotel.regionId, name: selectedHotel.regionName, localizations: [] } : null,
48472
+ oord: selectedHotel.oordId ? { id: selectedHotel.oordId, name: selectedHotel.oordName, localizations: [] } : null,
48473
+ location: selectedHotel.locationId ? { id: selectedHotel.locationId, name: selectedHotel.locationName, localizations: [] } : null,
48474
+ longitude: (_d = selectedHotel.longitude) !== null && _d !== void 0 ? _d : null,
48475
+ latitude: (_e = selectedHotel.latitude) !== null && _e !== void 0 ? _e : null,
48476
+ pax: pax,
48477
+ flightInformation: null
48478
+ };
48479
+ });
48480
+ };
48481
+ var toDateOnlyUtcString = function (value) {
48482
+ var date = new Date(value);
48483
+ return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())).toISOString();
48484
+ };
48485
+ var toTimeOnlyString = function (value) {
48486
+ var date = new Date(value);
48487
+ var hh = String(date.getUTCHours()).padStart(2, '0');
48488
+ var mm = String(date.getUTCMinutes()).padStart(2, '0');
48489
+ var ss = String(date.getUTCSeconds()).padStart(2, '0');
48490
+ return ''.concat(hh, ':').concat(mm, ':').concat(ss);
48491
+ };
48492
+ var mapFlightSegmentsToFlightLines = function (segments) {
48493
+ return segments.map(function (segment) {
48494
+ var _a;
48495
+ return {
48496
+ airlineCode: segment.marketingAirlineCode,
48497
+ airlineDescription: segment.marketingAirlineName,
48498
+ operatingAirlineCode: segment.operatingAirlineCode,
48499
+ operatingAirlineDescription: segment.operatingAirlineName,
48500
+ flightNumber: segment.flightNumber,
48501
+ operatingFlightNumber: (_a = segment.operatingFlightNumber) !== null && _a !== void 0 ? _a : null,
48502
+ departureDate: toDateOnlyUtcString(segment.departureDateTime),
48503
+ departureTime: toTimeOnlyString(segment.departureDateTime),
48504
+ departureAirportCode: segment.departureAirportCode,
48505
+ departureAirportDescription: segment.departureAirportName,
48506
+ arrivalDate: toDateOnlyUtcString(segment.arrivalDateTime),
48507
+ arrivalTime: toTimeOnlyString(segment.arrivalDateTime),
48508
+ arrivalAirportCode: segment.arrivalAirportCode,
48509
+ arrivalAirportDescription: segment.arrivalAirportName,
48510
+ durationInTicks: segment.durationInTicks
48511
+ };
48512
+ });
48513
+ };
48514
+ var buildFlightLabel = function (segments) {
48515
+ var firstSegment = lodash.first(segments);
48516
+ var lastSegment = lodash.last(segments);
48517
+ if (!firstSegment || !lastSegment) {
48518
+ return { productName: 'Flight', productCode: 'FLIGHT' };
48519
+ }
48520
+ return {
48521
+ productName: ''
48522
+ .concat(firstSegment.departureAirportName, ' - ')
48523
+ .concat(lastSegment.arrivalAirportName, ' (')
48524
+ .concat(firstSegment.marketingAirlineName, ')'),
48525
+ productCode: ''.concat(firstSegment.departureAirportCode, ' ').concat(lastSegment.arrivalAirportCode, '/').concat(firstSegment.marketingAirlineCode)
48526
+ };
48527
+ };
48528
+ var buildFlightLinesFromSelection = function (selectedFlight) {
48529
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
48530
+ if (!selectedFlight) return [];
48531
+ var outwardSegments = (_b = (_a = selectedFlight.outward) === null || _a === void 0 ? void 0 : _a.segments) !== null && _b !== void 0 ? _b : [];
48532
+ var returnSegments = (_d = (_c = selectedFlight.return) === null || _c === void 0 ? void 0 : _c.segments) !== null && _d !== void 0 ? _d : [];
48533
+ if (!outwardSegments.length || !returnSegments.length) return [];
48534
+ var outwardLabel = buildFlightLabel(outwardSegments);
48535
+ var returnLabel = buildFlightLabel(returnSegments);
48536
+ var outwardFirst = lodash.first(outwardSegments);
48537
+ var outwardLast = lodash.last(outwardSegments);
48538
+ var returnFirst = lodash.first(returnSegments);
48539
+ var returnLast = lodash.last(returnSegments);
48540
+ var outwardLine = {
48541
+ guid: selectedFlight.outwardGuid,
48542
+ parentGuid: null,
48543
+ order: 0,
48544
+ isChanged: true,
48545
+ from: (_e = outwardFirst === null || outwardFirst === void 0 ? void 0 : outwardFirst.departureDateTime.toString()) !== null && _e !== void 0 ? _e : '',
48546
+ to: (_f = outwardLast === null || outwardLast === void 0 ? void 0 : outwardLast.arrivalDateTime.toString()) !== null && _f !== void 0 ? _f : '',
48547
+ serviceType: FLIGHT_SERVICE_TYPE,
48548
+ productName: outwardLabel.productName,
48549
+ productCode: outwardLabel.productCode,
48550
+ accommodationName:
48551
+ (_g = outwardFirst === null || outwardFirst === void 0 ? void 0 : outwardFirst.metaData) === null || _g === void 0 ? void 0 : _g.farePriceClassName,
48552
+ accommodationCode:
48553
+ (_h = outwardFirst === null || outwardFirst === void 0 ? void 0 : outwardFirst.metaData) === null || _h === void 0 ? void 0 : _h.fareCode,
48554
+ regimeName: null,
48555
+ regimeCode: null,
48556
+ country: null,
48557
+ region: null,
48558
+ oord: null,
48559
+ location: null,
48560
+ longitude: null,
48561
+ latitude: null,
48562
+ // pax: allPaxAssignments,
48563
+ flightInformation: {
48564
+ pnr: '',
48565
+ flightLines: mapFlightSegmentsToFlightLines(outwardSegments)
48566
+ }
48567
+ };
48568
+ var returnLine = {
48569
+ guid: selectedFlight.returnGuid,
48570
+ parentGuid: selectedFlight.outwardGuid,
48571
+ order: 1,
48572
+ isChanged: true,
48573
+ from: (_j = returnFirst === null || returnFirst === void 0 ? void 0 : returnFirst.departureDateTime.toString()) !== null && _j !== void 0 ? _j : '',
48574
+ to: (_k = returnLast === null || returnLast === void 0 ? void 0 : returnLast.departureDateTime.toString()) !== null && _k !== void 0 ? _k : '',
48575
+ serviceType: FLIGHT_SERVICE_TYPE,
48576
+ productName: returnLabel.productName,
48577
+ productCode: returnLabel.productCode,
48578
+ accommodationName:
48579
+ (_l = returnFirst === null || returnFirst === void 0 ? void 0 : returnFirst.metaData) === null || _l === void 0 ? void 0 : _l.farePriceClassName,
48580
+ accommodationCode: (_m = returnFirst === null || returnFirst === void 0 ? void 0 : returnFirst.metaData) === null || _m === void 0 ? void 0 : _m.fareCode,
48581
+ regimeName: null,
48582
+ regimeCode: null,
48583
+ country: null,
48584
+ region: null,
48585
+ oord: null,
48586
+ location: null,
48587
+ longitude: null,
48588
+ latitude: null,
48589
+ // pax: allPaxAssignments,
48590
+ flightInformation: {
48591
+ pnr: '',
48592
+ flightLines: mapFlightSegmentsToFlightLines(returnSegments)
48593
+ }
48594
+ };
48595
+ return [outwardLine, returnLine];
48596
+ };
48597
+ var buildOrUpdatePackagingEntryPartial = function (_a) {
48598
+ var _b, _c;
48599
+ var sourceEntry = _a.sourceEntry,
48600
+ selectedHotelCode = _a.selectedHotelCode,
48601
+ accommodationResults = _a.accommodationResults,
48602
+ selectedFlight = _a.selectedFlight,
48603
+ seed = _a.seed,
48604
+ transactionId = _a.transactionId,
48605
+ language = _a.language;
48606
+ if (!((_b = seed === null || seed === void 0 ? void 0 : seed.rooms) === null || _b === void 0 ? void 0 : _b.length)) return null;
48607
+ var entry = buildBasePackagingEntry(sourceEntry, seed, transactionId, language);
48608
+ var nextLines = __spreadArray([], (_c = entry.lines) !== null && _c !== void 0 ? _c : [], true);
48609
+ var selectedHotel = selectedHotelCode
48610
+ ? accommodationResults.find(function (r) {
48611
+ return r.code === selectedHotelCode;
48612
+ })
48613
+ : null;
48614
+ console.log('Selected hotel for packaging entry', selectedHotel);
48615
+ // Update accommodation only when enough data exists
48616
+ if (selectedHotel) {
48617
+ var accommodationLines = buildAccommodationLinesFromSelection(selectedHotel, seed);
48618
+ if (accommodationLines.length) {
48619
+ nextLines = removeAccommodationLines(nextLines);
48620
+ nextLines = __spreadArray(__spreadArray([], nextLines, true), accommodationLines, true);
48621
+ }
48622
+ }
48623
+ // Update flights only when full selected combination exists
48624
+ if (selectedFlight) {
48625
+ var flightLines = buildFlightLinesFromSelection(selectedFlight);
48626
+ console.log('selectedFlight', selectedFlight);
48627
+ console.log('Built flight lines from selection', flightLines);
48628
+ if (flightLines.length) {
48629
+ nextLines = removeFlightLines(nextLines);
48630
+ nextLines = __spreadArray(__spreadArray([], nextLines, true), flightLines, true);
48631
+ }
48632
+ }
48633
+ nextLines = nextLines.map(function (line, index) {
48634
+ return __assign(__assign({}, line), { order: index });
48635
+ });
48636
+ return __assign(__assign({}, entry), { language: language, transactionId: transactionId, pax: entry.pax, lines: nextLines });
48637
+ };
48638
+ var buildBasePackagingEntry = function (sourceEntry, seed, transactionId, language) {
48639
+ var _a, _b;
48640
+ if (sourceEntry) {
48641
+ return structuredClone(sourceEntry);
48642
+ }
48643
+ var paxId = 1;
48644
+ var pax =
48645
+ (_b =
48646
+ (_a = seed.rooms) === null || _a === void 0
48647
+ ? void 0
48648
+ : _a.flatMap(function (room, roomIndex) {
48649
+ return room.pax.map(function (_, paxIndex) {
48650
+ return {
48651
+ id: paxId++,
48652
+ firstName: '',
48653
+ lastName: '',
48654
+ dateOfBirth: null,
48655
+ isMainBooker: roomIndex === 0 && paxIndex === 0
48656
+ };
48657
+ });
48658
+ })) !== null && _b !== void 0
48659
+ ? _b
48660
+ : [];
48661
+ return {
48662
+ language: language,
48663
+ transactionId: transactionId,
48664
+ dossierNumber: '',
48665
+ status: 0,
48666
+ bookingDate: null,
48667
+ price: 0,
48668
+ depositAmount: 0,
48669
+ pax: pax,
48670
+ lines: []
48671
+ };
48672
+ };
48197
48673
  return React__default['default'].createElement(
48198
48674
  'div',
48199
48675
  { id: 'tide-booking', className: 'search__bg' },
@@ -48311,13 +48787,11 @@ var SearchResultsContainer = function () {
48311
48787
  'span',
48312
48788
  { className: 'search__result-row-text' },
48313
48789
  !isLoading &&
48314
- !context.packagingEntry &&
48790
+ context.searchConfiguration.qsmType !== build.PortalQsmType.AccommodationAndFlight &&
48315
48791
  React__default['default'].createElement(
48316
48792
  React__default['default'].Fragment,
48317
48793
  null,
48318
- ((context.searchConfiguration.qsmType === build.PortalQsmType.AccommodationAndFlight &&
48319
- context.searchConfiguration.enableManualPackaging) ||
48320
- context.searchConfiguration.qsmType === build.PortalQsmType.Accommodation) &&
48794
+ context.searchConfiguration.qsmType === build.PortalQsmType.Accommodation &&
48321
48795
  (filteredPackagingAccoResults === null || filteredPackagingAccoResults === void 0 ? void 0 : filteredPackagingAccoResults.length) &&
48322
48796
  (filteredPackagingAccoResults === null || filteredPackagingAccoResults === void 0 ? void 0 : filteredPackagingAccoResults.length),
48323
48797
  context.searchConfiguration.qsmType !== build.PortalQsmType.Accommodation &&
@@ -48366,25 +48840,117 @@ var SearchResultsContainer = function () {
48366
48840
  context.searchConfiguration.qsmType === build.PortalQsmType.AccommodationAndFlight &&
48367
48841
  !context.packagingEntry &&
48368
48842
  context.showFlightResults &&
48369
- (bookingPackageDetails === null || bookingPackageDetails === void 0 ? void 0 : bookingPackageDetails.outwardFlights) &&
48370
- React__default['default'].createElement(FlightResults, {
48371
- flights: bookingPackageDetails === null || bookingPackageDetails === void 0 ? void 0 : bookingPackageDetails.outwardFlights,
48372
- isDeparture: true
48373
- }),
48843
+ // bookingPackageDetails?.outwardFlights &&
48844
+ // <FlightResults flights={bookingPackageDetails?.outwardFlights} isDeparture={true} />
48845
+ React__default['default'].createElement(
48846
+ React__default['default'].Fragment,
48847
+ null,
48848
+ React__default['default'].createElement(
48849
+ 'div',
48850
+ { className: 'search__results__label search__results__label--secondary' },
48851
+ React__default['default'].createElement(
48852
+ 'div',
48853
+ { className: 'search__results__label__date' },
48854
+ React__default['default'].createElement(Icon$1, { name: 'ui-flight', height: 16, fill: 'white' })
48855
+ ),
48856
+ React__default['default'].createElement(
48857
+ 'div',
48858
+ { className: 'search__results__label__text' },
48859
+ React__default['default'].createElement(
48860
+ 'h3',
48861
+ null,
48862
+ translations.SRP.SELECT,
48863
+ ' ',
48864
+ React__default['default'].createElement('strong', null, ' ', translations.SRP.DEPARTURE)
48865
+ )
48866
+ )
48867
+ ),
48868
+ React__default['default'].createElement(
48869
+ 'div',
48870
+ { className: 'search__results__cards search__results__cards--extended' },
48871
+ selectedOutwardKey && selectedOutward
48872
+ ? React__default['default'].createElement(IndependentFlightOption, {
48873
+ key: 'flight-'.concat(selectedOutwardKey),
48874
+ item: selectedOutward.outward,
48875
+ guid: selectedOutward.outwardGuid,
48876
+ onSelect: function () {
48877
+ return setSelectedOutwardKey(null);
48878
+ },
48879
+ selectedGuid: selectedOutward.outwardGuid,
48880
+ isOutward: true
48881
+ })
48882
+ : uniqueOutwardFlights.map(function (result) {
48883
+ return React__default['default'].createElement(IndependentFlightOption, {
48884
+ key: 'flight-'.concat(result.outwardGuid),
48885
+ item: result.outward,
48886
+ onSelect: function () {
48887
+ return setSelectedOutwardKey(getFlightKey(result.outward.segments));
48888
+ },
48889
+ guid: result.outwardGuid,
48890
+ isOutward: true
48891
+ });
48892
+ })
48893
+ )
48894
+ ),
48374
48895
  context.showHotelAccommodationResults &&
48375
48896
  !context.packagingEntry &&
48376
48897
  React__default['default'].createElement(HotelAccommodationResults, { isLoading: isLoading }),
48377
48898
  context.searchConfiguration.qsmType === build.PortalQsmType.AccommodationAndFlight &&
48378
48899
  !context.packagingEntry &&
48379
48900
  context.showFlightResults &&
48380
- (bookingPackageDetails === null || bookingPackageDetails === void 0 ? void 0 : bookingPackageDetails.returnFlights) &&
48381
- React__default['default'].createElement(FlightResults, {
48382
- flights: bookingPackageDetails === null || bookingPackageDetails === void 0 ? void 0 : bookingPackageDetails.returnFlights,
48383
- isDeparture: false
48384
- }),
48901
+ // bookingPackageDetails?.returnFlights &&
48902
+ // <FlightResults flights={bookingPackageDetails?.returnFlights} isDeparture={false} />
48903
+ React__default['default'].createElement(
48904
+ React__default['default'].Fragment,
48905
+ null,
48906
+ React__default['default'].createElement(
48907
+ 'div',
48908
+ { className: 'search__results__label search__results__label--secondary' },
48909
+ React__default['default'].createElement(
48910
+ 'div',
48911
+ { className: 'search__results__label__date' },
48912
+ React__default['default'].createElement(Icon$1, { name: 'ui-flight', height: 16, fill: 'white' })
48913
+ ),
48914
+ React__default['default'].createElement(
48915
+ 'div',
48916
+ { className: 'search__results__label__text' },
48917
+ React__default['default'].createElement(
48918
+ 'h3',
48919
+ null,
48920
+ translations.SRP.SELECT,
48921
+ ' ',
48922
+ React__default['default'].createElement('strong', null, ' ', translations.SRP.RETURN)
48923
+ )
48924
+ )
48925
+ ),
48926
+ React__default['default'].createElement(
48927
+ 'div',
48928
+ { className: 'search__results__cards search__results__cards--extended' },
48929
+ selectedReturnKey && selectedReturn
48930
+ ? React__default['default'].createElement(IndependentFlightOption, {
48931
+ key: 'flight-'.concat(selectedReturnKey),
48932
+ item: selectedReturn.return,
48933
+ guid: selectedReturn.outwardGuid,
48934
+ selectedGuid: selectedReturn.outwardGuid,
48935
+ isOutward: false
48936
+ })
48937
+ : uniqueReturnFlights.map(function (result) {
48938
+ return React__default['default'].createElement(IndependentFlightOption, {
48939
+ key: 'flight-'.concat(result.outwardGuid),
48940
+ item: result.return,
48941
+ onSelect: function () {
48942
+ return setSelectedReturnKey(getFlightKey(result.return.segments));
48943
+ },
48944
+ guid: result.outwardGuid,
48945
+ isOutward: false
48946
+ });
48947
+ })
48948
+ )
48949
+ ),
48385
48950
  context.searchConfiguration.qsmType === build.PortalQsmType.AccommodationAndFlight &&
48386
48951
  context.packagingEntry &&
48387
- React__default['default'].createElement('span', null, 'TODO: Show Full Itinerary here')
48952
+ itinerary &&
48953
+ React__default['default'].createElement(FullItinerary, { isLoading: itineraryIsLoading })
48388
48954
  )
48389
48955
  ),
48390
48956
  React__default['default'].createElement(FlyIn, {
@@ -55847,3 +56413,4 @@ exports.PhotoGallery = PhotoGallery;
55847
56413
  exports.QSM = QSM;
55848
56414
  exports.SearchResults = SearchResults;
55849
56415
  exports.Slider = Slider;
56416
+ exports.Spinner = Spinner;