@qite/tide-booking-component 1.4.125 → 1.4.126

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;
@@ -18001,7 +18003,6 @@ const initialState$5 = {
18001
18003
  currentStep: OPTIONS_FORM_STEP,
18002
18004
  translations: undefined,
18003
18005
  travelersFirstStep: false,
18004
- isFetching: false,
18005
18006
  hasMounted: false,
18006
18007
  countries: undefined
18007
18008
  };
@@ -18220,9 +18221,6 @@ const bookingSlice = toolkit.createSlice({
18220
18221
  setHasMounted(state, action) {
18221
18222
  state.hasMounted = action.payload;
18222
18223
  },
18223
- setIsFetching(state, action) {
18224
- state.isFetching = action.payload;
18225
- },
18226
18224
  setOfficeId(state, action) {
18227
18225
  state.officeId = action.payload;
18228
18226
  },
@@ -18436,7 +18434,7 @@ const bookingSlice = toolkit.createSlice({
18436
18434
  });
18437
18435
  }
18438
18436
  });
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;
18437
+ 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
18438
  var bookingReducer = bookingSlice.reducer;
18441
18439
 
18442
18440
  const SettingsContext = React__default["default"].createContext({
@@ -18508,18 +18506,19 @@ const StepIndicators$1 = ({ currentStep, stepLabels }) => {
18508
18506
  React__default["default"].createElement("div", { className: "step-indicators__text" }, stepName)))))));
18509
18507
  };
18510
18508
 
18511
- const StepIndicators = ({ currentStep }) => {
18512
- const { flightOptions, roomOptions } = React.useContext(SettingsContext);
18513
- const translations = reactRedux.useSelector(selectTranslations);
18514
- const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
18509
+ // Single source of truth for the ordered step labels shown in the indicator and
18510
+ // the panel title. Kept in one place so step-route.tsx and step-indicator.tsx
18511
+ // can never drift out of sync. The ERROR step is intentionally excluded — it is
18512
+ // not part of the indicator sequence.
18513
+ const buildStepLabels = ({ travelersFirstStep, flightOptionsHidden, roomOptionsHidden, translations }) => {
18515
18514
  const stepLabels = [];
18516
18515
  if (travelersFirstStep) {
18517
18516
  stepLabels.push(translations.STEPS.PERSONAL_DETAILS);
18518
18517
  }
18519
- if (!flightOptions.isHidden) {
18518
+ if (!flightOptionsHidden) {
18520
18519
  stepLabels.push(translations.STEPS.FLIGHT_OPTIONS);
18521
18520
  }
18522
- if (!roomOptions.isHidden) {
18521
+ if (!roomOptionsHidden) {
18523
18522
  stepLabels.push(translations.STEPS.ROOM_OPTIONS);
18524
18523
  }
18525
18524
  stepLabels.push(translations.STEPS.EXTRA_OPTIONS);
@@ -18528,6 +18527,19 @@ const StepIndicators = ({ currentStep }) => {
18528
18527
  }
18529
18528
  stepLabels.push(translations.STEPS.SUMMARY);
18530
18529
  stepLabels.push(translations.STEPS.CONFIRMATION);
18530
+ return stepLabels;
18531
+ };
18532
+
18533
+ const StepIndicators = ({ currentStep }) => {
18534
+ const { flightOptions, roomOptions } = React.useContext(SettingsContext);
18535
+ const translations = reactRedux.useSelector(selectTranslations);
18536
+ const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
18537
+ const stepLabels = buildStepLabels({
18538
+ travelersFirstStep,
18539
+ flightOptionsHidden: flightOptions.isHidden,
18540
+ roomOptionsHidden: roomOptions.isHidden,
18541
+ translations
18542
+ });
18531
18543
  return React__default["default"].createElement(StepIndicators$1, { currentStep: currentStep, stepLabels: stepLabels });
18532
18544
  };
18533
18545
 
@@ -18544,22 +18556,12 @@ const StepRoute = ({ number, title, component }) => {
18544
18556
  const { flightOptions, roomOptions } = React.useContext(SettingsContext);
18545
18557
  const translations = reactRedux.useSelector(selectTranslations);
18546
18558
  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);
18559
+ const stepLabels = buildStepLabels({
18560
+ travelersFirstStep,
18561
+ flightOptionsHidden: flightOptions.isHidden,
18562
+ roomOptionsHidden: roomOptions.isHidden,
18563
+ translations
18564
+ });
18563
18565
  return (React__default["default"].createElement(BookingPanel, { currentStep: number, stepLabels: stepLabels, StepIndicatorsComponent: StepIndicators, renderTitle: (step) => (React__default["default"].createElement(React__default["default"].Fragment, null,
18564
18566
  step + 1,
18565
18567
  ". ",
@@ -21659,6 +21661,7 @@ const Summary = () => {
21659
21661
  const [remarks, setRemarks] = React.useState('');
21660
21662
  const [voucher, setVoucher] = React.useState({});
21661
21663
  const bookingQueryString = reactRedux.useSelector(selectBookingQueryString);
21664
+ const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
21662
21665
  const travelerFormValues = reactRedux.useSelector(selectTravelersFormValues);
21663
21666
  const packageDetails = reactRedux.useSelector(selectPackageDetails);
21664
21667
  const activeOption = reactRedux.useSelector(selectActiveOption);
@@ -21808,7 +21811,7 @@ const Summary = () => {
21808
21811
  dispatch(fetchPriceDetails());
21809
21812
  };
21810
21813
  const goPrevious = () => {
21811
- dispatch(setCurrentStep$1(TRAVELERS_FORM_STEP));
21814
+ dispatch(setCurrentStep$1(travelersFirstStep ? OPTIONS_FORM_STEP : TRAVELERS_FORM_STEP));
21812
21815
  };
21813
21816
  const translations = reactRedux.useSelector(selectTranslations);
21814
21817
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
@@ -21968,7 +21971,7 @@ const Summary = () => {
21968
21971
  __html: checkbox.text
21969
21972
  } }))))))))))),
21970
21973
  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)),
21974
+ 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
21975
  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
21976
  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
21977
  };
@@ -22610,9 +22613,10 @@ const TravelersForm = () => {
22610
22613
  const travelersFirstStep = reactRedux.useSelector(selectTravelersFirstStep);
22611
22614
  const isUnavailable = reactRedux.useSelector(selectIsUnavailable);
22612
22615
  const bookingAttributes = reactRedux.useSelector(selectBookingAttributes);
22613
- const isFetching = reactRedux.useSelector(selectIsFetching);
22614
22616
  const hasMounted = reactRedux.useSelector(selectHasMounted);
22615
22617
  const countries = reactRedux.useSelector(selectCountries);
22618
+ const inFlight = React.useRef(false);
22619
+ const pendingRefetch = React.useRef(false);
22616
22620
  const useCompactForm = !!settings.travellers.compactForm && !!settings.agentAdressId;
22617
22621
  const showAllCountries = !!settings.travellers.showAllCountries;
22618
22622
  const initialValues = reactRedux.useSelector(selectTravelersFormValues) ??
@@ -22644,40 +22648,46 @@ const TravelersForm = () => {
22644
22648
  dispatch(fetchPriceDetails());
22645
22649
  }, [dispatch]);
22646
22650
  React.useEffect(() => {
22647
- if (!bookingAttributes?.rooms?.length || isFetching)
22651
+ if (!bookingAttributes?.rooms?.length)
22648
22652
  return;
22649
22653
  if (!hasMounted) {
22650
22654
  dispatch(setHasMounted(true));
22651
22655
  return;
22652
22656
  }
22657
+ if (inFlight.current) {
22658
+ pendingRefetch.current = true;
22659
+ return;
22660
+ }
22653
22661
  const fetchAll = async () => {
22654
- dispatch(setIsFetching(true));
22662
+ inFlight.current = true;
22655
22663
  try {
22656
- await dispatch(fetchPackage());
22657
- await dispatch(fetchPriceDetails());
22664
+ do {
22665
+ pendingRefetch.current = false;
22666
+ await dispatch(fetchPackage());
22667
+ await dispatch(fetchPriceDetails());
22668
+ } while (pendingRefetch.current);
22658
22669
  }
22659
22670
  finally {
22660
- dispatch(setIsFetching(false));
22671
+ inFlight.current = false;
22661
22672
  }
22662
22673
  };
22663
22674
  fetchAll();
22664
- }, [bookingAttributes?.rooms, dispatch, hasMounted, isFetching]);
22675
+ }, [bookingAttributes?.rooms, dispatch, hasMounted]);
22676
+ const roomsQuery = React.useMemo(() => formik$1.values.rooms
22677
+ .map((room) => {
22678
+ const adults = room.adults ? room.adults.length : 0;
22679
+ const childAges = room.children?.length ? room.children.map((child) => child.age).join(',') : '';
22680
+ return `(adults:${adults},childAges:(${childAges}))`;
22681
+ })
22682
+ .join(','), [formik$1.values.rooms]);
22665
22683
  React.useEffect(() => {
22666
- if (settings.skipRouter || !travelersFirstStep)
22684
+ if (settings.skipRouter || !travelersFirstStep || !bookingQueryString)
22667
22685
  return;
22668
22686
  const params = new URLSearchParams(bookingQueryString);
22669
22687
  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})`;
22688
+ const nextQuery = `${params.toString()}${params.toString() ? '&' : ''}rooms=(${roomsQuery})`;
22679
22689
  navigate(`${window.location.pathname}?${nextQuery}`, { replace: true });
22680
- }, [formik$1.values.rooms, bookingQueryString, navigate, settings.skipRouter, travelersFirstStep]);
22690
+ }, [roomsQuery, bookingQueryString, navigate, settings.skipRouter, travelersFirstStep]);
22681
22691
  React.useEffect(() => {
22682
22692
  if (!agents || !settings.affiliateSlug)
22683
22693
  return;
@@ -22892,10 +22902,17 @@ const Booking = ({ productCode, productName, thumbnailUrl }) => {
22892
22902
  promise.abort();
22893
22903
  };
22894
22904
  }, [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.
22905
+ let numberIndex = 0;
22906
+ const getFirstStep = () => {
22907
+ if (travelersFirstStep)
22908
+ return { path: travellers.pathSuffix, title: translations.STEPS.PERSONAL_DETAILS, component: React__default["default"].createElement(TravelersForm, null) };
22909
+ if (!flightOptions.isHidden && flightOptions.pathSuffix)
22910
+ return { path: flightOptions.pathSuffix, title: translations.STEPS.FLIGHT_OPTIONS, component: React__default["default"].createElement(FlightOptionsForm, null) };
22911
+ if (!roomOptions.isHidden && roomOptions.pathSuffix)
22912
+ return { path: roomOptions.pathSuffix, title: translations.STEPS.ROOM_OPTIONS, component: React__default["default"].createElement(RoomOptionsForm, null) };
22913
+ return { path: options.pathSuffix, title: translations.STEPS.EXTRA_OPTIONS, component: React__default["default"].createElement(OptionsForm, null) };
22914
+ };
22915
+ const firstStep = getFirstStep();
22899
22916
  if (!translationsReady) {
22900
22917
  return null;
22901
22918
  }
@@ -22904,8 +22921,9 @@ const Booking = ({ productCode, productName, thumbnailUrl }) => {
22904
22921
  React__default["default"].createElement("div", { className: "booking__content" },
22905
22922
  React__default["default"].createElement("div", { className: "booking__panel" },
22906
22923
  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) }) })),
22924
+ firstStep.path !== '/' && React__default["default"].createElement(reactRouter.Route, { path: "/", element: React__default["default"].createElement(StepRoute, { number: 0, title: firstStep.title, component: firstStep.component }) }),
22925
+ 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) }) })),
22926
+ !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
22927
  !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
22928
  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
22929
  !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;
@@ -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;
@@ -17972,7 +17974,6 @@ const initialState$5 = {
17972
17974
  currentStep: OPTIONS_FORM_STEP,
17973
17975
  translations: undefined,
17974
17976
  travelersFirstStep: false,
17975
- isFetching: false,
17976
17977
  hasMounted: false,
17977
17978
  countries: undefined
17978
17979
  };
@@ -18191,9 +18192,6 @@ const bookingSlice = createSlice({
18191
18192
  setHasMounted(state, action) {
18192
18193
  state.hasMounted = action.payload;
18193
18194
  },
18194
- setIsFetching(state, action) {
18195
- state.isFetching = action.payload;
18196
- },
18197
18195
  setOfficeId(state, action) {
18198
18196
  state.officeId = action.payload;
18199
18197
  },
@@ -18407,7 +18405,7 @@ const bookingSlice = createSlice({
18407
18405
  });
18408
18406
  }
18409
18407
  });
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;
18408
+ 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
18409
  var bookingReducer = bookingSlice.reducer;
18412
18410
 
18413
18411
  const SettingsContext = React__default.createContext({
@@ -18479,18 +18477,19 @@ const StepIndicators$1 = ({ currentStep, stepLabels }) => {
18479
18477
  React__default.createElement("div", { className: "step-indicators__text" }, stepName)))))));
18480
18478
  };
18481
18479
 
18482
- const StepIndicators = ({ currentStep }) => {
18483
- const { flightOptions, roomOptions } = useContext(SettingsContext);
18484
- const translations = useSelector(selectTranslations);
18485
- const travelersFirstStep = useSelector(selectTravelersFirstStep);
18480
+ // Single source of truth for the ordered step labels shown in the indicator and
18481
+ // the panel title. Kept in one place so step-route.tsx and step-indicator.tsx
18482
+ // can never drift out of sync. The ERROR step is intentionally excluded — it is
18483
+ // not part of the indicator sequence.
18484
+ const buildStepLabels = ({ travelersFirstStep, flightOptionsHidden, roomOptionsHidden, translations }) => {
18486
18485
  const stepLabels = [];
18487
18486
  if (travelersFirstStep) {
18488
18487
  stepLabels.push(translations.STEPS.PERSONAL_DETAILS);
18489
18488
  }
18490
- if (!flightOptions.isHidden) {
18489
+ if (!flightOptionsHidden) {
18491
18490
  stepLabels.push(translations.STEPS.FLIGHT_OPTIONS);
18492
18491
  }
18493
- if (!roomOptions.isHidden) {
18492
+ if (!roomOptionsHidden) {
18494
18493
  stepLabels.push(translations.STEPS.ROOM_OPTIONS);
18495
18494
  }
18496
18495
  stepLabels.push(translations.STEPS.EXTRA_OPTIONS);
@@ -18499,6 +18498,19 @@ const StepIndicators = ({ currentStep }) => {
18499
18498
  }
18500
18499
  stepLabels.push(translations.STEPS.SUMMARY);
18501
18500
  stepLabels.push(translations.STEPS.CONFIRMATION);
18501
+ return stepLabels;
18502
+ };
18503
+
18504
+ const StepIndicators = ({ currentStep }) => {
18505
+ const { flightOptions, roomOptions } = useContext(SettingsContext);
18506
+ const translations = useSelector(selectTranslations);
18507
+ const travelersFirstStep = useSelector(selectTravelersFirstStep);
18508
+ const stepLabels = buildStepLabels({
18509
+ travelersFirstStep,
18510
+ flightOptionsHidden: flightOptions.isHidden,
18511
+ roomOptionsHidden: roomOptions.isHidden,
18512
+ translations
18513
+ });
18502
18514
  return React__default.createElement(StepIndicators$1, { currentStep: currentStep, stepLabels: stepLabels });
18503
18515
  };
18504
18516
 
@@ -18515,22 +18527,12 @@ const StepRoute = ({ number, title, component }) => {
18515
18527
  const { flightOptions, roomOptions } = useContext(SettingsContext);
18516
18528
  const translations = useSelector(selectTranslations);
18517
18529
  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);
18530
+ const stepLabels = buildStepLabels({
18531
+ travelersFirstStep,
18532
+ flightOptionsHidden: flightOptions.isHidden,
18533
+ roomOptionsHidden: roomOptions.isHidden,
18534
+ translations
18535
+ });
18534
18536
  return (React__default.createElement(BookingPanel, { currentStep: number, stepLabels: stepLabels, StepIndicatorsComponent: StepIndicators, renderTitle: (step) => (React__default.createElement(React__default.Fragment, null,
18535
18537
  step + 1,
18536
18538
  ". ",
@@ -21630,6 +21632,7 @@ const Summary = () => {
21630
21632
  const [remarks, setRemarks] = useState('');
21631
21633
  const [voucher, setVoucher] = useState({});
21632
21634
  const bookingQueryString = useSelector(selectBookingQueryString);
21635
+ const travelersFirstStep = useSelector(selectTravelersFirstStep);
21633
21636
  const travelerFormValues = useSelector(selectTravelersFormValues);
21634
21637
  const packageDetails = useSelector(selectPackageDetails);
21635
21638
  const activeOption = useSelector(selectActiveOption);
@@ -21779,7 +21782,7 @@ const Summary = () => {
21779
21782
  dispatch(fetchPriceDetails());
21780
21783
  };
21781
21784
  const goPrevious = () => {
21782
- dispatch(setCurrentStep$1(TRAVELERS_FORM_STEP));
21785
+ dispatch(setCurrentStep$1(travelersFirstStep ? OPTIONS_FORM_STEP : TRAVELERS_FORM_STEP));
21783
21786
  };
21784
21787
  const translations = useSelector(selectTranslations);
21785
21788
  return (React__default.createElement(React__default.Fragment, null,
@@ -21939,7 +21942,7 @@ const Summary = () => {
21939
21942
  __html: checkbox.text
21940
21943
  } }))))))))))),
21941
21944
  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)),
21945
+ 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
21946
  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
21947
  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
21948
  };
@@ -22581,9 +22584,10 @@ const TravelersForm = () => {
22581
22584
  const travelersFirstStep = useSelector(selectTravelersFirstStep);
22582
22585
  const isUnavailable = useSelector(selectIsUnavailable);
22583
22586
  const bookingAttributes = useSelector(selectBookingAttributes);
22584
- const isFetching = useSelector(selectIsFetching);
22585
22587
  const hasMounted = useSelector(selectHasMounted);
22586
22588
  const countries = useSelector(selectCountries);
22589
+ const inFlight = useRef(false);
22590
+ const pendingRefetch = useRef(false);
22587
22591
  const useCompactForm = !!settings.travellers.compactForm && !!settings.agentAdressId;
22588
22592
  const showAllCountries = !!settings.travellers.showAllCountries;
22589
22593
  const initialValues = useSelector(selectTravelersFormValues) ??
@@ -22615,40 +22619,46 @@ const TravelersForm = () => {
22615
22619
  dispatch(fetchPriceDetails());
22616
22620
  }, [dispatch]);
22617
22621
  useEffect(() => {
22618
- if (!bookingAttributes?.rooms?.length || isFetching)
22622
+ if (!bookingAttributes?.rooms?.length)
22619
22623
  return;
22620
22624
  if (!hasMounted) {
22621
22625
  dispatch(setHasMounted(true));
22622
22626
  return;
22623
22627
  }
22628
+ if (inFlight.current) {
22629
+ pendingRefetch.current = true;
22630
+ return;
22631
+ }
22624
22632
  const fetchAll = async () => {
22625
- dispatch(setIsFetching(true));
22633
+ inFlight.current = true;
22626
22634
  try {
22627
- await dispatch(fetchPackage());
22628
- await dispatch(fetchPriceDetails());
22635
+ do {
22636
+ pendingRefetch.current = false;
22637
+ await dispatch(fetchPackage());
22638
+ await dispatch(fetchPriceDetails());
22639
+ } while (pendingRefetch.current);
22629
22640
  }
22630
22641
  finally {
22631
- dispatch(setIsFetching(false));
22642
+ inFlight.current = false;
22632
22643
  }
22633
22644
  };
22634
22645
  fetchAll();
22635
- }, [bookingAttributes?.rooms, dispatch, hasMounted, isFetching]);
22646
+ }, [bookingAttributes?.rooms, dispatch, hasMounted]);
22647
+ const roomsQuery = useMemo(() => formik.values.rooms
22648
+ .map((room) => {
22649
+ const adults = room.adults ? room.adults.length : 0;
22650
+ const childAges = room.children?.length ? room.children.map((child) => child.age).join(',') : '';
22651
+ return `(adults:${adults},childAges:(${childAges}))`;
22652
+ })
22653
+ .join(','), [formik.values.rooms]);
22636
22654
  useEffect(() => {
22637
- if (settings.skipRouter || !travelersFirstStep)
22655
+ if (settings.skipRouter || !travelersFirstStep || !bookingQueryString)
22638
22656
  return;
22639
22657
  const params = new URLSearchParams(bookingQueryString);
22640
22658
  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})`;
22659
+ const nextQuery = `${params.toString()}${params.toString() ? '&' : ''}rooms=(${roomsQuery})`;
22650
22660
  navigate(`${window.location.pathname}?${nextQuery}`, { replace: true });
22651
- }, [formik.values.rooms, bookingQueryString, navigate, settings.skipRouter, travelersFirstStep]);
22661
+ }, [roomsQuery, bookingQueryString, navigate, settings.skipRouter, travelersFirstStep]);
22652
22662
  useEffect(() => {
22653
22663
  if (!agents || !settings.affiliateSlug)
22654
22664
  return;
@@ -22863,10 +22873,17 @@ const Booking = ({ productCode, productName, thumbnailUrl }) => {
22863
22873
  promise.abort();
22864
22874
  };
22865
22875
  }, [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.
22876
+ let numberIndex = 0;
22877
+ const getFirstStep = () => {
22878
+ if (travelersFirstStep)
22879
+ return { path: travellers.pathSuffix, title: translations.STEPS.PERSONAL_DETAILS, component: React__default.createElement(TravelersForm, null) };
22880
+ if (!flightOptions.isHidden && flightOptions.pathSuffix)
22881
+ return { path: flightOptions.pathSuffix, title: translations.STEPS.FLIGHT_OPTIONS, component: React__default.createElement(FlightOptionsForm, null) };
22882
+ if (!roomOptions.isHidden && roomOptions.pathSuffix)
22883
+ return { path: roomOptions.pathSuffix, title: translations.STEPS.ROOM_OPTIONS, component: React__default.createElement(RoomOptionsForm, null) };
22884
+ return { path: options.pathSuffix, title: translations.STEPS.EXTRA_OPTIONS, component: React__default.createElement(OptionsForm, null) };
22885
+ };
22886
+ const firstStep = getFirstStep();
22870
22887
  if (!translationsReady) {
22871
22888
  return null;
22872
22889
  }
@@ -22875,8 +22892,9 @@ const Booking = ({ productCode, productName, thumbnailUrl }) => {
22875
22892
  React__default.createElement("div", { className: "booking__content" },
22876
22893
  React__default.createElement("div", { className: "booking__panel" },
22877
22894
  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) }) })),
22895
+ firstStep.path !== '/' && React__default.createElement(Route, { path: "/", element: React__default.createElement(StepRoute, { number: 0, title: firstStep.title, component: firstStep.component }) }),
22896
+ 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) }) })),
22897
+ !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
22898
  !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
22899
  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
22900
  !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;
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.126",
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",