@qite/tide-booking-component 1.4.125 → 1.4.127

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.
@@ -17658,14 +17658,14 @@ const updateBookingGroups = (groups, changedLines) => {
17658
17658
  };
17659
17659
 
17660
17660
  const fetchPriceDetails = toolkit.createAsyncThunk('priceDetails/fetchPriceDetails', async (_, { dispatch, getState, signal }) => {
17661
- dispatch(setFetchingPriceDetails(true));
17662
- dispatch(resetPriceDetails());
17663
17661
  const state = getState();
17664
17662
  const languageCode = selectLanguageCode(state);
17665
17663
  const request = selectBookingPackageBookRequest(state);
17666
17664
  if (!request) {
17667
17665
  throw Error('Product not available.');
17668
17666
  }
17667
+ dispatch(setFetchingPriceDetails(true));
17668
+ dispatch(resetPriceDetails());
17669
17669
  const priceDetails = await priceDetailsApi.fetchPriceDetails(state.apiSettings, request, signal, languageCode);
17670
17670
  dispatch(setFetchingPriceDetails(false));
17671
17671
  const packageDetails = selectPackageDetails(state);
@@ -17702,6 +17702,9 @@ const priceDetailsSlice = toolkit.createSlice({
17702
17702
  state.notifications = action.payload.notifications;
17703
17703
  }
17704
17704
  });
17705
+ builder.addCase(fetchPriceDetails.rejected, (state) => {
17706
+ state.isBusy = false;
17707
+ });
17705
17708
  }
17706
17709
  });
17707
17710
  const { setFetchingPriceDetails } = priceDetailsSlice.actions;
@@ -17710,7 +17713,6 @@ const selectNotifications = (state) => state.priceDetails.notifications;
17710
17713
  var priceDetailsReducer = priceDetailsSlice.reducer;
17711
17714
 
17712
17715
  const selectHasMounted = (state) => state.booking.hasMounted;
17713
- const selectIsFetching = (state) => state.booking.isFetching;
17714
17716
  const selectGeneratePaymentUrl = (state) => state.booking.generatePaymentUrl;
17715
17717
  const selectSkipPaymentWithAgent = (state) => state.booking.skipPaymentWithAgent;
17716
17718
  const selectIsFetchingProductOptions = (state) => state.booking.isBusy;
@@ -17786,6 +17788,7 @@ const selectCalculateDeposit = (state) => state.booking.calculateDeposit;
17786
17788
  const selectShowCommission = (state) => state.booking.showCommission;
17787
17789
  const selectIsRetry = (state) => state.booking.isRetry;
17788
17790
  const selectStartDate = (state) => state.booking.package?.options.find((x) => x.isSelected)?.fromDate;
17791
+ const selectEndDate = (state) => state.booking.package?.options.find((x) => x.isSelected)?.toDate;
17789
17792
  const selectAgents = (state) => state.booking.agents;
17790
17793
  const selectCountries = (state) => state.booking.countries;
17791
17794
  const selectProductCode = (state) => state.booking.productAttributes?.productCode;
@@ -18001,7 +18004,6 @@ const initialState$5 = {
18001
18004
  currentStep: OPTIONS_FORM_STEP,
18002
18005
  translations: undefined,
18003
18006
  travelersFirstStep: false,
18004
- isFetching: false,
18005
18007
  hasMounted: false,
18006
18008
  countries: undefined
18007
18009
  };
@@ -18220,9 +18222,6 @@ const bookingSlice = toolkit.createSlice({
18220
18222
  setHasMounted(state, action) {
18221
18223
  state.hasMounted = action.payload;
18222
18224
  },
18223
- setIsFetching(state, action) {
18224
- state.isFetching = action.payload;
18225
- },
18226
18225
  setOfficeId(state, action) {
18227
18226
  state.officeId = action.payload;
18228
18227
  },
@@ -18436,7 +18435,7 @@ const bookingSlice = toolkit.createSlice({
18436
18435
  });
18437
18436
  }
18438
18437
  });
18439
- const { setOfficeId, setLanguageCode, setTranslations, setBookingOptions, setBookingType, setProductAttributes, setBookingAttributes, setCalculateDeposit, setShowCommission, setBookingNumber: setBookingNumber$1, setIsRetry, setFetchingPackage, setIsFetching, setHasMounted, setPackage, setPackageRooms, setPackageOptionPax, setPackageOptionUnits, setPackageGroups, setSkipPayment, setGeneratePaymentUrl, setTagIds, setAgentAdressId, setBookingRemarks, setVoucherCodes, setCurrentStep: setCurrentStep$1, setPackageAirlineGroups, setPackageAirportGroups, setFlights, setAccommodationViewId, setIsOption, setTravelersFirstStep, setIsUnavailable } = bookingSlice.actions;
18438
+ const { setOfficeId, setLanguageCode, setTranslations, setBookingOptions, setBookingType, setProductAttributes, setBookingAttributes, setCalculateDeposit, setShowCommission, setBookingNumber: setBookingNumber$1, setIsRetry, setFetchingPackage, setHasMounted, setPackage, setPackageRooms, setPackageOptionPax, setPackageOptionUnits, setPackageGroups, setSkipPayment, setGeneratePaymentUrl, setTagIds, setAgentAdressId, setBookingRemarks, setVoucherCodes, setCurrentStep: setCurrentStep$1, setPackageAirlineGroups, setPackageAirportGroups, setFlights, setAccommodationViewId, setIsOption, setTravelersFirstStep, setIsUnavailable } = bookingSlice.actions;
18440
18439
  var bookingReducer = bookingSlice.reducer;
18441
18440
 
18442
18441
  const SettingsContext = React__default["default"].createContext({
@@ -18508,18 +18507,19 @@ const StepIndicators$1 = ({ currentStep, stepLabels }) => {
18508
18507
  React__default["default"].createElement("div", { className: "step-indicators__text" }, stepName)))))));
18509
18508
  };
18510
18509
 
18511
- const StepIndicators = ({ currentStep }) => {
18512
- const { flightOptions, roomOptions } = React.useContext(SettingsContext);
18513
- const translations = reactRedux.useSelector(selectTranslations);
18514
- const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
18510
+ // Single source of truth for the ordered step labels shown in the indicator and
18511
+ // the panel title. Kept in one place so step-route.tsx and step-indicator.tsx
18512
+ // can never drift out of sync. The ERROR step is intentionally excluded — it is
18513
+ // not part of the indicator sequence.
18514
+ const buildStepLabels = ({ travelersFirstStep, flightOptionsHidden, roomOptionsHidden, translations }) => {
18515
18515
  const stepLabels = [];
18516
18516
  if (travelersFirstStep) {
18517
18517
  stepLabels.push(translations.STEPS.PERSONAL_DETAILS);
18518
18518
  }
18519
- if (!flightOptions.isHidden) {
18519
+ if (!flightOptionsHidden) {
18520
18520
  stepLabels.push(translations.STEPS.FLIGHT_OPTIONS);
18521
18521
  }
18522
- if (!roomOptions.isHidden) {
18522
+ if (!roomOptionsHidden) {
18523
18523
  stepLabels.push(translations.STEPS.ROOM_OPTIONS);
18524
18524
  }
18525
18525
  stepLabels.push(translations.STEPS.EXTRA_OPTIONS);
@@ -18528,6 +18528,19 @@ const StepIndicators = ({ currentStep }) => {
18528
18528
  }
18529
18529
  stepLabels.push(translations.STEPS.SUMMARY);
18530
18530
  stepLabels.push(translations.STEPS.CONFIRMATION);
18531
+ return stepLabels;
18532
+ };
18533
+
18534
+ const StepIndicators = ({ currentStep }) => {
18535
+ const { flightOptions, roomOptions } = React.useContext(SettingsContext);
18536
+ const translations = reactRedux.useSelector(selectTranslations);
18537
+ const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
18538
+ const stepLabels = buildStepLabels({
18539
+ travelersFirstStep,
18540
+ flightOptionsHidden: flightOptions.isHidden,
18541
+ roomOptionsHidden: roomOptions.isHidden,
18542
+ translations
18543
+ });
18531
18544
  return React__default["default"].createElement(StepIndicators$1, { currentStep: currentStep, stepLabels: stepLabels });
18532
18545
  };
18533
18546
 
@@ -18544,22 +18557,12 @@ const StepRoute = ({ number, title, component }) => {
18544
18557
  const { flightOptions, roomOptions } = React.useContext(SettingsContext);
18545
18558
  const translations = reactRedux.useSelector(selectTranslations);
18546
18559
  const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
18547
- const stepLabels = [];
18548
- if (travelersFirstStep) {
18549
- stepLabels.push(translations.STEPS.PERSONAL_DETAILS);
18550
- }
18551
- if (!flightOptions.isHidden) {
18552
- stepLabels.push(translations.STEPS.FLIGHT_OPTIONS);
18553
- }
18554
- if (!roomOptions.isHidden) {
18555
- stepLabels.push(translations.STEPS.ROOM_OPTIONS);
18556
- }
18557
- stepLabels.push(translations.STEPS.EXTRA_OPTIONS);
18558
- if (!travelersFirstStep) {
18559
- stepLabels.push(translations.STEPS.PERSONAL_DETAILS);
18560
- }
18561
- stepLabels.push(translations.STEPS.SUMMARY);
18562
- stepLabels.push(translations.STEPS.CONFIRMATION);
18560
+ const stepLabels = buildStepLabels({
18561
+ travelersFirstStep,
18562
+ flightOptionsHidden: flightOptions.isHidden,
18563
+ roomOptionsHidden: roomOptions.isHidden,
18564
+ translations
18565
+ });
18563
18566
  return (React__default["default"].createElement(BookingPanel, { currentStep: number, stepLabels: stepLabels, StepIndicatorsComponent: StepIndicators, renderTitle: (step) => (React__default["default"].createElement(React__default["default"].Fragment, null,
18564
18567
  step + 1,
18565
18568
  ". ",
@@ -21659,6 +21662,7 @@ const Summary = () => {
21659
21662
  const [remarks, setRemarks] = React.useState('');
21660
21663
  const [voucher, setVoucher] = React.useState({});
21661
21664
  const bookingQueryString = reactRedux.useSelector(selectBookingQueryString);
21665
+ const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
21662
21666
  const travelerFormValues = reactRedux.useSelector(selectTravelersFormValues);
21663
21667
  const packageDetails = reactRedux.useSelector(selectPackageDetails);
21664
21668
  const activeOption = reactRedux.useSelector(selectActiveOption);
@@ -21808,7 +21812,7 @@ const Summary = () => {
21808
21812
  dispatch(fetchPriceDetails());
21809
21813
  };
21810
21814
  const goPrevious = () => {
21811
- dispatch(setCurrentStep$1(TRAVELERS_FORM_STEP));
21815
+ dispatch(setCurrentStep$1(travelersFirstStep ? OPTIONS_FORM_STEP : TRAVELERS_FORM_STEP));
21812
21816
  };
21813
21817
  const translations = reactRedux.useSelector(selectTranslations);
21814
21818
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
@@ -21968,7 +21972,7 @@ const Summary = () => {
21968
21972
  __html: checkbox.text
21969
21973
  } }))))))))))),
21970
21974
  React__default["default"].createElement("div", { className: "booking__navigator" },
21971
- settings.skipRouter ? (React__default["default"].createElement("button", { type: "button", title: translations.STEPS.PREVIOUS, onClick: () => goPrevious(), className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : (React__default["default"].createElement(Link, { to: `${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.travellers.pathSuffix}?${bookingQueryString}`, title: translations.STEPS.PREVIOUS, className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)),
21975
+ settings.skipRouter ? (React__default["default"].createElement("button", { type: "button", title: translations.STEPS.PREVIOUS, onClick: () => goPrevious(), className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : (React__default["default"].createElement(Link, { to: `${!settings.skipBasePathInRouting ? settings.basePath : ''}${travelersFirstStep ? settings.options.pathSuffix : settings.travellers.pathSuffix}?${bookingQueryString}`, title: translations.STEPS.PREVIOUS, className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)),
21972
21976
  settings.allowOption && (React__default["default"].createElement("button", { title: translations.STEPS.SUBMIT_OPTION, className: buildClassName(['cta', !userValidated && 'cta--disabled']), disabled: !userValidated, name: "option" }, translations.STEPS.SUBMIT_OPTION)),
21973
21977
  React__default["default"].createElement("button", { title: settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING, className: buildClassName(['cta', !userValidated && 'cta--disabled']), disabled: !userValidated, name: "default" }, settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING))))));
21974
21978
  };
@@ -22023,8 +22027,9 @@ const validateForm$1 = (values, agentRequired, bookingType, translations, formFi
22023
22027
  if (lodash.isEmpty(adult.birthDate)) {
22024
22028
  lodash.set(errors, `rooms[${rIndex}].adults[${index}].birthDate`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.BIRTHDATE));
22025
22029
  }
22026
- else if (values.startDate) {
22027
- const age = getAge(adult.birthDate, values.startDate);
22030
+ else if (values.endDate) {
22031
+ // If you are younger than the maxChildAge at the end of the trip, you are considered a child, so we check the endDate here instead of the startDate
22032
+ const age = getAge(adult.birthDate, values.endDate);
22028
22033
  if (age <= maxChildAge) {
22029
22034
  lodash.set(errors, `rooms[${rIndex}].adults[${index}].birthDate`, formatTravelerIsNoAdult(rIndex + 1, index + 1));
22030
22035
  }
@@ -22045,8 +22050,9 @@ const validateForm$1 = (values, agentRequired, bookingType, translations, formFi
22045
22050
  if (lodash.isEmpty(child.birthDate)) {
22046
22051
  lodash.set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.BIRTHDATE));
22047
22052
  }
22048
- else if (values.startDate) {
22049
- const age = getAge(child.birthDate, values.startDate);
22053
+ else if (values.endDate) {
22054
+ // You need to be under the maxChildAge until the end of the trip, so we check the endDate here instead of the startDate
22055
+ const age = getAge(child.birthDate, values.endDate);
22050
22056
  if (age > maxChildAge) {
22051
22057
  lodash.set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerIsNoChild(rIndex + 1, r.adults.length + index + 1));
22052
22058
  }
@@ -22270,10 +22276,11 @@ function createTraveler(traveler, followNumber, personTranslation, isCompact) {
22270
22276
  gender: ''
22271
22277
  };
22272
22278
  }
22273
- function createInitialValuesFromRooms(formRooms, startDate, agentAdressId, personTranslation, isCompact) {
22279
+ function createInitialValuesFromRooms(formRooms, startDate, endDate, agentAdressId, personTranslation, isCompact) {
22274
22280
  const followNumber = { number: 1 };
22275
22281
  const initialValues = {
22276
22282
  startDate,
22283
+ endDate,
22277
22284
  rooms: formRooms.map((room) => ({
22278
22285
  adults: room.adults.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact)),
22279
22286
  children: room.children.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact))
@@ -22323,7 +22330,7 @@ function createInitialValuesFromEditablePackagingEntry(editablePackagingEntry, a
22323
22330
  })
22324
22331
  };
22325
22332
  });
22326
- const values = createInitialValuesFromRooms(rooms.map((room) => ({ adults: room.adults, children: room.children })), editablePackagingEntry?.lines?.[0]?.from, agentAdressId);
22333
+ const values = createInitialValuesFromRooms(rooms.map((room) => ({ adults: room.adults, children: room.children })), lodash.first(editablePackagingEntry?.lines)?.from, lodash.last(editablePackagingEntry?.lines)?.to, agentAdressId);
22327
22334
  values.rooms = rooms;
22328
22335
  values.mainBookerId = pax.find((x) => x.isMainBooker)?.id ?? rooms[0]?.adults?.[0]?.id ?? -1;
22329
22336
  const address = editablePackagingEntry?.address;
@@ -22601,6 +22608,7 @@ const TravelersForm = () => {
22601
22608
  const navigate = settings.skipRouter ? () => { } : reactRouter.useNavigate();
22602
22609
  const bookingQueryString = reactRedux.useSelector(selectBookingQueryString);
22603
22610
  const startDate = reactRedux.useSelector(selectStartDate);
22611
+ const endDate = reactRedux.useSelector(selectEndDate);
22604
22612
  const selectFormRooms = React.useMemo(() => makeSelectFormRooms(settings.maxChildAge), [settings.maxChildAge]);
22605
22613
  const formRooms = reactRedux.useSelector(selectFormRooms);
22606
22614
  const bookingType = reactRedux.useSelector(selectBookingType);
@@ -22610,13 +22618,14 @@ const TravelersForm = () => {
22610
22618
  const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
22611
22619
  const isUnavailable = reactRedux.useSelector(selectIsUnavailable);
22612
22620
  const bookingAttributes = reactRedux.useSelector(selectBookingAttributes);
22613
- const isFetching = reactRedux.useSelector(selectIsFetching);
22614
22621
  const hasMounted = reactRedux.useSelector(selectHasMounted);
22615
22622
  const countries = reactRedux.useSelector(selectCountries);
22623
+ const inFlight = React.useRef(false);
22624
+ const pendingRefetch = React.useRef(false);
22616
22625
  const useCompactForm = !!settings.travellers.compactForm && !!settings.agentAdressId;
22617
22626
  const showAllCountries = !!settings.travellers.showAllCountries;
22618
22627
  const initialValues = reactRedux.useSelector(selectTravelersFormValues) ??
22619
- createInitialValuesFromRooms(formRooms, startDate, agentAdressId, translations.TRAVELERS_FORM.PERSON, useCompactForm);
22628
+ createInitialValuesFromRooms(formRooms, startDate, endDate, agentAdressId, translations.TRAVELERS_FORM.PERSON, useCompactForm);
22620
22629
  const [showAgentSelection, setShowAgentSelection] = React.useState(!settings.agentAdressId && !settings.hideAgentSelection);
22621
22630
  const formik$1 = formik.useFormik({
22622
22631
  initialValues,
@@ -22644,40 +22653,46 @@ const TravelersForm = () => {
22644
22653
  dispatch(fetchPriceDetails());
22645
22654
  }, [dispatch]);
22646
22655
  React.useEffect(() => {
22647
- if (!bookingAttributes?.rooms?.length || isFetching)
22656
+ if (!bookingAttributes?.rooms?.length)
22648
22657
  return;
22649
22658
  if (!hasMounted) {
22650
22659
  dispatch(setHasMounted(true));
22651
22660
  return;
22652
22661
  }
22662
+ if (inFlight.current) {
22663
+ pendingRefetch.current = true;
22664
+ return;
22665
+ }
22653
22666
  const fetchAll = async () => {
22654
- dispatch(setIsFetching(true));
22667
+ inFlight.current = true;
22655
22668
  try {
22656
- await dispatch(fetchPackage());
22657
- await dispatch(fetchPriceDetails());
22669
+ do {
22670
+ pendingRefetch.current = false;
22671
+ await dispatch(fetchPackage());
22672
+ await dispatch(fetchPriceDetails());
22673
+ } while (pendingRefetch.current);
22658
22674
  }
22659
22675
  finally {
22660
- dispatch(setIsFetching(false));
22676
+ inFlight.current = false;
22661
22677
  }
22662
22678
  };
22663
22679
  fetchAll();
22664
- }, [bookingAttributes?.rooms, dispatch, hasMounted, isFetching]);
22680
+ }, [bookingAttributes?.rooms, dispatch, hasMounted]);
22681
+ const roomsQuery = React.useMemo(() => formik$1.values.rooms
22682
+ .map((room) => {
22683
+ const adults = room.adults ? room.adults.length : 0;
22684
+ const childAges = room.children?.length ? room.children.map((child) => child.age).join(',') : '';
22685
+ return `(adults:${adults},childAges:(${childAges}))`;
22686
+ })
22687
+ .join(','), [formik$1.values.rooms]);
22665
22688
  React.useEffect(() => {
22666
- if (settings.skipRouter || !travelersFirstStep)
22689
+ if (settings.skipRouter || !travelersFirstStep || !bookingQueryString)
22667
22690
  return;
22668
22691
  const params = new URLSearchParams(bookingQueryString);
22669
22692
  params.delete('rooms');
22670
- const roomsString = formik$1.values.rooms
22671
- .map((room) => {
22672
- const adults = room.adults ? room.adults.length : 0;
22673
- const childAges = room.children?.length ? room.children.map((child) => child.age).join(',') : '';
22674
- return `adults:${adults},childAges:(${childAges})`;
22675
- })
22676
- .map((room) => `(${room})`)
22677
- .join(',');
22678
- const nextQuery = `${params.toString()}${params.toString() ? '&' : ''}rooms=(${roomsString})`;
22693
+ const nextQuery = `${params.toString()}${params.toString() ? '&' : ''}rooms=(${roomsQuery})`;
22679
22694
  navigate(`${window.location.pathname}?${nextQuery}`, { replace: true });
22680
- }, [formik$1.values.rooms, bookingQueryString, navigate, settings.skipRouter, travelersFirstStep]);
22695
+ }, [roomsQuery, bookingQueryString, navigate, settings.skipRouter, travelersFirstStep]);
22681
22696
  React.useEffect(() => {
22682
22697
  if (!agents || !settings.affiliateSlug)
22683
22698
  return;
@@ -22892,10 +22907,17 @@ const Booking = ({ productCode, productName, thumbnailUrl }) => {
22892
22907
  promise.abort();
22893
22908
  };
22894
22909
  }, [productAttributes]);
22895
- let numberIndex = 1;
22896
- // No-op when `customTranslationsUrl` isn't configured (translationsReady
22897
- // starts `true` in that case). Only suppresses the initial render when a
22898
- // host actively opts into the custom-translations fetch.
22910
+ let numberIndex = 0;
22911
+ const getFirstStep = () => {
22912
+ if (travelersFirstStep)
22913
+ return { path: travellers.pathSuffix, title: translations.STEPS.PERSONAL_DETAILS, component: React__default["default"].createElement(TravelersForm, null) };
22914
+ if (!flightOptions.isHidden && flightOptions.pathSuffix)
22915
+ return { path: flightOptions.pathSuffix, title: translations.STEPS.FLIGHT_OPTIONS, component: React__default["default"].createElement(FlightOptionsForm, null) };
22916
+ if (!roomOptions.isHidden && roomOptions.pathSuffix)
22917
+ return { path: roomOptions.pathSuffix, title: translations.STEPS.ROOM_OPTIONS, component: React__default["default"].createElement(RoomOptionsForm, null) };
22918
+ return { path: options.pathSuffix, title: translations.STEPS.EXTRA_OPTIONS, component: React__default["default"].createElement(OptionsForm, null) };
22919
+ };
22920
+ const firstStep = getFirstStep();
22899
22921
  if (!translationsReady) {
22900
22922
  return null;
22901
22923
  }
@@ -22904,8 +22926,9 @@ const Booking = ({ productCode, productName, thumbnailUrl }) => {
22904
22926
  React__default["default"].createElement("div", { className: "booking__content" },
22905
22927
  React__default["default"].createElement("div", { className: "booking__panel" },
22906
22928
  React__default["default"].createElement(reactRouter.Routes, null,
22907
- travelersFirstStep && (React__default["default"].createElement(reactRouter.Route, { path: "/", element: React__default["default"].createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.PERSONAL_DETAILS, component: React__default["default"].createElement(TravelersForm, null) }) })),
22908
- !flightOptions.isHidden && flightOptions.pathSuffix && (React__default["default"].createElement(reactRouter.Route, { path: '/', element: React__default["default"].createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.FLIGHT_OPTIONS, component: React__default["default"].createElement(FlightOptionsForm, null) }) })),
22929
+ firstStep.path !== '/' && React__default["default"].createElement(reactRouter.Route, { path: "/", element: React__default["default"].createElement(StepRoute, { number: 0, title: firstStep.title, component: firstStep.component }) }),
22930
+ travelersFirstStep && (React__default["default"].createElement(reactRouter.Route, { path: travellers.pathSuffix, element: React__default["default"].createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.PERSONAL_DETAILS, component: React__default["default"].createElement(TravelersForm, null) }) })),
22931
+ !flightOptions.isHidden && flightOptions.pathSuffix && (React__default["default"].createElement(reactRouter.Route, { path: flightOptions.pathSuffix, element: React__default["default"].createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.FLIGHT_OPTIONS, component: React__default["default"].createElement(FlightOptionsForm, null) }) })),
22909
22932
  !roomOptions.isHidden && roomOptions.pathSuffix && (React__default["default"].createElement(reactRouter.Route, { path: roomOptions.pathSuffix, element: React__default["default"].createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.ROOM_OPTIONS, component: React__default["default"].createElement(RoomOptionsForm, null) }) })),
22910
22933
  React__default["default"].createElement(reactRouter.Route, { path: options.pathSuffix, element: React__default["default"].createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.EXTRA_OPTIONS, component: React__default["default"].createElement(OptionsForm, null) }) }),
22911
22934
  !travelersFirstStep && (React__default["default"].createElement(reactRouter.Route, { path: travellers.pathSuffix, element: React__default["default"].createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.PERSONAL_DETAILS, component: React__default["default"].createElement(TravelersForm, null) }) })),
@@ -0,0 +1,8 @@
1
+ interface BuildStepLabelsParams {
2
+ travelersFirstStep: boolean;
3
+ flightOptionsHidden?: boolean | null;
4
+ roomOptionsHidden?: boolean | null;
5
+ translations: Record<string, any>;
6
+ }
7
+ export declare const buildStepLabels: ({ travelersFirstStep, flightOptionsHidden, roomOptionsHidden, translations }: BuildStepLabelsParams) => string[];
8
+ export {};
@@ -33,7 +33,6 @@ export interface BookingState {
33
33
  };
34
34
  isOption?: boolean;
35
35
  travelersFirstStep: boolean;
36
- isFetching?: boolean;
37
36
  hasMounted: boolean;
38
37
  countries?: CountryItem[];
39
38
  }
@@ -57,6 +56,6 @@ export declare const fetchCountries: import("@reduxjs/toolkit").AsyncThunk<impor
57
56
  fulfilledMeta?: unknown;
58
57
  rejectedMeta?: unknown;
59
58
  }>;
60
- export declare const setOfficeId: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "booking/setOfficeId">, setLanguageCode: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setLanguageCode">, setTranslations: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "booking/setTranslations">, setBookingOptions: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptions, "booking/setBookingOptions">, setBookingType: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingType">, setProductAttributes: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<ProductAttributes | undefined, "booking/setProductAttributes">, setBookingAttributes: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<BookingAttributes | undefined, "booking/setBookingAttributes">, setCalculateDeposit: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setCalculateDeposit">, setShowCommission: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<boolean | undefined, "booking/setShowCommission">, setBookingNumber: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingNumber">, setIsRetry: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsRetry">, setFetchingPackage: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setFetchingPackage">, setIsFetching: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsFetching">, setHasMounted: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setHasMounted">, setPackage: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<BookingPackage | undefined, "booking/setPackage">, setPackageRooms: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingPackageRoom[], "booking/setPackageRooms">, setPackageOptionPax: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionPax[], "booking/setPackageOptionPax">, setPackageOptionUnits: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionUnit[], "booking/setPackageOptionUnits">, setPackageGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionGroup<PerBookingPackageOption>[], "booking/setPackageGroups">, setSkipPayment: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setSkipPayment">, setGeneratePaymentUrl: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setGeneratePaymentUrl">, setTagIds: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<number[] | undefined, "booking/setTagIds">, setAgentAdressId: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<number | undefined, "booking/setAgentAdressId">, setBookingRemarks: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingRemarks">, setVoucherCodes: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "booking/setVoucherCodes">, setCurrentStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingStep, "booking/setCurrentStep">, setPackageAirlineGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingAirlineGroup<AirlineBookingPackageOption>[], "booking/setPackageAirlineGroups">, setPackageAirportGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingAirportGroup<AirportBookingPackageOption>[], "booking/setPackageAirportGroups">, setFlights: import("@reduxjs/toolkit").ActionCreatorWithPayload<GroupedFlights, "booking/setFlights">, setAccommodationViewId: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "booking/setAccommodationViewId">, setIsOption: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsOption">, setTravelersFirstStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setTravelersFirstStep">, setIsUnavailable: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsUnavailable">;
59
+ export declare const setOfficeId: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "booking/setOfficeId">, setLanguageCode: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setLanguageCode">, setTranslations: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "booking/setTranslations">, setBookingOptions: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptions, "booking/setBookingOptions">, setBookingType: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingType">, setProductAttributes: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<ProductAttributes | undefined, "booking/setProductAttributes">, setBookingAttributes: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<BookingAttributes | undefined, "booking/setBookingAttributes">, setCalculateDeposit: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setCalculateDeposit">, setShowCommission: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<boolean | undefined, "booking/setShowCommission">, setBookingNumber: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingNumber">, setIsRetry: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsRetry">, setFetchingPackage: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setFetchingPackage">, setHasMounted: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setHasMounted">, setPackage: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<BookingPackage | undefined, "booking/setPackage">, setPackageRooms: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingPackageRoom[], "booking/setPackageRooms">, setPackageOptionPax: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionPax[], "booking/setPackageOptionPax">, setPackageOptionUnits: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionUnit[], "booking/setPackageOptionUnits">, setPackageGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionGroup<PerBookingPackageOption>[], "booking/setPackageGroups">, setSkipPayment: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setSkipPayment">, setGeneratePaymentUrl: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setGeneratePaymentUrl">, setTagIds: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<number[] | undefined, "booking/setTagIds">, setAgentAdressId: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<number | undefined, "booking/setAgentAdressId">, setBookingRemarks: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingRemarks">, setVoucherCodes: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "booking/setVoucherCodes">, setCurrentStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingStep, "booking/setCurrentStep">, setPackageAirlineGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingAirlineGroup<AirlineBookingPackageOption>[], "booking/setPackageAirlineGroups">, setPackageAirportGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingAirportGroup<AirportBookingPackageOption>[], "booking/setPackageAirportGroups">, setFlights: import("@reduxjs/toolkit").ActionCreatorWithPayload<GroupedFlights, "booking/setFlights">, setAccommodationViewId: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "booking/setAccommodationViewId">, setIsOption: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsOption">, setTravelersFirstStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setTravelersFirstStep">, setIsUnavailable: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsUnavailable">;
61
60
  declare const _default: import("@reduxjs/toolkit").Reducer<BookingState>;
62
61
  export default _default;
@@ -2,7 +2,6 @@ import { BookingPackageAddress, BookingPackageBookRequest, BookingPackagePax, Bo
2
2
  import { RootState } from '../../store';
3
3
  import { Room } from '../../types';
4
4
  export declare const selectHasMounted: (state: RootState) => boolean;
5
- export declare const selectIsFetching: (state: RootState) => boolean | undefined;
6
5
  export declare const selectCurrentStep: (state: RootState) => import("./constants").BookingStep;
7
6
  export declare const selectGeneratePaymentUrl: (state: RootState) => boolean;
8
7
  export declare const selectSkipPaymentWithAgent: (state: RootState) => boolean;
@@ -257,6 +256,7 @@ export declare const selectCalculateDeposit: (state: RootState) => boolean;
257
256
  export declare const selectShowCommission: (state: RootState) => boolean | undefined;
258
257
  export declare const selectIsRetry: (state: RootState) => boolean;
259
258
  export declare const selectStartDate: (state: RootState) => string | undefined;
259
+ export declare const selectEndDate: (state: RootState) => string | undefined;
260
260
  export declare const selectAgents: (state: RootState) => import("@qite/tide-client").BookingTravelAgent[] | undefined;
261
261
  export declare const selectCountries: (state: RootState) => import("@qite/tide-client").CountryItem[] | undefined;
262
262
  export declare const selectProductCode: (state: RootState) => string | undefined;
@@ -163,6 +163,7 @@ export interface FlightInfo {
163
163
  export interface TravelersFormValues {
164
164
  rooms: TravelersFormRoomValues[];
165
165
  startDate?: string;
166
+ endDate?: string;
166
167
  mainBookerId: number;
167
168
  street: string;
168
169
  houseNumber: string;
@@ -44,7 +44,7 @@ export declare function createTraveler(traveler: RoomTraveler, followNumber: {
44
44
  export declare function createInitialValuesFromRooms(formRooms: {
45
45
  adults: RoomTraveler[];
46
46
  children: RoomTraveler[];
47
- }[], startDate?: string, agentAdressId?: number, personTranslation?: string, isCompact?: boolean): TravelersFormValues;
47
+ }[], startDate?: string, endDate?: string, agentAdressId?: number, personTranslation?: string, isCompact?: boolean): TravelersFormValues;
48
48
  export declare function createInitialValuesFromEditablePackagingEntry(editablePackagingEntry: PackagingEntry, agentAdressId?: number): TravelersFormValues;
49
49
  export declare function applyTravelersFormValuesToEditablePackagingEntry(editablePackagingEntry: PackagingEntry, values: TravelersFormValues): {
50
50
  pax: PackagingEntryPax[];
@@ -17629,14 +17629,14 @@ const updateBookingGroups = (groups, changedLines) => {
17629
17629
  };
17630
17630
 
17631
17631
  const fetchPriceDetails = createAsyncThunk('priceDetails/fetchPriceDetails', async (_, { dispatch, getState, signal }) => {
17632
- dispatch(setFetchingPriceDetails(true));
17633
- dispatch(resetPriceDetails());
17634
17632
  const state = getState();
17635
17633
  const languageCode = selectLanguageCode(state);
17636
17634
  const request = selectBookingPackageBookRequest(state);
17637
17635
  if (!request) {
17638
17636
  throw Error('Product not available.');
17639
17637
  }
17638
+ dispatch(setFetchingPriceDetails(true));
17639
+ dispatch(resetPriceDetails());
17640
17640
  const priceDetails = await priceDetailsApi.fetchPriceDetails(state.apiSettings, request, signal, languageCode);
17641
17641
  dispatch(setFetchingPriceDetails(false));
17642
17642
  const packageDetails = selectPackageDetails(state);
@@ -17673,6 +17673,9 @@ const priceDetailsSlice = createSlice({
17673
17673
  state.notifications = action.payload.notifications;
17674
17674
  }
17675
17675
  });
17676
+ builder.addCase(fetchPriceDetails.rejected, (state) => {
17677
+ state.isBusy = false;
17678
+ });
17676
17679
  }
17677
17680
  });
17678
17681
  const { setFetchingPriceDetails } = priceDetailsSlice.actions;
@@ -17681,7 +17684,6 @@ const selectNotifications = (state) => state.priceDetails.notifications;
17681
17684
  var priceDetailsReducer = priceDetailsSlice.reducer;
17682
17685
 
17683
17686
  const selectHasMounted = (state) => state.booking.hasMounted;
17684
- const selectIsFetching = (state) => state.booking.isFetching;
17685
17687
  const selectGeneratePaymentUrl = (state) => state.booking.generatePaymentUrl;
17686
17688
  const selectSkipPaymentWithAgent = (state) => state.booking.skipPaymentWithAgent;
17687
17689
  const selectIsFetchingProductOptions = (state) => state.booking.isBusy;
@@ -17757,6 +17759,7 @@ const selectCalculateDeposit = (state) => state.booking.calculateDeposit;
17757
17759
  const selectShowCommission = (state) => state.booking.showCommission;
17758
17760
  const selectIsRetry = (state) => state.booking.isRetry;
17759
17761
  const selectStartDate = (state) => state.booking.package?.options.find((x) => x.isSelected)?.fromDate;
17762
+ const selectEndDate = (state) => state.booking.package?.options.find((x) => x.isSelected)?.toDate;
17760
17763
  const selectAgents = (state) => state.booking.agents;
17761
17764
  const selectCountries = (state) => state.booking.countries;
17762
17765
  const selectProductCode = (state) => state.booking.productAttributes?.productCode;
@@ -17972,7 +17975,6 @@ const initialState$5 = {
17972
17975
  currentStep: OPTIONS_FORM_STEP,
17973
17976
  translations: undefined,
17974
17977
  travelersFirstStep: false,
17975
- isFetching: false,
17976
17978
  hasMounted: false,
17977
17979
  countries: undefined
17978
17980
  };
@@ -18191,9 +18193,6 @@ const bookingSlice = createSlice({
18191
18193
  setHasMounted(state, action) {
18192
18194
  state.hasMounted = action.payload;
18193
18195
  },
18194
- setIsFetching(state, action) {
18195
- state.isFetching = action.payload;
18196
- },
18197
18196
  setOfficeId(state, action) {
18198
18197
  state.officeId = action.payload;
18199
18198
  },
@@ -18407,7 +18406,7 @@ const bookingSlice = createSlice({
18407
18406
  });
18408
18407
  }
18409
18408
  });
18410
- const { setOfficeId, setLanguageCode, setTranslations, setBookingOptions, setBookingType, setProductAttributes, setBookingAttributes, setCalculateDeposit, setShowCommission, setBookingNumber: setBookingNumber$1, setIsRetry, setFetchingPackage, setIsFetching, setHasMounted, setPackage, setPackageRooms, setPackageOptionPax, setPackageOptionUnits, setPackageGroups, setSkipPayment, setGeneratePaymentUrl, setTagIds, setAgentAdressId, setBookingRemarks, setVoucherCodes, setCurrentStep: setCurrentStep$1, setPackageAirlineGroups, setPackageAirportGroups, setFlights, setAccommodationViewId, setIsOption, setTravelersFirstStep, setIsUnavailable } = bookingSlice.actions;
18409
+ const { setOfficeId, setLanguageCode, setTranslations, setBookingOptions, setBookingType, setProductAttributes, setBookingAttributes, setCalculateDeposit, setShowCommission, setBookingNumber: setBookingNumber$1, setIsRetry, setFetchingPackage, setHasMounted, setPackage, setPackageRooms, setPackageOptionPax, setPackageOptionUnits, setPackageGroups, setSkipPayment, setGeneratePaymentUrl, setTagIds, setAgentAdressId, setBookingRemarks, setVoucherCodes, setCurrentStep: setCurrentStep$1, setPackageAirlineGroups, setPackageAirportGroups, setFlights, setAccommodationViewId, setIsOption, setTravelersFirstStep, setIsUnavailable } = bookingSlice.actions;
18411
18410
  var bookingReducer = bookingSlice.reducer;
18412
18411
 
18413
18412
  const SettingsContext = React__default.createContext({
@@ -18479,18 +18478,19 @@ const StepIndicators$1 = ({ currentStep, stepLabels }) => {
18479
18478
  React__default.createElement("div", { className: "step-indicators__text" }, stepName)))))));
18480
18479
  };
18481
18480
 
18482
- const StepIndicators = ({ currentStep }) => {
18483
- const { flightOptions, roomOptions } = useContext(SettingsContext);
18484
- const translations = useSelector(selectTranslations);
18485
- const travelersFirstStep = useSelector(selectTravelersFirstStep);
18481
+ // Single source of truth for the ordered step labels shown in the indicator and
18482
+ // the panel title. Kept in one place so step-route.tsx and step-indicator.tsx
18483
+ // can never drift out of sync. The ERROR step is intentionally excluded — it is
18484
+ // not part of the indicator sequence.
18485
+ const buildStepLabels = ({ travelersFirstStep, flightOptionsHidden, roomOptionsHidden, translations }) => {
18486
18486
  const stepLabels = [];
18487
18487
  if (travelersFirstStep) {
18488
18488
  stepLabels.push(translations.STEPS.PERSONAL_DETAILS);
18489
18489
  }
18490
- if (!flightOptions.isHidden) {
18490
+ if (!flightOptionsHidden) {
18491
18491
  stepLabels.push(translations.STEPS.FLIGHT_OPTIONS);
18492
18492
  }
18493
- if (!roomOptions.isHidden) {
18493
+ if (!roomOptionsHidden) {
18494
18494
  stepLabels.push(translations.STEPS.ROOM_OPTIONS);
18495
18495
  }
18496
18496
  stepLabels.push(translations.STEPS.EXTRA_OPTIONS);
@@ -18499,6 +18499,19 @@ const StepIndicators = ({ currentStep }) => {
18499
18499
  }
18500
18500
  stepLabels.push(translations.STEPS.SUMMARY);
18501
18501
  stepLabels.push(translations.STEPS.CONFIRMATION);
18502
+ return stepLabels;
18503
+ };
18504
+
18505
+ const StepIndicators = ({ currentStep }) => {
18506
+ const { flightOptions, roomOptions } = useContext(SettingsContext);
18507
+ const translations = useSelector(selectTranslations);
18508
+ const travelersFirstStep = useSelector(selectTravelersFirstStep);
18509
+ const stepLabels = buildStepLabels({
18510
+ travelersFirstStep,
18511
+ flightOptionsHidden: flightOptions.isHidden,
18512
+ roomOptionsHidden: roomOptions.isHidden,
18513
+ translations
18514
+ });
18502
18515
  return React__default.createElement(StepIndicators$1, { currentStep: currentStep, stepLabels: stepLabels });
18503
18516
  };
18504
18517
 
@@ -18515,22 +18528,12 @@ const StepRoute = ({ number, title, component }) => {
18515
18528
  const { flightOptions, roomOptions } = useContext(SettingsContext);
18516
18529
  const translations = useSelector(selectTranslations);
18517
18530
  const travelersFirstStep = useSelector(selectTravelersFirstStep);
18518
- const stepLabels = [];
18519
- if (travelersFirstStep) {
18520
- stepLabels.push(translations.STEPS.PERSONAL_DETAILS);
18521
- }
18522
- if (!flightOptions.isHidden) {
18523
- stepLabels.push(translations.STEPS.FLIGHT_OPTIONS);
18524
- }
18525
- if (!roomOptions.isHidden) {
18526
- stepLabels.push(translations.STEPS.ROOM_OPTIONS);
18527
- }
18528
- stepLabels.push(translations.STEPS.EXTRA_OPTIONS);
18529
- if (!travelersFirstStep) {
18530
- stepLabels.push(translations.STEPS.PERSONAL_DETAILS);
18531
- }
18532
- stepLabels.push(translations.STEPS.SUMMARY);
18533
- stepLabels.push(translations.STEPS.CONFIRMATION);
18531
+ const stepLabels = buildStepLabels({
18532
+ travelersFirstStep,
18533
+ flightOptionsHidden: flightOptions.isHidden,
18534
+ roomOptionsHidden: roomOptions.isHidden,
18535
+ translations
18536
+ });
18534
18537
  return (React__default.createElement(BookingPanel, { currentStep: number, stepLabels: stepLabels, StepIndicatorsComponent: StepIndicators, renderTitle: (step) => (React__default.createElement(React__default.Fragment, null,
18535
18538
  step + 1,
18536
18539
  ". ",
@@ -21630,6 +21633,7 @@ const Summary = () => {
21630
21633
  const [remarks, setRemarks] = useState('');
21631
21634
  const [voucher, setVoucher] = useState({});
21632
21635
  const bookingQueryString = useSelector(selectBookingQueryString);
21636
+ const travelersFirstStep = useSelector(selectTravelersFirstStep);
21633
21637
  const travelerFormValues = useSelector(selectTravelersFormValues);
21634
21638
  const packageDetails = useSelector(selectPackageDetails);
21635
21639
  const activeOption = useSelector(selectActiveOption);
@@ -21779,7 +21783,7 @@ const Summary = () => {
21779
21783
  dispatch(fetchPriceDetails());
21780
21784
  };
21781
21785
  const goPrevious = () => {
21782
- dispatch(setCurrentStep$1(TRAVELERS_FORM_STEP));
21786
+ dispatch(setCurrentStep$1(travelersFirstStep ? OPTIONS_FORM_STEP : TRAVELERS_FORM_STEP));
21783
21787
  };
21784
21788
  const translations = useSelector(selectTranslations);
21785
21789
  return (React__default.createElement(React__default.Fragment, null,
@@ -21939,7 +21943,7 @@ const Summary = () => {
21939
21943
  __html: checkbox.text
21940
21944
  } }))))))))))),
21941
21945
  React__default.createElement("div", { className: "booking__navigator" },
21942
- settings.skipRouter ? (React__default.createElement("button", { type: "button", title: translations.STEPS.PREVIOUS, onClick: () => goPrevious(), className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : (React__default.createElement(Link, { to: `${!settings.skipBasePathInRouting ? settings.basePath : ''}${settings.travellers.pathSuffix}?${bookingQueryString}`, title: translations.STEPS.PREVIOUS, className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)),
21946
+ settings.skipRouter ? (React__default.createElement("button", { type: "button", title: translations.STEPS.PREVIOUS, onClick: () => goPrevious(), className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)) : (React__default.createElement(Link, { to: `${!settings.skipBasePathInRouting ? settings.basePath : ''}${travelersFirstStep ? settings.options.pathSuffix : settings.travellers.pathSuffix}?${bookingQueryString}`, title: translations.STEPS.PREVIOUS, className: "cta cta--secondary" }, translations.STEPS.PREVIOUS)),
21943
21947
  settings.allowOption && (React__default.createElement("button", { title: translations.STEPS.SUBMIT_OPTION, className: buildClassName(['cta', !userValidated && 'cta--disabled']), disabled: !userValidated, name: "option" }, translations.STEPS.SUBMIT_OPTION)),
21944
21948
  React__default.createElement("button", { title: settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING, className: buildClassName(['cta', !userValidated && 'cta--disabled']), disabled: !userValidated, name: "default" }, settings.isOffer ? translations.STEPS.SUBMIT_OFFER : translations.STEPS.SUBMIT_BOOKING))))));
21945
21949
  };
@@ -21994,8 +21998,9 @@ const validateForm$1 = (values, agentRequired, bookingType, translations, formFi
21994
21998
  if (isEmpty$1(adult.birthDate)) {
21995
21999
  set(errors, `rooms[${rIndex}].adults[${index}].birthDate`, formatTravelerField(rIndex + 1, index + 1, translations.TRAVELERS_FORM.BIRTHDATE));
21996
22000
  }
21997
- else if (values.startDate) {
21998
- const age = getAge(adult.birthDate, values.startDate);
22001
+ else if (values.endDate) {
22002
+ // If you are younger than the maxChildAge at the end of the trip, you are considered a child, so we check the endDate here instead of the startDate
22003
+ const age = getAge(adult.birthDate, values.endDate);
21999
22004
  if (age <= maxChildAge) {
22000
22005
  set(errors, `rooms[${rIndex}].adults[${index}].birthDate`, formatTravelerIsNoAdult(rIndex + 1, index + 1));
22001
22006
  }
@@ -22016,8 +22021,9 @@ const validateForm$1 = (values, agentRequired, bookingType, translations, formFi
22016
22021
  if (isEmpty$1(child.birthDate)) {
22017
22022
  set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerField(rIndex + 1, r.adults.length + index + 1, translations.TRAVELERS_FORM.BIRTHDATE));
22018
22023
  }
22019
- else if (values.startDate) {
22020
- const age = getAge(child.birthDate, values.startDate);
22024
+ else if (values.endDate) {
22025
+ // You need to be under the maxChildAge until the end of the trip, so we check the endDate here instead of the startDate
22026
+ const age = getAge(child.birthDate, values.endDate);
22021
22027
  if (age > maxChildAge) {
22022
22028
  set(errors, `rooms[${rIndex}].children[${index}].birthDate`, formatTravelerIsNoChild(rIndex + 1, r.adults.length + index + 1));
22023
22029
  }
@@ -22241,10 +22247,11 @@ function createTraveler(traveler, followNumber, personTranslation, isCompact) {
22241
22247
  gender: ''
22242
22248
  };
22243
22249
  }
22244
- function createInitialValuesFromRooms(formRooms, startDate, agentAdressId, personTranslation, isCompact) {
22250
+ function createInitialValuesFromRooms(formRooms, startDate, endDate, agentAdressId, personTranslation, isCompact) {
22245
22251
  const followNumber = { number: 1 };
22246
22252
  const initialValues = {
22247
22253
  startDate,
22254
+ endDate,
22248
22255
  rooms: formRooms.map((room) => ({
22249
22256
  adults: room.adults.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact)),
22250
22257
  children: room.children.map((traveler) => createTraveler(traveler, followNumber, personTranslation, isCompact))
@@ -22294,7 +22301,7 @@ function createInitialValuesFromEditablePackagingEntry(editablePackagingEntry, a
22294
22301
  })
22295
22302
  };
22296
22303
  });
22297
- const values = createInitialValuesFromRooms(rooms.map((room) => ({ adults: room.adults, children: room.children })), editablePackagingEntry?.lines?.[0]?.from, agentAdressId);
22304
+ const values = createInitialValuesFromRooms(rooms.map((room) => ({ adults: room.adults, children: room.children })), first(editablePackagingEntry?.lines)?.from, last(editablePackagingEntry?.lines)?.to, agentAdressId);
22298
22305
  values.rooms = rooms;
22299
22306
  values.mainBookerId = pax.find((x) => x.isMainBooker)?.id ?? rooms[0]?.adults?.[0]?.id ?? -1;
22300
22307
  const address = editablePackagingEntry?.address;
@@ -22572,6 +22579,7 @@ const TravelersForm = () => {
22572
22579
  const navigate = settings.skipRouter ? () => { } : useNavigate();
22573
22580
  const bookingQueryString = useSelector(selectBookingQueryString);
22574
22581
  const startDate = useSelector(selectStartDate);
22582
+ const endDate = useSelector(selectEndDate);
22575
22583
  const selectFormRooms = useMemo(() => makeSelectFormRooms(settings.maxChildAge), [settings.maxChildAge]);
22576
22584
  const formRooms = useSelector(selectFormRooms);
22577
22585
  const bookingType = useSelector(selectBookingType);
@@ -22581,13 +22589,14 @@ const TravelersForm = () => {
22581
22589
  const travelersFirstStep = useSelector(selectTravelersFirstStep);
22582
22590
  const isUnavailable = useSelector(selectIsUnavailable);
22583
22591
  const bookingAttributes = useSelector(selectBookingAttributes);
22584
- const isFetching = useSelector(selectIsFetching);
22585
22592
  const hasMounted = useSelector(selectHasMounted);
22586
22593
  const countries = useSelector(selectCountries);
22594
+ const inFlight = useRef(false);
22595
+ const pendingRefetch = useRef(false);
22587
22596
  const useCompactForm = !!settings.travellers.compactForm && !!settings.agentAdressId;
22588
22597
  const showAllCountries = !!settings.travellers.showAllCountries;
22589
22598
  const initialValues = useSelector(selectTravelersFormValues) ??
22590
- createInitialValuesFromRooms(formRooms, startDate, agentAdressId, translations.TRAVELERS_FORM.PERSON, useCompactForm);
22599
+ createInitialValuesFromRooms(formRooms, startDate, endDate, agentAdressId, translations.TRAVELERS_FORM.PERSON, useCompactForm);
22591
22600
  const [showAgentSelection, setShowAgentSelection] = useState(!settings.agentAdressId && !settings.hideAgentSelection);
22592
22601
  const formik = useFormik({
22593
22602
  initialValues,
@@ -22615,40 +22624,46 @@ const TravelersForm = () => {
22615
22624
  dispatch(fetchPriceDetails());
22616
22625
  }, [dispatch]);
22617
22626
  useEffect(() => {
22618
- if (!bookingAttributes?.rooms?.length || isFetching)
22627
+ if (!bookingAttributes?.rooms?.length)
22619
22628
  return;
22620
22629
  if (!hasMounted) {
22621
22630
  dispatch(setHasMounted(true));
22622
22631
  return;
22623
22632
  }
22633
+ if (inFlight.current) {
22634
+ pendingRefetch.current = true;
22635
+ return;
22636
+ }
22624
22637
  const fetchAll = async () => {
22625
- dispatch(setIsFetching(true));
22638
+ inFlight.current = true;
22626
22639
  try {
22627
- await dispatch(fetchPackage());
22628
- await dispatch(fetchPriceDetails());
22640
+ do {
22641
+ pendingRefetch.current = false;
22642
+ await dispatch(fetchPackage());
22643
+ await dispatch(fetchPriceDetails());
22644
+ } while (pendingRefetch.current);
22629
22645
  }
22630
22646
  finally {
22631
- dispatch(setIsFetching(false));
22647
+ inFlight.current = false;
22632
22648
  }
22633
22649
  };
22634
22650
  fetchAll();
22635
- }, [bookingAttributes?.rooms, dispatch, hasMounted, isFetching]);
22651
+ }, [bookingAttributes?.rooms, dispatch, hasMounted]);
22652
+ const roomsQuery = useMemo(() => formik.values.rooms
22653
+ .map((room) => {
22654
+ const adults = room.adults ? room.adults.length : 0;
22655
+ const childAges = room.children?.length ? room.children.map((child) => child.age).join(',') : '';
22656
+ return `(adults:${adults},childAges:(${childAges}))`;
22657
+ })
22658
+ .join(','), [formik.values.rooms]);
22636
22659
  useEffect(() => {
22637
- if (settings.skipRouter || !travelersFirstStep)
22660
+ if (settings.skipRouter || !travelersFirstStep || !bookingQueryString)
22638
22661
  return;
22639
22662
  const params = new URLSearchParams(bookingQueryString);
22640
22663
  params.delete('rooms');
22641
- const roomsString = formik.values.rooms
22642
- .map((room) => {
22643
- const adults = room.adults ? room.adults.length : 0;
22644
- const childAges = room.children?.length ? room.children.map((child) => child.age).join(',') : '';
22645
- return `adults:${adults},childAges:(${childAges})`;
22646
- })
22647
- .map((room) => `(${room})`)
22648
- .join(',');
22649
- const nextQuery = `${params.toString()}${params.toString() ? '&' : ''}rooms=(${roomsString})`;
22664
+ const nextQuery = `${params.toString()}${params.toString() ? '&' : ''}rooms=(${roomsQuery})`;
22650
22665
  navigate(`${window.location.pathname}?${nextQuery}`, { replace: true });
22651
- }, [formik.values.rooms, bookingQueryString, navigate, settings.skipRouter, travelersFirstStep]);
22666
+ }, [roomsQuery, bookingQueryString, navigate, settings.skipRouter, travelersFirstStep]);
22652
22667
  useEffect(() => {
22653
22668
  if (!agents || !settings.affiliateSlug)
22654
22669
  return;
@@ -22863,10 +22878,17 @@ const Booking = ({ productCode, productName, thumbnailUrl }) => {
22863
22878
  promise.abort();
22864
22879
  };
22865
22880
  }, [productAttributes]);
22866
- let numberIndex = 1;
22867
- // No-op when `customTranslationsUrl` isn't configured (translationsReady
22868
- // starts `true` in that case). Only suppresses the initial render when a
22869
- // host actively opts into the custom-translations fetch.
22881
+ let numberIndex = 0;
22882
+ const getFirstStep = () => {
22883
+ if (travelersFirstStep)
22884
+ return { path: travellers.pathSuffix, title: translations.STEPS.PERSONAL_DETAILS, component: React__default.createElement(TravelersForm, null) };
22885
+ if (!flightOptions.isHidden && flightOptions.pathSuffix)
22886
+ return { path: flightOptions.pathSuffix, title: translations.STEPS.FLIGHT_OPTIONS, component: React__default.createElement(FlightOptionsForm, null) };
22887
+ if (!roomOptions.isHidden && roomOptions.pathSuffix)
22888
+ return { path: roomOptions.pathSuffix, title: translations.STEPS.ROOM_OPTIONS, component: React__default.createElement(RoomOptionsForm, null) };
22889
+ return { path: options.pathSuffix, title: translations.STEPS.EXTRA_OPTIONS, component: React__default.createElement(OptionsForm, null) };
22890
+ };
22891
+ const firstStep = getFirstStep();
22870
22892
  if (!translationsReady) {
22871
22893
  return null;
22872
22894
  }
@@ -22875,8 +22897,9 @@ const Booking = ({ productCode, productName, thumbnailUrl }) => {
22875
22897
  React__default.createElement("div", { className: "booking__content" },
22876
22898
  React__default.createElement("div", { className: "booking__panel" },
22877
22899
  React__default.createElement(Routes, null,
22878
- travelersFirstStep && (React__default.createElement(Route, { path: "/", element: React__default.createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.PERSONAL_DETAILS, component: React__default.createElement(TravelersForm, null) }) })),
22879
- !flightOptions.isHidden && flightOptions.pathSuffix && (React__default.createElement(Route, { path: '/', element: React__default.createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.FLIGHT_OPTIONS, component: React__default.createElement(FlightOptionsForm, null) }) })),
22900
+ firstStep.path !== '/' && React__default.createElement(Route, { path: "/", element: React__default.createElement(StepRoute, { number: 0, title: firstStep.title, component: firstStep.component }) }),
22901
+ travelersFirstStep && (React__default.createElement(Route, { path: travellers.pathSuffix, element: React__default.createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.PERSONAL_DETAILS, component: React__default.createElement(TravelersForm, null) }) })),
22902
+ !flightOptions.isHidden && flightOptions.pathSuffix && (React__default.createElement(Route, { path: flightOptions.pathSuffix, element: React__default.createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.FLIGHT_OPTIONS, component: React__default.createElement(FlightOptionsForm, null) }) })),
22880
22903
  !roomOptions.isHidden && roomOptions.pathSuffix && (React__default.createElement(Route, { path: roomOptions.pathSuffix, element: React__default.createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.ROOM_OPTIONS, component: React__default.createElement(RoomOptionsForm, null) }) })),
22881
22904
  React__default.createElement(Route, { path: options.pathSuffix, element: React__default.createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.EXTRA_OPTIONS, component: React__default.createElement(OptionsForm, null) }) }),
22882
22905
  !travelersFirstStep && (React__default.createElement(Route, { path: travellers.pathSuffix, element: React__default.createElement(StepRoute, { number: numberIndex++, title: translations.STEPS.PERSONAL_DETAILS, component: React__default.createElement(TravelersForm, null) }) })),
@@ -0,0 +1,8 @@
1
+ interface BuildStepLabelsParams {
2
+ travelersFirstStep: boolean;
3
+ flightOptionsHidden?: boolean | null;
4
+ roomOptionsHidden?: boolean | null;
5
+ translations: Record<string, any>;
6
+ }
7
+ export declare const buildStepLabels: ({ travelersFirstStep, flightOptionsHidden, roomOptionsHidden, translations }: BuildStepLabelsParams) => string[];
8
+ export {};
@@ -33,7 +33,6 @@ export interface BookingState {
33
33
  };
34
34
  isOption?: boolean;
35
35
  travelersFirstStep: boolean;
36
- isFetching?: boolean;
37
36
  hasMounted: boolean;
38
37
  countries?: CountryItem[];
39
38
  }
@@ -57,6 +56,6 @@ export declare const fetchCountries: import("@reduxjs/toolkit").AsyncThunk<impor
57
56
  fulfilledMeta?: unknown;
58
57
  rejectedMeta?: unknown;
59
58
  }>;
60
- export declare const setOfficeId: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "booking/setOfficeId">, setLanguageCode: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setLanguageCode">, setTranslations: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "booking/setTranslations">, setBookingOptions: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptions, "booking/setBookingOptions">, setBookingType: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingType">, setProductAttributes: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<ProductAttributes | undefined, "booking/setProductAttributes">, setBookingAttributes: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<BookingAttributes | undefined, "booking/setBookingAttributes">, setCalculateDeposit: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setCalculateDeposit">, setShowCommission: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<boolean | undefined, "booking/setShowCommission">, setBookingNumber: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingNumber">, setIsRetry: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsRetry">, setFetchingPackage: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setFetchingPackage">, setIsFetching: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsFetching">, setHasMounted: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setHasMounted">, setPackage: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<BookingPackage | undefined, "booking/setPackage">, setPackageRooms: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingPackageRoom[], "booking/setPackageRooms">, setPackageOptionPax: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionPax[], "booking/setPackageOptionPax">, setPackageOptionUnits: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionUnit[], "booking/setPackageOptionUnits">, setPackageGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionGroup<PerBookingPackageOption>[], "booking/setPackageGroups">, setSkipPayment: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setSkipPayment">, setGeneratePaymentUrl: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setGeneratePaymentUrl">, setTagIds: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<number[] | undefined, "booking/setTagIds">, setAgentAdressId: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<number | undefined, "booking/setAgentAdressId">, setBookingRemarks: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingRemarks">, setVoucherCodes: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "booking/setVoucherCodes">, setCurrentStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingStep, "booking/setCurrentStep">, setPackageAirlineGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingAirlineGroup<AirlineBookingPackageOption>[], "booking/setPackageAirlineGroups">, setPackageAirportGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingAirportGroup<AirportBookingPackageOption>[], "booking/setPackageAirportGroups">, setFlights: import("@reduxjs/toolkit").ActionCreatorWithPayload<GroupedFlights, "booking/setFlights">, setAccommodationViewId: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "booking/setAccommodationViewId">, setIsOption: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsOption">, setTravelersFirstStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setTravelersFirstStep">, setIsUnavailable: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsUnavailable">;
59
+ export declare const setOfficeId: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "booking/setOfficeId">, setLanguageCode: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setLanguageCode">, setTranslations: import("@reduxjs/toolkit").ActionCreatorWithPayload<any, "booking/setTranslations">, setBookingOptions: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptions, "booking/setBookingOptions">, setBookingType: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingType">, setProductAttributes: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<ProductAttributes | undefined, "booking/setProductAttributes">, setBookingAttributes: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<BookingAttributes | undefined, "booking/setBookingAttributes">, setCalculateDeposit: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setCalculateDeposit">, setShowCommission: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<boolean | undefined, "booking/setShowCommission">, setBookingNumber: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingNumber">, setIsRetry: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsRetry">, setFetchingPackage: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setFetchingPackage">, setHasMounted: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setHasMounted">, setPackage: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<BookingPackage | undefined, "booking/setPackage">, setPackageRooms: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingPackageRoom[], "booking/setPackageRooms">, setPackageOptionPax: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionPax[], "booking/setPackageOptionPax">, setPackageOptionUnits: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionUnit[], "booking/setPackageOptionUnits">, setPackageGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingOptionGroup<PerBookingPackageOption>[], "booking/setPackageGroups">, setSkipPayment: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setSkipPayment">, setGeneratePaymentUrl: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setGeneratePaymentUrl">, setTagIds: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<number[] | undefined, "booking/setTagIds">, setAgentAdressId: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<number | undefined, "booking/setAgentAdressId">, setBookingRemarks: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "booking/setBookingRemarks">, setVoucherCodes: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "booking/setVoucherCodes">, setCurrentStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingStep, "booking/setCurrentStep">, setPackageAirlineGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingAirlineGroup<AirlineBookingPackageOption>[], "booking/setPackageAirlineGroups">, setPackageAirportGroups: import("@reduxjs/toolkit").ActionCreatorWithPayload<BookingAirportGroup<AirportBookingPackageOption>[], "booking/setPackageAirportGroups">, setFlights: import("@reduxjs/toolkit").ActionCreatorWithPayload<GroupedFlights, "booking/setFlights">, setAccommodationViewId: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "booking/setAccommodationViewId">, setIsOption: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsOption">, setTravelersFirstStep: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setTravelersFirstStep">, setIsUnavailable: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "booking/setIsUnavailable">;
61
60
  declare const _default: import("@reduxjs/toolkit").Reducer<BookingState>;
62
61
  export default _default;
@@ -2,7 +2,6 @@ import { BookingPackageAddress, BookingPackageBookRequest, BookingPackagePax, Bo
2
2
  import { RootState } from '../../store';
3
3
  import { Room } from '../../types';
4
4
  export declare const selectHasMounted: (state: RootState) => boolean;
5
- export declare const selectIsFetching: (state: RootState) => boolean | undefined;
6
5
  export declare const selectCurrentStep: (state: RootState) => import("./constants").BookingStep;
7
6
  export declare const selectGeneratePaymentUrl: (state: RootState) => boolean;
8
7
  export declare const selectSkipPaymentWithAgent: (state: RootState) => boolean;
@@ -257,6 +256,7 @@ export declare const selectCalculateDeposit: (state: RootState) => boolean;
257
256
  export declare const selectShowCommission: (state: RootState) => boolean | undefined;
258
257
  export declare const selectIsRetry: (state: RootState) => boolean;
259
258
  export declare const selectStartDate: (state: RootState) => string | undefined;
259
+ export declare const selectEndDate: (state: RootState) => string | undefined;
260
260
  export declare const selectAgents: (state: RootState) => import("@qite/tide-client").BookingTravelAgent[] | undefined;
261
261
  export declare const selectCountries: (state: RootState) => import("@qite/tide-client").CountryItem[] | undefined;
262
262
  export declare const selectProductCode: (state: RootState) => string | undefined;
@@ -163,6 +163,7 @@ export interface FlightInfo {
163
163
  export interface TravelersFormValues {
164
164
  rooms: TravelersFormRoomValues[];
165
165
  startDate?: string;
166
+ endDate?: string;
166
167
  mainBookerId: number;
167
168
  street: string;
168
169
  houseNumber: string;
@@ -44,7 +44,7 @@ export declare function createTraveler(traveler: RoomTraveler, followNumber: {
44
44
  export declare function createInitialValuesFromRooms(formRooms: {
45
45
  adults: RoomTraveler[];
46
46
  children: RoomTraveler[];
47
- }[], startDate?: string, agentAdressId?: number, personTranslation?: string, isCompact?: boolean): TravelersFormValues;
47
+ }[], startDate?: string, endDate?: string, agentAdressId?: number, personTranslation?: string, isCompact?: boolean): TravelersFormValues;
48
48
  export declare function createInitialValuesFromEditablePackagingEntry(editablePackagingEntry: PackagingEntry, agentAdressId?: number): TravelersFormValues;
49
49
  export declare function applyTravelersFormValuesToEditablePackagingEntry(editablePackagingEntry: PackagingEntry, values: TravelersFormValues): {
50
50
  pax: PackagingEntryPax[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qite/tide-booking-component",
3
- "version": "1.4.125",
3
+ "version": "1.4.127",
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",