@roomstay/frontend 2.6.102-5 → 2.6.103-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/dist/177.bundle.js +1 -1
  2. package/dist/211.bundle.js +1 -0
  3. package/dist/288.bundle.js +1 -1
  4. package/dist/326.bundle.js +2 -0
  5. package/dist/326.bundle.js.LICENSE.txt +16 -0
  6. package/dist/328.bundle.js +1 -1
  7. package/dist/main.bundle.js +1 -1
  8. package/dist/src/api/AnalyticsEventsAPI.d.ts +13 -0
  9. package/dist/src/api/AnalyticsEventsAPI.js +55 -0
  10. package/dist/src/api/AnalyticsEventsAPI.js.map +1 -0
  11. package/dist/src/components/generic/PromotionalCodeInput.js +1 -1
  12. package/dist/src/components/generic/PromotionalCodeInput.js.map +1 -1
  13. package/dist/src/components/steps/confirmation/PayPalPaymentOption/PayPalPaymentOption.d.ts +2 -0
  14. package/dist/src/components/steps/confirmation/PayPalPaymentOption/PayPalPaymentOption.js +86 -0
  15. package/dist/src/components/steps/confirmation/PayPalPaymentOption/PayPalPaymentOption.js.map +1 -0
  16. package/dist/src/components/steps/confirmation/RoomContactDetails.js +3 -1
  17. package/dist/src/components/steps/confirmation/RoomContactDetails.js.map +1 -1
  18. package/dist/src/components/steps/confirmation/StepConfirmationCountrySelector.d.ts +2 -1
  19. package/dist/src/components/steps/confirmation/StepConfirmationCountrySelector.js +1 -0
  20. package/dist/src/components/steps/confirmation/StepConfirmationCountrySelector.js.map +1 -1
  21. package/dist/src/components/steps/confirmation/StepConfirmationForm.js +1 -1
  22. package/dist/src/components/steps/confirmation/StepConfirmationForm.js.map +1 -1
  23. package/dist/src/components/steps/date/PeoplePickerRow.js +2 -2
  24. package/dist/src/components/steps/date/PeoplePickerRow.js.map +1 -1
  25. package/dist/src/components/steps/room/RoomListCrossSellBlock.js +1 -0
  26. package/dist/src/components/steps/room/RoomListCrossSellBlock.js.map +1 -1
  27. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.js +2 -2
  28. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.js.map +1 -1
  29. package/dist/src/components/steps/room/roomBuilderProgress/NumberOfAdultsPicker.js +3 -3
  30. package/dist/src/components/steps/room/roomBuilderProgress/NumberOfAdultsPicker.js.map +1 -1
  31. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgress.js +3 -3
  32. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgress.js.map +1 -1
  33. package/dist/src/contexts/BasketContext/BasketContextType.d.ts +3 -0
  34. package/dist/src/contexts/BasketContext/BasketContextType.js.map +1 -1
  35. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +46 -8
  36. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  37. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +9 -0
  38. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
  39. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +21 -3
  40. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
  41. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepErrorModal.d.ts +1 -9
  42. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepErrorModal.js +2 -16
  43. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepErrorModal.js.map +1 -1
  44. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepPriceQuoteErrorModal.d.ts +9 -0
  45. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepPriceQuoteErrorModal.js +67 -0
  46. package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepPriceQuoteErrorModal.js.map +1 -0
  47. package/dist/src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.js +43 -7
  48. package/dist/src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.js.map +1 -1
  49. package/dist/src/handlers/payment/PayPalPaymentHandler.d.ts +2 -0
  50. package/dist/src/handlers/payment/PayPalPaymentHandler.js +41 -0
  51. package/dist/src/handlers/payment/PayPalPaymentHandler.js.map +1 -0
  52. package/dist/src/hooks/AutoFocusOnSelect.d.ts +1 -2
  53. package/dist/src/hooks/AutoFocusOnSelect.js.map +1 -1
  54. package/dist/src/hooks/useSearchScopeHook.d.ts +5 -2
  55. package/dist/src/hooks/useSearchScopeHook.js +57 -14
  56. package/dist/src/hooks/useSearchScopeHook.js.map +1 -1
  57. package/dist/src/models/Addon/Addon.js +4 -0
  58. package/dist/src/models/Addon/Addon.js.map +1 -1
  59. package/dist/src/models/Api/HotelDTO.d.ts +1 -1
  60. package/dist/src/models/Api/HotelDTO.js.map +1 -1
  61. package/dist/src/models/BasketRow.d.ts +5 -0
  62. package/dist/src/models/BasketRow.js +13 -1
  63. package/dist/src/models/BasketRow.js.map +1 -1
  64. package/dist/src/models/Client/Hotel/Hotel.d.ts +11 -0
  65. package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
  66. package/dist/src/pages/findReservation/FindReservationResults.js +2 -2
  67. package/dist/src/pages/findReservation/FindReservationResults.js.map +1 -1
  68. package/dist/src/pages/steps/StepAddon/StepAddonValidator.js +1 -1
  69. package/dist/src/pages/steps/StepAddon/StepAddonValidator.js.map +1 -1
  70. package/dist/src/pages/steps/StepConfirmation/StepConfirmationValidator.js +1 -1
  71. package/dist/src/pages/steps/StepConfirmation/StepConfirmationValidator.js.map +1 -1
  72. package/dist/src/pages/steps/StepRoom/StepRoomValidator.js +1 -1
  73. package/dist/src/pages/steps/StepRoom/StepRoomValidator.js.map +1 -1
  74. package/dist/src/pages/steps/StepThanks/StepThanksComponent.js +2 -2
  75. package/dist/src/pages/steps/StepThanks/StepThanksComponent.js.map +1 -1
  76. package/dist/src/providers/FeatureProvider.js +2 -0
  77. package/dist/src/providers/FeatureProvider.js.map +1 -1
  78. package/dist/src/providers/feature/AnalyticsEventsFeature.d.ts +23 -0
  79. package/dist/src/providers/feature/AnalyticsEventsFeature.js +83 -0
  80. package/dist/src/providers/feature/AnalyticsEventsFeature.js.map +1 -0
  81. package/dist/src/translations/Translation.d.ts +5 -0
  82. package/dist/src/translations/Translation.js +5 -0
  83. package/dist/src/translations/Translation.js.map +1 -1
  84. package/dist/src/translations/languages/en-gb.js +9 -4
  85. package/dist/src/translations/languages/en-gb.js.map +1 -1
  86. package/dist/src/util/AnalyticsEvents/AnalyticsEvents.d.ts +61 -0
  87. package/dist/src/util/AnalyticsEvents/AnalyticsEvents.js +329 -0
  88. package/dist/src/util/AnalyticsEvents/AnalyticsEvents.js.map +1 -0
  89. package/dist/src/util/AnalyticsEvents/helpers.d.ts +30 -0
  90. package/dist/src/util/AnalyticsEvents/helpers.js +96 -0
  91. package/dist/src/util/AnalyticsEvents/helpers.js.map +1 -0
  92. package/dist/test.bundle.js +1 -1
  93. package/dist/vendors.bundle.js +1 -1
  94. package/package.json +3 -2
  95. package/dist/180.bundle.js +0 -1
  96. package/dist/570.bundle.js +0 -1
@@ -105,6 +105,7 @@ function BasketContextWrapper(props) {
105
105
  // Promo code details from availability response
106
106
  const [promoCodeDetails, setPromoCodeDetails] = (0, react_1.useState)(null);
107
107
  const [isLoadingPriceQuote, setIsLoadingPriceQuote] = (0, react_1.useState)(false);
108
+ const [hasPriceQuoteError, setHasPriceQuoteError] = (0, react_1.useState)(false); // If true, showing an error and enabling retry
108
109
  let loadedStartDate = null;
109
110
  let loadedEndDate = null;
110
111
  if ((_d = initialSession === null || initialSession === void 0 ? void 0 : initialSession.basketRows) === null || _d === void 0 ? void 0 : _d.length) {
@@ -276,7 +277,9 @@ function BasketContextWrapper(props) {
276
277
  const availableRow = filteredRows.find((row) => !row.getRate());
277
278
  // Return a row without a rate if found
278
279
  // If no such row exists , return the last row in the list
279
- return availableRow !== null && availableRow !== void 0 ? availableRow : filteredRows[filteredRows.length - 1];
280
+ const nextBasketRow = availableRow !== null && availableRow !== void 0 ? availableRow : filteredRows[filteredRows.length - 1];
281
+ nextBasketRow.normalizeDateRange();
282
+ return nextBasketRow;
280
283
  };
281
284
  const updateQueryParameters = (row) => {
282
285
  if (!row)
@@ -497,12 +500,36 @@ function BasketContextWrapper(props) {
497
500
  setBasketFeeRows(newFees);
498
501
  };
499
502
  const quoteQueryID = (0, react_1.useMemo)(() => {
500
- const requireQuote = (hotel === null || hotel === void 0 ? void 0 : hotel.rmsUseDepositQuote) || (hotel === null || hotel === void 0 ? void 0 : hotel.bookingFlow) !== core_1.EBookingFlow.Default;
503
+ const requireQuote = (hotel === null || hotel === void 0 ? void 0 : hotel.rmsUseDepositQuote) || (hotel === null || hotel === void 0 ? void 0 : hotel.bookingFlow) === core_1.EBookingFlow.PreCheckoutPencil;
501
504
  if (!hotel || !requireQuote) {
502
505
  return '';
503
506
  }
504
507
  return BookingAPI_1.default.Reservation.buildQuoteQueryID(currentBasketRows, isExternalMemberHotel ? memberNumber : undefined);
505
508
  }, [currentBasketRows, isExternalMemberHotel, memberNumber, hotel === null || hotel === void 0 ? void 0 : hotel.hotelID]);
509
+ /**
510
+ * Indicates whether required pricing data is ready.
511
+ *
512
+ * - Returns `true` when the hotel does not require a quote.
513
+ * - While a quote is loading, verifies all basket rows contain
514
+ * the required pricing data (`quoteDetails` or `pencilId`).
515
+ * - Used to block UI actions until pricing is ready.
516
+ */
517
+ const isQuoteOrPencilReady = (0, react_1.useMemo)(() => {
518
+ const requireQuote = !!(hotel === null || hotel === void 0 ? void 0 : hotel.rmsUseDepositQuote) || !!((hotel === null || hotel === void 0 ? void 0 : hotel.bookingFlow) && (hotel === null || hotel === void 0 ? void 0 : hotel.bookingFlow) == core_1.EBookingFlow.PreCheckoutPencil);
519
+ const isLoadedQuoteOrPencil = currentBasketRows.every((basketRow) => {
520
+ if ((hotel === null || hotel === void 0 ? void 0 : hotel.bookingFlow) === core_1.EBookingFlow.PreCheckoutPencil) {
521
+ return !!basketRow.pencilId;
522
+ }
523
+ if (hotel === null || hotel === void 0 ? void 0 : hotel.rmsUseDepositQuote) {
524
+ return !!basketRow.quoteDetails;
525
+ }
526
+ return true;
527
+ });
528
+ if (!hotel || !requireQuote || (requireQuote && !isLoadingPriceQuote && isLoadedQuoteOrPencil)) {
529
+ return true;
530
+ }
531
+ return false;
532
+ }, [isLoadingPriceQuote, hotel === null || hotel === void 0 ? void 0 : hotel.rmsUseDepositQuote, hotel === null || hotel === void 0 ? void 0 : hotel.bookingFlow, currentBasketRows]);
506
533
  /**
507
534
  * Calculate total price of all addons with promo code discounts applied.
508
535
  * Uses AddonDiscountCalculator to handle sequential discount allocation.
@@ -510,6 +537,10 @@ function BasketContextWrapper(props) {
510
537
  const calculateAddonTotalWithDiscounts = (0, react_1.useCallback)(() => {
511
538
  return AddonDiscountCalculator_1.AddonDiscountCalculator.calculateTotal(basketAddonRows, currentBasketRows, promoCodeDetails);
512
539
  }, [basketAddonRows, currentBasketRows, promoCodeDetails]);
540
+ // Whether another room can be added (within max rooms per booking limit)
541
+ const canAddAnotherRoom = (0, react_1.useMemo)(() => {
542
+ return !(hotel === null || hotel === void 0 ? void 0 : hotel.maxRoomsPerBooking) || (hotel === null || hotel === void 0 ? void 0 : hotel.maxRoomsPerBooking) > currentBasketRows.length;
543
+ }, [hotel === null || hotel === void 0 ? void 0 : hotel.maxRoomsPerBooking, currentBasketRows.length]);
513
544
  const workingContext = {
514
545
  startDate: startDate,
515
546
  endDate: endDate,
@@ -541,6 +572,8 @@ function BasketContextWrapper(props) {
541
572
  * @param {BasketRow} row - The basket row to add.
542
573
  */
543
574
  addBasketRow: (row) => {
575
+ if (!canAddAnotherRoom)
576
+ return;
544
577
  syncSelectedDateRange(row);
545
578
  checkAndApplyMemberOnlyPromo(row);
546
579
  // Determine if the basket is currently empty
@@ -675,6 +708,7 @@ function BasketContextWrapper(props) {
675
708
  return false;
676
709
  }
677
710
  setIsLoadingPriceQuote(true);
711
+ setHasPriceQuoteError(false);
678
712
  // Clear currently assigned quote details
679
713
  // If we're fetching basket row information the currently held info should be disregarded.
680
714
  currentBasketRows.forEach((row) => {
@@ -693,24 +727,23 @@ function BasketContextWrapper(props) {
693
727
  if ((hotel === null || hotel === void 0 ? void 0 : hotel.bookingFlow) === core_1.EBookingFlow.PreCheckoutPencil) {
694
728
  // Pencil call also passes back the quote (if applicable)
695
729
  pencilResponse = response;
730
+ // Important: When `hotel?.rmsUseDepositQuote` is false, `pencilResponse.quote` is always null
696
731
  quoteResponse = pencilResponse.quote;
697
732
  // Store parent pencil ID to pass back to the server later
698
733
  setPencilId(pencilResponse.pencilId);
699
734
  (_a = beContext.sessionProvider) === null || _a === void 0 ? void 0 : _a.updateSession({ pencilId: pencilResponse.pencilId });
700
735
  // Future improvement: Handle availability errors
701
736
  }
702
- else {
737
+ else if (hotel.rmsUseDepositQuote) {
703
738
  quoteResponse = response;
704
739
  }
705
- if (!quoteResponse) {
706
- return;
707
- }
708
740
  if (!applyQuote()) {
709
741
  // User has left the Confirmation step before the quote was ready, we'll stop here instead of updating the basket.
710
742
  // If we don't stop here, the user will be redirected back to the Confirmation step.
711
743
  setIsLoadingPriceQuote(false);
712
744
  return;
713
745
  }
746
+ // Ensure pencilId is assigned even when quoteResponse is not available
714
747
  for (const basketRow of currentBasketRows) {
715
748
  const quoteRow = (_b = quoteResponse === null || quoteResponse === void 0 ? void 0 : quoteResponse.rows) === null || _b === void 0 ? void 0 : _b.find((row) => row.rowId === basketRow.getID());
716
749
  const pencilRow = (_c = pencilResponse === null || pencilResponse === void 0 ? void 0 : pencilResponse.rows) === null || _c === void 0 ? void 0 : _c.find((row) => row.rowId === basketRow.getID());
@@ -723,6 +756,7 @@ function BasketContextWrapper(props) {
723
756
  updateBasketRow(basketRow);
724
757
  }
725
758
  }, (error) => {
759
+ setHasPriceQuoteError(true);
726
760
  console.log(error);
727
761
  console.log(`Error!: Retried ${maxRetryAttempts} times then quit!`);
728
762
  }, () => {
@@ -740,6 +774,9 @@ function BasketContextWrapper(props) {
740
774
  getAllDatelessRows: () => {
741
775
  return currentBasketRows.filter((item) => !item.getStartDate() || !item.getEndDate());
742
776
  },
777
+ isValidDateRange: () => {
778
+ return !!startDate && !!endDate && startDate.isBefore(endDate);
779
+ },
743
780
  getNumberOfAdults: (withTranslation = false) => {
744
781
  return returnAggregationAndTranslation((row) => row.getAdults(), withTranslation ? Translation_1.Translation.Step.Date.Adult : undefined);
745
782
  },
@@ -1055,8 +1092,9 @@ function BasketContextWrapper(props) {
1055
1092
  },
1056
1093
  // Indicates whether the DatePicker is currently open.
1057
1094
  isDatePickerOpen: isDatePickerOpen,
1058
- // Whether another room can be added (within max rooms per booking limit)
1059
- canAddAnotherRoom: !(hotel === null || hotel === void 0 ? void 0 : hotel.maxRoomsPerBooking) || (hotel === null || hotel === void 0 ? void 0 : hotel.maxRoomsPerBooking) > currentBasketRows.length,
1095
+ canAddAnotherRoom: canAddAnotherRoom,
1096
+ hasPriceQuoteError: hasPriceQuoteError,
1097
+ isQuoteOrPencilReady: isQuoteOrPencilReady,
1060
1098
  };
1061
1099
  return (react_1.default.createElement(contexts_1.BasketContext.Provider, { value: workingContext },
1062
1100
  react_1.default.createElement(contexts_1.AuthenticationContextProvider, null,
@@ -1 +1 @@
1
- {"version":3,"file":"BasketContextWrapper.js","sourceRoot":"/","sources":["src/contexts/BasketContext/BasketContextWrapper.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AuthenticationContextProvider,\n BasketContext,\n BasketContextType,\n BookingEngineContext,\n ErrorHandler,\n HotelOverridesContext,\n NotificationContext,\n} from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport {\n calculateFeeAmount,\n EAddonPricingType,\n EBookingFlow,\n EFeeType,\n EGuaranteePolicyDepositMode,\n getFilteredBookingAddonFees,\n getFilteredBookingFees,\n getFilteredBookingRateFees,\n IBookingQuoteResponse,\n IPaymentCheckoutDetails,\n IPencilReservationResponse,\n IPromoCodeDetails,\n ReservationsDTO,\n Warning,\n} from '@roomstay/core';\nimport { API_DATE_FORMAT } from 'api/BaseAPI';\nimport dayjs, { Dayjs } from 'dayjs';\nimport { BasketContextErrorHandler } from 'handlers/BasketContextErrorHandler';\nimport { useHistoryConsistentPush } from 'hooks/HistoryConsistentPush';\nimport { useUpdateQueryParameters } from 'hooks/UpdateQueryParameters';\nimport { EAppQueryParameters } from 'models/AppQueryParameters';\nimport React, { useCallback, useContext, useEffect, useMemo, useReducer, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom';\nimport { BasketReducer } from 'reducers/BasketReducer';\nimport { defer, Observable, throwError, timer } from 'rxjs';\nimport { finalize, mergeMap, retryWhen } from 'rxjs/operators';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport Text from '@/components/generic/Text';\nimport { MemberSignInModal } from '@/components/members/SignInModal/MemberSignInModal';\nimport { PromoCodeVerificationAlert } from '@/components/steps/room/UserSearchSummary/PromoCodeVerificationAlert';\nimport { useConfirmationQuery } from '@/hooks/ConfirmationQuery';\nimport { useSignedInMember } from '@/hooks/useSignedInMember';\nimport { Addon } from '@/models/Addon/Addon';\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport BasketRow, { EPromoCodeStatus } from '@/models/BasketRow';\nimport { accumulateFees, feeMapToArray, HotelFee, ItemisedFee, sortFees } from '@/models/Fee';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport { RoomstaySession } from '@/models/RoomstaySession';\nimport StepAddon from '@/pages/steps/StepAddon/StepAddon';\nimport StepThanks from '@/pages/steps/StepThanks/StepThanks';\nimport InlineAddonStepFeature from '@/providers/feature/InlineAddonStepFeature';\nimport { usePromotionContainer } from '@/providers/PromotionProvider';\nimport { getQueryParamFromHash } from '@/util/CalendarHelper';\nimport DataLayer from '@/util/DataLayer';\nimport { debounce } from '@/util/Debounce';\nimport getStepRoom from '@/util/GetStepRoom';\nimport StepManager from '@/util/StepManager';\nimport StringHelper from '@/util/StringHelper';\nimport { AddonDiscountCalculator } from '@/utils/AddonDiscountCalculator';\n\nexport interface BasketContextWrapperProps {\n children: React.ReactNode;\n}\n\nexport function BasketContextWrapper(props: BasketContextWrapperProps) {\n const { t } = useTranslation();\n const { hotel } = useCurrentHotel();\n const updateQueryParams = useUpdateQueryParameters();\n const { isInitialCheckout } = useConfirmationQuery();\n const navigate = useNavigate();\n const historyConsistentPush = useHistoryConsistentPush();\n const { signedInUser, isExternalMemberHotel, memberNumber, memberOnlyModalPromotion } = useSignedInMember();\n\n const notifications = useContext(NotificationContext);\n const beContext = useContext(BookingEngineContext);\n\n const { showPromoCodeAlert } = useContext(HotelOverridesContext);\n\n const initialSession = beContext?.engine?.getInitialSession();\n\n const [currentBasketRows, basketRowReducer] = useReducer(BasketReducer, initialSession?.basketRows ?? []);\n const [pencilId, setPencilId] = useState<string | undefined>(initialSession?.pencilId ?? undefined);\n\n const [selectedBasketRow, setSelectedBasketRow] = useState<BasketRow | null>(null);\n const [basketAddonRows, setBasketAddonRows] = useState<BasketAddonRow[]>([]);\n\n // This is where we store the fees that aren't included in the rates/addons.\n const [basketFeeRows, setBasketFeeRows] = useState<ItemisedFee[]>([]);\n\n // Promo code details from availability response\n const [promoCodeDetails, setPromoCodeDetails] = useState<IPromoCodeDetails | null>(null);\n\n const [isLoadingPriceQuote, setIsLoadingPriceQuote] = useState(false);\n\n let loadedStartDate: dayjs.Dayjs | null = null;\n let loadedEndDate: dayjs.Dayjs | null = null;\n\n if (initialSession?.basketRows?.length) {\n loadedStartDate = initialSession.basketRows[0].getStartDate();\n loadedEndDate = initialSession.basketRows[0].getEndDate();\n } else {\n if (initialSession?.startDate) {\n loadedStartDate = initialSession.startDate;\n }\n\n if (initialSession?.endDate) {\n loadedEndDate = initialSession.endDate;\n }\n }\n\n const [isDatePickerOpen, setIsDatePickerOpen] = useState<boolean>(false);\n const [startDate, setStartDate] = useState<dayjs.Dayjs | null>(loadedStartDate ?? null);\n const [endDate, setEndDate] = useState<dayjs.Dayjs | null>(loadedEndDate ?? null);\n\n const [hasCheckedOut, setHasCheckedOut] = useState(false);\n const [reservationData, setReservationData] = useState<ReservationsDTO | null>(initialSession?.reservation || null);\n\n const [knownErrorPromoCodes, setKnownErrorPromoCodes] = useState<string[]>([]);\n\n /**\n * Handles availability warnings related to promo codes.\n * Updates basket rows if a promo code is invalid, and logs other warnings.\n *\n * @param warnings - List of warning messages.\n */\n BasketContextErrorHandler.handleAvailabilityWarnings = (warnings: Warning<string>[]) => {\n warnings.forEach((warning: Warning<string>) => {\n if (warning.type === 'PromoCode') {\n // PromoCode warning message\n handleParsedPromoCodeWarning(warning);\n } else {\n // Unexpected warning message\n ErrorHandler.add({ message: warning.message });\n }\n });\n };\n\n function handleParsedPromoCodeWarning(warning: Warning<string>) {\n const promoCode = warning.data;\n if (!promoCode) return;\n updatePromoCodeRows(promoCode, warning.message);\n addPromoCodeToKnownErrors(promoCode);\n }\n\n function updatePromoCodeRows(promoCode: string, message: string) {\n currentBasketRows.forEach((row) => {\n if (promoCode.toLowerCase() === row.getPromoCode().toLowerCase()) {\n row.setPromoCodeStatus(EPromoCodeStatus.Invalid, message);\n workingContext.updateBasketRow(row, false);\n }\n });\n }\n\n function addPromoCodeToKnownErrors(promoCode: string) {\n const upperPromo = promoCode.toUpperCase();\n if (!knownErrorPromoCodes.includes(upperPromo)) {\n setKnownErrorPromoCodes((oldCodes) => [...oldCodes, upperPromo]);\n }\n }\n\n BasketContextErrorHandler.handlePromoSuccess = (promo: string, oneTimeUseOnly?: boolean) => {\n let foundFirstValid = false;\n\n currentBasketRows.forEach((row) => {\n if (row.getPromoCode() === promo && row.getPromoCode()) {\n if (foundFirstValid && oneTimeUseOnly) {\n row.setPromoCodeStatus(EPromoCodeStatus.Forbidden, 'This promo code can only be used on one room.');\n workingContext.updateBasketRow(row, false);\n return;\n }\n\n if (row.getPromoCodeStatus() === EPromoCodeStatus.Valid) {\n foundFirstValid = true;\n return;\n }\n\n row.setPromoCodeStatus(EPromoCodeStatus.Valid);\n workingContext.updateBasketRow(row, false);\n foundFirstValid = true;\n }\n });\n };\n\n // Handles availability warnings related to promo codes end\n\n const debounceUseEffect = useCallback(\n debounce(() => {\n if (!startDate || !endDate) {\n return;\n }\n\n if (isInitialCheckout) {\n DataLayer.instance.sendDateSelection({\n startDate,\n endDate,\n adult: selectedBasketRow?.getAdults(),\n children: selectedBasketRow?.getChildren(),\n infant: selectedBasketRow?.getInfants(),\n });\n }\n\n beContext.sessionProvider?.updateSession({\n startDate,\n endDate,\n });\n\n // TODO re-visit this as we don't want to set dates for everything constantly\n workingContext.getAllDatelessRows().forEach((row: BasketRow) => {\n row.setStartDate(startDate);\n row.setEndDate(endDate);\n\n workingContext.updateBasketRow(row);\n });\n\n //When trying to call row.discardGuestsState() in somewhere, we got conflicted here with BasketRow.setStartDate& BasketRow.setEndDate, it set back to previous startDate/endDate\n //Use debounceUseEffect to fix it\n if (selectedBasketRow) {\n selectedBasketRow.setStartDate(startDate);\n selectedBasketRow.setEndDate(endDate);\n\n workingContext.updateBasketRow(selectedBasketRow, false);\n } else if (currentBasketRows.length === 1) {\n const onlyBasketRow = currentBasketRows[0];\n onlyBasketRow.setStartDate(startDate);\n onlyBasketRow.setEndDate(endDate);\n\n workingContext.updateBasketRow(onlyBasketRow, false);\n }\n }, 500),\n [startDate, endDate]\n );\n\n useEffect(() => {\n debounceUseEffect();\n }, [debounceUseEffect]);\n\n useEffect(() => {\n if (signedInUser) {\n const memberPromoCode = signedInUser.promoCode || (hotel?.memberOnlyPromoCode as string);\n\n const urlPromoCode = getQueryParamFromHash(EAppQueryParameters.PromoCode);\n const allowDefaultMemberPromo = memberPromoCode && !memberOnlyModalPromotion?.memberOnlyDisableDefaultPromo;\n\n currentBasketRows?.forEach((row) => {\n // Only set promo code if row doesn't already have one\n if (row.getPromoCode()) return;\n\n // Determine the default promo code using precedence:\n const promoToApply = urlPromoCode || (allowDefaultMemberPromo ? memberPromoCode : null);\n\n if (promoToApply) {\n row.setPromoCode(promoToApply);\n updateBasketRow(row);\n }\n });\n }\n }, [signedInUser, hotel?.memberOnlyPromoCode]);\n\n useEffect(() => {\n beContext.sessionProvider?.updateSession({ basketRows: currentBasketRows });\n }, [currentBasketRows, selectedBasketRow]);\n\n useEffect(() => {\n updateBasketFeeRows();\n }, [currentBasketRows, basketAddonRows]);\n\n const checkAndApplyMemberOnlyPromo = (row: BasketRow, skipUpdate = false) => {\n if (row && hotel?.memberOnlyPromoCode && signedInUser && !row.getPromoCode()) {\n row.setPromoCode(hotel.memberOnlyPromoCode);\n\n if (!skipUpdate) {\n workingContext.updateBasketRow(row);\n }\n }\n };\n\n const returnAggregationAndTranslation = (reduction: ((row: BasketRow) => number) | number, translation?: string) => {\n const count = typeof reduction === 'number' ? reduction : currentBasketRows.reduce((total, row) => total + reduction(row), 0);\n\n if (translation) {\n return StringHelper.pluralWithDictAndCount(count, translation, t);\n } else {\n return count;\n }\n };\n\n const getNextAvailableBasketRow = (deletedBasketRow?: BasketRow): BasketRow | null => {\n if (!currentBasketRows.length) return null;\n // Filter out the excluded basket row if provided\n const filteredRows = deletedBasketRow ? currentBasketRows.filter((row) => row.getID() !== deletedBasketRow.getID()) : currentBasketRows;\n\n // Find the first row that does not have a rate assigned\n const availableRow = filteredRows.find((row) => !row.getRate());\n\n // Return a row without a rate if found\n // If no such row exists , return the last row in the list\n return availableRow ?? filteredRows[filteredRows.length - 1];\n };\n\n const updateQueryParameters = (row: BasketRow | null) => {\n if (!row) return;\n const queryParameters: Record<string, string> = {};\n if (row.getEndDate()) {\n let startDate = selectedBasketRow?.getStartDate();\n if (!startDate) {\n startDate = row.getStartDate();\n }\n queryParameters[EAppQueryParameters.Arrive] = startDate.format(API_DATE_FORMAT);\n queryParameters[EAppQueryParameters.Depart] = row.getEndDate().format(API_DATE_FORMAT);\n }\n if (row.getPromoCode()) queryParameters[EAppQueryParameters.PromoCode] = row.getPromoCode();\n if (row.getChildren() !== undefined) queryParameters[EAppQueryParameters.Children] = row.getChildren().toString();\n if (row.getAdults() !== undefined) queryParameters[EAppQueryParameters.Adults] = row.getAdults().toString();\n\n updateQueryParams(queryParameters);\n };\n\n const updateBasketRow = (row: BasketRow, updateGlobalDates = true) => {\n updateQueryParameters(row);\n\n if (updateGlobalDates && row.getID() === selectedBasketRow?.getID()) {\n setStartDate(row.getStartDate());\n setEndDate(row.getEndDate());\n }\n\n // Here we check if there is no promocode on the row. If there isn't this function will check for existing member details\n // and automatically apply a member only promocode\n checkAndApplyMemberOnlyPromo(row, true);\n\n // Update promo code details from availability cache\n const promoCode = row.getPromoCode();\n if (promoCode) {\n const promoDetails = API.Availability.getPromoCodeDetails(promoCode);\n if (promoDetails) {\n setPromoCodeDetails(promoDetails);\n }\n } else {\n // Clear promo details if no promo code\n setPromoCodeDetails(null);\n }\n\n basketRowReducer({ method: 'Update', row });\n };\n\n const syncSelectedDateRange = (row?: BasketRow) => {\n if (!row) return;\n if ((!row.getStartDate() || !row.getEndDate()) && startDate && endDate) {\n row.setStartDate(startDate);\n row.setEndDate(endDate);\n } else if (!startDate && !endDate && row.getStartDate() && row.getEndDate()) {\n setStartDate(row.getStartDate());\n setEndDate(row.getEndDate());\n }\n };\n\n const { loadedPromotion } = usePromotionContainer({ selectedBasketRow: selectedBasketRow as BasketRow, updateBasketRow });\n\n const genericRetryStrategy =\n ({\n maxRetryAttempts = 3,\n scalingDuration = 0,\n }: {\n maxRetryAttempts?: number;\n scalingDuration?: number;\n } = {}) =>\n (attempts: Observable<any>) => {\n return attempts.pipe(\n mergeMap((error, i) => {\n const retryAttempt = i + 1;\n if (retryAttempt > maxRetryAttempts) {\n return throwError(error);\n }\n console.log(`Attempt ${retryAttempt}: retrying in ${scalingDuration}ms`);\n return timer(scalingDuration);\n }),\n finalize(() => console.log('We are done!'))\n );\n };\n\n /**\n * Booking Fees.\n * These fees aren't related to an addon or a room, they're just on the booking itself.\n */\n const getBookingFees = () => {\n const hotelFees = hotel?.fees ?? [];\n const newFees: ItemisedFee[] = [];\n let totalBookingFees = 0;\n\n for (const fee of getFilteredBookingFees(hotelFees)) {\n const feeAmount = calculateFeeAmount(fee);\n\n newFees.push({ hotelFee: fee, amount: feeAmount });\n totalBookingFees += feeAmount;\n }\n\n // We need to add percentage fees on top of the Booking Fees, if the percentage fee is configured to include previous fees in calculation.\n if (totalBookingFees > 0) {\n let baseAmount = totalBookingFees;\n\n for (const fee of hotelFees.filter((fee) => fee.feeType === EFeeType.PercentageOfBooking && fee.includePreviousFeesInCalculation && !fee.extractFeeFromRates)) {\n const feeAmount = calculateFeeAmount(fee, {\n baseAmount,\n });\n\n console.log(`Booking Fees: Calculated ${fee.name} fee amount on ${baseAmount} = ${feeAmount}`);\n newFees.push({ hotelFee: fee, amount: feeAmount });\n baseAmount += feeAmount;\n }\n }\n\n return newFees;\n };\n\n const getBookingRateFees = (row: BasketRow) => {\n const hotelFees = hotel?.fees ?? [];\n const newFees: ItemisedFee[] = [];\n const initialCost = row.getTotalPrice(true) ?? 0;\n let totalFeesAdded = 0;\n let totalFeesIncludedInRates = 0;\n\n const rateFees = getFilteredBookingRateFees(hotelFees);\n\n // In order to calculate fees that were removed from the incoming rates using extractFeeFromRates option, we need\n // to know which fees were removed. When there's more than 1 percentage fee that's been removed, we can't\n // work backwards to figure out what the original price was without this.\n const removedPercentages = rateFees.filter((fee) => fee.extractFeeFromRates).map((fee) => fee.amount);\n\n for (const fee of rateFees) {\n if (fee.extractFeeFromRates || fee.includeInRates) {\n // For these fees, we need to add the amount to the the totalFeesIncludedInRates variable, so that we can\n // correctly calculate subsequent fees that are using the 'extractFeeFromRates' option.\n const baseAmount = fee.extractFeeFromRates ? initialCost : initialCost + totalFeesIncludedInRates;\n totalFeesIncludedInRates += calculateFeeAmount(fee, {\n baseAmount,\n numberOfNights: row.getNumberOfDays(),\n extractedFromRates: fee.extractFeeFromRates,\n removedPercentages,\n });\n }\n\n let feeCalculationBaseAmount: number;\n if (fee.extractFeeFromRates) {\n // If this fee is included in the rates, there's no additional fee to calculate.\n feeCalculationBaseAmount = fee.includeInRates ? 0 : initialCost;\n } else if (fee.includeInRates) {\n // These fees are already included in the rates, we only need to calculate \"fees on fees\" if applicable.\n if (!fee.includePreviousFeesInCalculation) {\n continue;\n }\n\n feeCalculationBaseAmount = totalFeesAdded;\n } else {\n // This fee either needs to include the full running total, or just the initial cost.\n feeCalculationBaseAmount = fee.includePreviousFeesInCalculation ? initialCost + totalFeesAdded + totalFeesIncludedInRates : initialCost;\n }\n\n const feeAmount = calculateFeeAmount(fee, {\n baseAmount: feeCalculationBaseAmount,\n numberOfNights: row.getNumberOfDays(),\n extractedFromRates: fee.extractFeeFromRates,\n removedPercentages,\n });\n\n newFees.push({ hotelFee: fee, amount: feeAmount });\n\n if (!fee.extractFeeFromRates) {\n totalFeesAdded += feeAmount;\n }\n }\n\n return newFees;\n };\n\n const getBookingAddonFees = () => {\n const hotelFees = hotel?.fees ?? [];\n const newFees: ItemisedFee[] = [];\n const validBasketAddonRows = basketAddonRows.filter((row) => row.isValid());\n for (const row of validBasketAddonRows) {\n const initialCost = row.getTotalPrice() - row.getTotalFees();\n let totalFeesAdded = 0;\n let totalFeesIncludedInRates = 0;\n\n const addonFees = getFilteredBookingAddonFees(hotelFees).filter((fee) => fee.appliesToAddons);\n const removedPercentages = addonFees.filter((fee) => fee.extractFeeFromRates).map((fee) => fee.amount);\n\n const hasItemisedFees = row.getItemisedFees(hotelFees).length > 0;\n\n for (const fee of addonFees) {\n if ((fee.extractFeeFromRates || fee.includeInRates) && hasItemisedFees) {\n const baseAmount = fee.extractFeeFromRates ? initialCost : initialCost + totalFeesIncludedInRates;\n totalFeesIncludedInRates += calculateFeeAmount(fee, {\n baseAmount,\n numberOfNights: row.getNightModifier(),\n extractedFromRates: fee.extractFeeFromRates,\n removedPercentages,\n });\n }\n\n let feeCalculationBaseAmount: number;\n if (fee.extractFeeFromRates) {\n feeCalculationBaseAmount = fee.includeInRates && hasItemisedFees ? 0 : initialCost;\n } else if (fee.includeInRates && hasItemisedFees) {\n feeCalculationBaseAmount = fee.includePreviousFeesInCalculation ? totalFeesAdded : 0;\n } else {\n feeCalculationBaseAmount = fee.includePreviousFeesInCalculation ? initialCost + totalFeesAdded + totalFeesIncludedInRates : initialCost;\n }\n\n const feeAmount = calculateFeeAmount(fee, {\n baseAmount: feeCalculationBaseAmount,\n numberOfNights: row.getNightModifier(),\n extractedFromRates: fee.extractFeeFromRates && !fee.includeInRates,\n removedPercentages,\n });\n\n newFees.push({ hotelFee: fee, amount: feeAmount });\n\n if (!fee.extractFeeFromRates) {\n totalFeesAdded += feeAmount;\n }\n }\n }\n\n return newFees;\n };\n\n const updateBasketFeeRows = () => {\n const validBasketRows = currentBasketRows?.filter((row) => row.isValid());\n\n if (!validBasketRows.length || !hotel?.fees) {\n setBasketFeeRows([]);\n return;\n }\n\n const newFees: ItemisedFee[] = [];\n\n /**\n * Booking Fees.\n * These fees aren't related to an addon or a room, they're just on the booking itself.\n */\n newFees.push(...getBookingFees());\n\n /**\n * Booking Rate Fees.\n */\n for (const row of validBasketRows) {\n const rateFees = getBookingRateFees(row);\n newFees.push(...rateFees);\n }\n\n /**\n * Booking Addon Fees.\n */\n newFees.push(...getBookingAddonFees());\n\n setBasketFeeRows(newFees);\n };\n\n const quoteQueryID: string = useMemo(() => {\n const requireQuote = hotel?.rmsUseDepositQuote || hotel?.bookingFlow !== EBookingFlow.Default;\n\n if (!hotel || !requireQuote) {\n return '';\n }\n\n return API.Reservation.buildQuoteQueryID(currentBasketRows, isExternalMemberHotel ? memberNumber : undefined);\n }, [currentBasketRows, isExternalMemberHotel, memberNumber, hotel?.hotelID]);\n\n /**\n * Calculate total price of all addons with promo code discounts applied.\n * Uses AddonDiscountCalculator to handle sequential discount allocation.\n */\n const calculateAddonTotalWithDiscounts = useCallback((): number => {\n return AddonDiscountCalculator.calculateTotal(basketAddonRows, currentBasketRows, promoCodeDetails);\n }, [basketAddonRows, currentBasketRows, promoCodeDetails]);\n\n const workingContext: BasketContextType = {\n startDate: startDate as Dayjs,\n endDate: endDate as Dayjs,\n\n selectedBasketRow: selectedBasketRow as BasketRow,\n currentBasketRows,\n basketAddonRows,\n\n basketFeeRows,\n updateBasketFeeRows,\n\n hasCheckedOut,\n reservationData: reservationData as ReservationsDTO,\n isLoadingPriceQuote,\n\n loadedPromotion,\n promoCodeDetails,\n quoteQueryID,\n pencilId,\n\n /**\n * Adds a new basket row and applies relevant updates:\n * - Synchronizes the selected date range.\n * - Applies any applicable member-only promotions.\n * - Ensures proper selection logic for the basket row.\n *\n * Selection logic:\n * - If the basket is empty, the newly added row is automatically selected.\n * - If a row is already selected:\n * - If the selected row has an assigned rate, update the selection to the new row.\n * - Otherwise, keep the current selection (allowing continued editing of the existing row).\n * - If no row is selected, set the new row as the selected row.\n *\n * @param {BasketRow} row - The basket row to add.\n */\n addBasketRow: (row: BasketRow) => {\n syncSelectedDateRange(row);\n checkAndApplyMemberOnlyPromo(row);\n\n // Determine if the basket is currently empty\n const isEmptyRows = !currentBasketRows.length;\n if (isEmptyRows) {\n // If empty, set the newly added row as the selected basket row\n setSelectedBasketRow(row);\n } else {\n if (selectedBasketRow) {\n // Determine if the currently selected row has an assigned rate\n const isSelectedRowAssignedRate = selectedBasketRow && selectedBasketRow.getRate();\n if (isSelectedRowAssignedRate) {\n // If the selected row has a rate, update the selection to the new row\n setSelectedBasketRow(row);\n }\n } else {\n // If no row is currently selected, set the new row as the selected basket row\n setSelectedBasketRow(row);\n }\n }\n basketRowReducer({ method: 'Add', row });\n },\n\n initBasketRows: (rows: BasketRow[]) => {\n const firstRow = rows[0];\n syncSelectedDateRange(firstRow);\n setSelectedBasketRow(firstRow);\n basketRowReducer({\n method: 'Init',\n rows: rows,\n });\n },\n\n //TODO: This function needs to be refactored to simplify a lot of this logic, and move notification raising to use the Event Manager instead\n addRate: async (rate: RoomRate, notify = true) => {\n let basketRow: BasketRow | null = null;\n let translationString: string;\n\n let addons = [];\n\n if (selectedBasketRow) {\n selectedBasketRow.setPreGuestsState();\n basketRow = selectedBasketRow;\n if (selectedBasketRow.getRate()) {\n translationString = Translation.Misc.RoomUpdatedNotification;\n } else {\n if (!selectedBasketRow.getStartDate() && selectedBasketRow.getEndDate()) {\n selectedBasketRow.setStartDate(startDate as Dayjs);\n selectedBasketRow.setEndDate(endDate as Dayjs);\n }\n\n translationString = Translation.Misc.RoomAddedNotification;\n }\n } else {\n if (!startDate || !endDate) {\n console.error('room selected with no date values.');\n return;\n }\n\n basketRow = new BasketRow(rate);\n\n basketRow.setStartDate(startDate);\n basketRow.setEndDate(endDate);\n\n translationString = Translation.Misc.RoomAddedNotification;\n }\n\n if (InlineAddonStepFeature.isActive()) {\n basketRow.setRate(rate); // TODO: Fix quick hack to make the Addons load\n addons = await API.Addons.findAddons([basketRow], hotel?.hotelID as string);\n }\n\n basketRow.setAuxiliaryFilter(beContext.currentGroupedRoomFilters);\n beContext.setCurrentGroupedRoomFilters({});\n\n basketRowReducer({ method: 'AddRate', rate, row: basketRow });\n\n // Update promo code details from availability cache\n if (rate.promoCode) {\n const promoDetails = API.Availability.getPromoCodeDetails(rate.promoCode);\n if (promoDetails) {\n setPromoCodeDetails(promoDetails);\n }\n } else {\n // Clear promo details if no promo code\n setPromoCodeDetails(null);\n }\n\n try {\n DataLayer.instance.sendRoomRateAddToCart(\n rate,\n basketRow.getNumberOfDays(),\n startDate ?? basketRow.getStartDate(),\n endDate ?? basketRow.getEndDate(),\n basketRow.getPreUpsellRoomRate()\n );\n } catch (ex) {\n console.log('Failed recording basket Add event');\n }\n\n if (notify) {\n notifications.addNotification({\n icon: IconType.Bed,\n children: (\n <Text inline>\n {t(translationString)} <strong className=\"u-marg-left--light\">{rate.getRoom().name}</strong>\n </Text>\n ),\n });\n }\n\n const nextAvailable = getNextAvailableBasketRow();\n if (!nextAvailable?.getRate()) {\n // If the next available row does not have a rate assigned,\n // set it as the selected basket row to allow rate assignment.\n setSelectedBasketRow(nextAvailable);\n } else {\n // If all rows already have a rate assigned\n // Set the selected basket row to null, ensuring that no row is selected for editing.\n setSelectedBasketRow(null);\n\n // Determine whether the next step is an add-on selection step.\n const isNextStepAddon = StepManager.getNextStepUrl(getStepRoom()) === StepAddon.getStepUrl();\n\n if (isNextStepAddon) {\n if (addons.length) {\n historyConsistentPush(StepAddon.getStepUrl());\n } else {\n historyConsistentPush(StepManager.getNextStepUrl(StepAddon));\n }\n } else {\n historyConsistentPush(StepManager.getNextStepUrl(getStepRoom()));\n }\n }\n },\n\n quoteOrPencilReservation: (applyQuote) => {\n const maxRetryAttempts = 1;\n let callApi: (hotelId: string, rows: BasketRow[], memberNumber?: string, pencilId?: string) => Promise<IBookingQuoteResponse | IPencilReservationResponse>;\n\n // To avoid multiple requests, pencil reservation step also generates a quote (if applicable)\n if (hotel?.bookingFlow === EBookingFlow.PreCheckoutPencil) {\n callApi = API.Reservation.pencilReservation;\n } else if (hotel?.rmsUseDepositQuote) {\n callApi = API.Reservation.getPriceQuote;\n } else {\n return false;\n }\n\n setIsLoadingPriceQuote(true);\n\n // Clear currently assigned quote details\n // If we're fetching basket row information the currently held info should be disregarded.\n currentBasketRows.forEach((row) => {\n if (row.quoteDetails) {\n row.quoteDetails = undefined;\n updateBasketRow(row);\n }\n });\n\n const retryableGetQuote: () => Observable<IBookingQuoteResponse | IPencilReservationResponse> = () =>\n defer(() => callApi(hotel.hotelID, currentBasketRows, isExternalMemberHotel ? memberNumber : undefined, pencilId)).pipe(\n retryWhen(\n genericRetryStrategy({\n maxRetryAttempts: maxRetryAttempts,\n })\n )\n );\n\n retryableGetQuote().subscribe(\n (response) => {\n let pencilResponse: IPencilReservationResponse | null = null;\n let quoteResponse: IBookingQuoteResponse | undefined;\n\n if (hotel?.bookingFlow === EBookingFlow.PreCheckoutPencil) {\n // Pencil call also passes back the quote (if applicable)\n pencilResponse = response as IPencilReservationResponse;\n quoteResponse = pencilResponse.quote;\n\n // Store parent pencil ID to pass back to the server later\n setPencilId(pencilResponse.pencilId);\n beContext.sessionProvider?.updateSession({ pencilId: pencilResponse.pencilId });\n\n // Future improvement: Handle availability errors\n } else {\n quoteResponse = response as IBookingQuoteResponse;\n }\n\n if (!quoteResponse) {\n return;\n }\n\n if (!applyQuote()) {\n // User has left the Confirmation step before the quote was ready, we'll stop here instead of updating the basket.\n // If we don't stop here, the user will be redirected back to the Confirmation step.\n setIsLoadingPriceQuote(false);\n return;\n }\n\n for (const basketRow of currentBasketRows) {\n const quoteRow = quoteResponse?.rows?.find((row) => row.rowId === basketRow.getID());\n const pencilRow = pencilResponse?.rows?.find((row) => row.rowId === basketRow.getID());\n\n if (quoteRow) {\n basketRow.quoteDetails = quoteRow;\n }\n\n if (pencilRow) {\n basketRow.pencilId = pencilRow.pencilId;\n }\n\n updateBasketRow(basketRow);\n }\n },\n (error: any) => {\n console.log(error);\n console.log(`Error!: Retried ${maxRetryAttempts} times then quit!`);\n },\n () => {\n setIsLoadingPriceQuote(false);\n }\n );\n },\n\n /**\n * Filter global list of rooms based on their validity.\n *\n * Useful for getting a complete summary of all the rooms.\n */\n getAllValidRows: () => {\n return currentBasketRows.filter((item) => item.isValid());\n },\n\n getAllDatelessRows: () => {\n return currentBasketRows.filter((item) => !item.getStartDate() || !item.getEndDate());\n },\n\n getNumberOfAdults: (withTranslation = false) => {\n return returnAggregationAndTranslation((row) => row.getAdults(), withTranslation ? Translation.Step.Date.Adult : undefined);\n },\n\n getNumberOfChildren: (withTranslation = false) => {\n return returnAggregationAndTranslation((row) => row.getChildren(), withTranslation ? Translation.Step.Date.Child : undefined);\n },\n\n getNumberOfInfants: (withTranslation = false) => {\n return returnAggregationAndTranslation((row) => row.getInfants(), withTranslation ? Translation.Step.Date.Infant : undefined);\n },\n\n getNumberOfRooms: (withTranslation = false) => {\n return returnAggregationAndTranslation(currentBasketRows.length, withTranslation ? Translation.Step.Date.Room : undefined);\n },\n\n getTotalPrice: () => {\n let totalPrice = returnAggregationAndTranslation((row) => (row.isValid() ? (row.getRate()?.getTotalPrice() as number) : 0)) as number;\n\n // If the hotel requires a deposit, and enableCreditCardSurchase is false, we need to add the deposit fees to the total price.\n if (hotel?.rmsUseDepositQuote && !hotel?.enableCreditCardSurcharge && hotel?.addDepositFeeToBookingTotal) {\n const depositFees = returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalFees as number) : 0)) as number;\n totalPrice += depositFees;\n }\n\n // Add addon totals with promo code discounts applied\n totalPrice += calculateAddonTotalWithDiscounts();\n\n // Add fees that aren't included in the rates.\n basketFeeRows.forEach((row) => {\n totalPrice += row.amount;\n });\n\n return totalPrice;\n },\n\n getTotalQuoteDeposit: () => {\n return returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalDeposit as number) : 0)) as number;\n },\n\n getDepositQuoteFees: () => {\n return returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalFees as number) : 0)) as number;\n },\n\n getTotalFees: () => {\n let totalFees = returnAggregationAndTranslation((row) => (row.isValid() ? (row.getRate()?.getTotalFees() as number) : 0)) as number;\n\n if (totalFees == 0 && hotel?.rmsUseDepositQuote) {\n // Hotel may have credit card surcharges disabled, but they could still be included as a part of the quote.\n totalFees = returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalFees as number) : 0)) as number;\n }\n\n basketAddonRows.forEach((row) => {\n totalFees += row.getTotalFees();\n });\n\n return totalFees;\n },\n\n /**\n * Aggregates all itemised fees from room rates, basket addons, and basket fees.\n * Returns a sorted list of aggregated fees, with percentage fees at the bottom.\n */\n getItemisedFees: () => {\n const feeMap = new Map<HotelFee, number>();\n\n // Aggregate fees from room rates\n currentBasketRows.forEach((row) => {\n if (row.isValid() && row.getRate() && hotel?.fees) {\n const roomFees = row.getRate()?.getItemisedFees(hotel.fees) ?? [];\n accumulateFees(feeMap, roomFees);\n }\n });\n\n // Aggregate fees from basket addon rows\n basketAddonRows.forEach((row) => {\n const addonFees = row.getItemisedFees(hotel?.fees ?? []);\n accumulateFees(feeMap, addonFees);\n });\n\n // Aggregate fees that aren't included in the rooms/addons\n basketFeeRows.forEach((basketFeeRow) => {\n accumulateFees(feeMap, [\n {\n hotelFee: basketFeeRow.hotelFee,\n amount: basketFeeRow.amount,\n },\n ]);\n });\n\n const fees = feeMapToArray(feeMap);\n return sortFees(fees, hotel?.fees || []);\n },\n\n getTotalPayNow: () => {\n if (hotel?.rmsUseDepositQuote) {\n const depositFees = returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalFees as number) : 0)) as number;\n return workingContext.getTotalQuoteDeposit() + depositFees;\n }\n\n const anyPolicyIsMissingDepositMode = currentBasketRows.some((row) => {\n const guaranteePolicy = row.getRate()?.getGuaranteePolicy();\n return guaranteePolicy && guaranteePolicy.depositMode === null;\n });\n\n if (anyPolicyIsMissingDepositMode) {\n // This should only happen for SynXis.\n return null;\n }\n\n let totalPayNow = 0;\n\n const anyRateRequiresFullPrepayment = currentBasketRows.some((row) => row.getRate()?.getGuaranteePolicy().depositMode === EGuaranteePolicyDepositMode.Full);\n\n if (anyRateRequiresFullPrepayment) {\n // Add booking fees that aren't associated with a rate or addon.\n getBookingFees().forEach((fee) => {\n totalPayNow += fee.amount;\n });\n }\n\n const firstRateGuaranteePolicy = currentBasketRows[0]?.getRate()?.getGuaranteePolicy();\n\n if (firstRateGuaranteePolicy) {\n const addonTotal = calculateAddonTotalWithDiscounts();\n const addonTotalWithFees = addonTotal + getBookingAddonFees().reduce((acc, row) => acc + row.amount, 0);\n const depositPercentage = firstRateGuaranteePolicy.depositPercentage;\n\n switch (firstRateGuaranteePolicy.depositMode) {\n case EGuaranteePolicyDepositMode.Full:\n totalPayNow += addonTotalWithFees;\n break;\n case EGuaranteePolicyDepositMode.Percentage:\n if (depositPercentage) {\n totalPayNow += addonTotalWithFees * (depositPercentage / 100);\n }\n break;\n case EGuaranteePolicyDepositMode.None:\n case EGuaranteePolicyDepositMode.FirstNight:\n break;\n }\n }\n\n for (const row of currentBasketRows) {\n const rate = row.getRate();\n\n // The BookingRate fees that are not included in the rate.\n const bookingRateFees = getBookingRateFees(row).reduce((acc, fee) => acc + fee.amount, 0);\n\n if (rate) {\n totalPayNow += rate.getDepositAccordingToGuaranteePolicy(bookingRateFees);\n }\n }\n\n return totalPayNow;\n },\n\n /**\n * Pops the provided row from the current basket array\n */\n removeBasketRow: (row: BasketRow) => {\n const rowsBeforeRemoval = currentBasketRows.length;\n\n basketRowReducer({ method: 'Remove', row });\n\n if (selectedBasketRow && row.getID() === selectedBasketRow.getID()) {\n const availableBasketRow = getNextAvailableBasketRow(row);\n if (availableBasketRow) {\n setStartDate(availableBasketRow.getStartDate());\n setEndDate(availableBasketRow.getEndDate());\n }\n setSelectedBasketRow(availableBasketRow);\n }\n\n if (rowsBeforeRemoval === 1) {\n workingContext.addBasketRow(new BasketRow());\n }\n },\n\n clearBasketRows: (confirm: boolean) => {\n if (confirm) {\n basketRowReducer({ method: 'Clear' });\n }\n },\n\n updateBasketRow,\n\n /**\n * Selects the given basket row and updates all relevant inputs (e.g., start date and end date).\n * - If the provided row is valid, it updates the selected row and sets the corresponding dates.\n * - If the row is null or invalid, it attempts to select the next available basket row.\n *\n * @param {BasketRow | null} row - The basket row to be selected.\n * @returns {Promise<void>} A promise that resolves when the selection is complete.\n */\n selectBasketRow: async (row: BasketRow | null) => {\n if (row && row.isValid()) {\n setStartDate(row.getStartDate());\n setEndDate(row.getEndDate());\n // Update the selected basket row\n setSelectedBasketRow(row);\n } else {\n // If the row is invalid or null, select the next available basket row\n setSelectedBasketRow(getNextAvailableBasketRow());\n }\n },\n\n setStartDate,\n setEndDate,\n setPromoCodeDetails,\n\n booked: async (data: ReservationsDTO, requestData: RoomstaySession['reservationRequest']) => {\n const updateObject: Partial<RoomstaySession> = { reservation: data };\n\n if (requestData) {\n updateObject.reservationRequest = requestData;\n }\n\n await beContext.sessionProvider?.updateSessionAsync(updateObject);\n setReservationData(data);\n },\n\n rollback: () => {\n beContext.sessionProvider?.updateSession({\n reservation: undefined,\n });\n setReservationData(null);\n },\n\n checkedOut: (data: ReservationsDTO) => {\n setHasCheckedOut(true);\n setReservationData(data);\n setSelectedBasketRow(null);\n basketRowReducer({ method: 'Clear' });\n\n const row = new BasketRow();\n row.setStartDate(dayjs().add(1, 'day'));\n row.setEndDate(dayjs().add(2, 'day'));\n\n basketRowReducer({ method: 'Add', row });\n setBasketAddonRows([]);\n setBasketFeeRows([]);\n\n const sessionProvider = beContext?.engine?.getSessionProvider();\n sessionProvider.deleteSession();\n sessionProvider?.initialize(undefined, beContext?.engine?.getSource());\n const params = new URLSearchParams(window.location.search);\n params.delete('planpay_checkout_id');\n\n // MPGS params\n params.delete('resultIndicator');\n params.delete('sessionVersion');\n params.delete('checkoutVersion');\n\n // Stripe params\n params.delete('payment_intent');\n params.delete('payment_intent_client_secret');\n params.delete('redirect_status');\n\n window.history.replaceState({}, '', `${window.location.pathname}?${params}`);\n navigate(StepThanks.getStepUrl());\n },\n\n /**\n * This is called when the users' payment was successfully verified, but there is additional payment required.\n */\n additionalPaymentRequired: async (data: IPaymentCheckoutDetails) => {\n const currentSession = beContext.sessionProvider?.getSession();\n const resRequest = currentSession?.reservationRequest;\n const resData = reservationData;\n\n if (!resData) return;\n\n if (resRequest?.payment) {\n // Delete SplitPaymentAmount because from now any requests will be for the remaining amount\n delete resRequest.payment.SplitPaymentAmount;\n }\n\n resData.payment = data;\n\n await beContext.sessionProvider.updateSessionAsync({ reservation: resData, reservationRequest: resRequest });\n setReservationData(resData);\n },\n\n finish: () => {\n setReservationData(null);\n setHasCheckedOut(false);\n },\n\n /**\n * Set the selected basket row to null, ensuring that no row is selected for editing.\n */\n clearSelectedRates: () => {\n setSelectedBasketRow(null);\n },\n\n getRowForAddon: (selectedAddon) => {\n if (selectedAddon === undefined) {\n return;\n }\n return basketAddonRows.find((r) => r.getAddon()?.code === selectedAddon?.code);\n },\n\n setAddonQuantities: (addon: Addon, quantities: { quantity: number; adult: number; child: number }, selectedDate: string, selectedTime: string) => {\n let addonRow = basketAddonRows.find((r) => r.getAddon()?.code === addon.code);\n if (addonRow === undefined) {\n addonRow = new BasketAddonRow(addon);\n basketAddonRows.push(addonRow);\n }\n\n addonRow.setQuantity(quantities.quantity ?? 0);\n addonRow.setAdultQuantity(quantities.adult ?? 0);\n addonRow.setChildQuantity(quantities.child ?? 0);\n addonRow.setSelectedDate(selectedDate);\n addonRow.setSelectedTime(addon.availability[selectedDate].selectorTimes ? selectedTime : undefined);\n\n // TODO: Quick hack to fix Synxis Basic Addon quantities.\n if (addon.pricingType === EAddonPricingType.PER_ADULT_OCCUPANCY_PER_NIGHT) {\n // TODO: Because all addons only apply to first room, we can select the 0th from the list.\n const basketRow = currentBasketRows?.[0];\n if (basketRow) {\n addonRow.setAdultQuantity(basketRow.getAdults());\n }\n }\n\n if (addon.pricingType === EAddonPricingType.PER_CHILD_OCCUPANCY_PER_NIGHT) {\n // TODO: Because all addons only apply to first room, we can select the 0th from the list.\n const basketRow = currentBasketRows?.[0];\n if (basketRow) {\n addonRow.setChildQuantity(basketRow.getChildren());\n }\n }\n\n // TODO: More hackyness to handle RMS Per Person Fee requirements\n if (addon.pricingType === EAddonPricingType.PER_ALL_PERSONS || addon.pricingType === EAddonPricingType.PER_ALL_PERSONS_PER_NIGHT) {\n const basketRow = currentBasketRows?.[0];\n if (basketRow) {\n addonRow.setAdultQuantity(basketRow.getAdults());\n addonRow.setChildQuantity(basketRow.getChildren());\n }\n }\n\n setBasketAddonRows([...basketAddonRows]);\n },\n\n removeBasketAddonRow: (row: BasketAddonRow) => {\n setBasketAddonRows((oldRows) => oldRows.filter((item) => item.getID() !== row.getID()));\n },\n\n /**\n * Attempts to select the next available basket row that does not have a rate assigned.\n * If such a row is found, it updates the selected basket row and returns it.\n * Otherwise, it does nothing.\n *\n * @returns {BasketRow | undefined} The selected basket row without a rate, or undefined if none is found.\n */\n attemptSelectUnfilledRow: (): BasketRow | undefined => {\n const row = getNextAvailableBasketRow();\n if (row && !row?.getRate()) {\n // Select the first available row without a rate and update the selected basket row\n setSelectedBasketRow(row);\n return row;\n }\n // No available unfilled row found, return undefined\n },\n // Callback triggered when the DatePicker open state changes.\n onDatePickerOpenChange: (isOpen: boolean) => {\n setIsDatePickerOpen(isOpen);\n },\n // Indicates whether the DatePicker is currently open.\n isDatePickerOpen: isDatePickerOpen,\n // Whether another room can be added (within max rooms per booking limit)\n canAddAnotherRoom: !hotel?.maxRoomsPerBooking || hotel?.maxRoomsPerBooking > currentBasketRows.length,\n };\n\n return (\n <BasketContext.Provider value={workingContext}>\n <AuthenticationContextProvider>\n {props.children}\n <MemberSignInModal />\n {showPromoCodeAlert && <PromoCodeVerificationAlert selectedBasketRow={selectedBasketRow} />}\n </AuthenticationContextProvider>\n </BasketContext.Provider>\n );\n}\n"]}
1
+ {"version":3,"file":"BasketContextWrapper.js","sourceRoot":"/","sources":["src/contexts/BasketContext/BasketContextWrapper.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AuthenticationContextProvider,\n BasketContext,\n BasketContextType,\n BookingEngineContext,\n ErrorHandler,\n HotelOverridesContext,\n NotificationContext,\n} from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport {\n calculateFeeAmount,\n EAddonPricingType,\n EBookingFlow,\n EFeeType,\n EGuaranteePolicyDepositMode,\n getFilteredBookingAddonFees,\n getFilteredBookingFees,\n getFilteredBookingRateFees,\n IBookingQuoteResponse,\n IPaymentCheckoutDetails,\n IPencilReservationResponse,\n IPromoCodeDetails,\n ReservationsDTO,\n Warning,\n} from '@roomstay/core';\nimport { API_DATE_FORMAT } from 'api/BaseAPI';\nimport dayjs, { Dayjs } from 'dayjs';\nimport { BasketContextErrorHandler } from 'handlers/BasketContextErrorHandler';\nimport { useHistoryConsistentPush } from 'hooks/HistoryConsistentPush';\nimport { useUpdateQueryParameters } from 'hooks/UpdateQueryParameters';\nimport { EAppQueryParameters } from 'models/AppQueryParameters';\nimport React, { useCallback, useContext, useEffect, useMemo, useReducer, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom';\nimport { BasketReducer } from 'reducers/BasketReducer';\nimport { defer, Observable, throwError, timer } from 'rxjs';\nimport { finalize, mergeMap, retryWhen } from 'rxjs/operators';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport Text from '@/components/generic/Text';\nimport { MemberSignInModal } from '@/components/members/SignInModal/MemberSignInModal';\nimport { PromoCodeVerificationAlert } from '@/components/steps/room/UserSearchSummary/PromoCodeVerificationAlert';\nimport { useConfirmationQuery } from '@/hooks/ConfirmationQuery';\nimport { useSignedInMember } from '@/hooks/useSignedInMember';\nimport { Addon } from '@/models/Addon/Addon';\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport BasketRow, { EPromoCodeStatus } from '@/models/BasketRow';\nimport { accumulateFees, feeMapToArray, HotelFee, ItemisedFee, sortFees } from '@/models/Fee';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport { RoomstaySession } from '@/models/RoomstaySession';\nimport StepAddon from '@/pages/steps/StepAddon/StepAddon';\nimport StepThanks from '@/pages/steps/StepThanks/StepThanks';\nimport InlineAddonStepFeature from '@/providers/feature/InlineAddonStepFeature';\nimport { usePromotionContainer } from '@/providers/PromotionProvider';\nimport { getQueryParamFromHash } from '@/util/CalendarHelper';\nimport DataLayer from '@/util/DataLayer';\nimport { debounce } from '@/util/Debounce';\nimport getStepRoom from '@/util/GetStepRoom';\nimport StepManager from '@/util/StepManager';\nimport StringHelper from '@/util/StringHelper';\nimport { AddonDiscountCalculator } from '@/utils/AddonDiscountCalculator';\n\nexport interface BasketContextWrapperProps {\n children: React.ReactNode;\n}\n\nexport function BasketContextWrapper(props: BasketContextWrapperProps) {\n const { t } = useTranslation();\n const { hotel } = useCurrentHotel();\n const updateQueryParams = useUpdateQueryParameters();\n const { isInitialCheckout } = useConfirmationQuery();\n const navigate = useNavigate();\n const historyConsistentPush = useHistoryConsistentPush();\n const { signedInUser, isExternalMemberHotel, memberNumber, memberOnlyModalPromotion } = useSignedInMember();\n\n const notifications = useContext(NotificationContext);\n const beContext = useContext(BookingEngineContext);\n\n const { showPromoCodeAlert } = useContext(HotelOverridesContext);\n\n const initialSession = beContext?.engine?.getInitialSession();\n\n const [currentBasketRows, basketRowReducer] = useReducer(BasketReducer, initialSession?.basketRows ?? []);\n const [pencilId, setPencilId] = useState<string | undefined>(initialSession?.pencilId ?? undefined);\n\n const [selectedBasketRow, setSelectedBasketRow] = useState<BasketRow | null>(null);\n const [basketAddonRows, setBasketAddonRows] = useState<BasketAddonRow[]>([]);\n\n // This is where we store the fees that aren't included in the rates/addons.\n const [basketFeeRows, setBasketFeeRows] = useState<ItemisedFee[]>([]);\n\n // Promo code details from availability response\n const [promoCodeDetails, setPromoCodeDetails] = useState<IPromoCodeDetails | null>(null);\n\n const [isLoadingPriceQuote, setIsLoadingPriceQuote] = useState(false);\n const [hasPriceQuoteError, setHasPriceQuoteError] = useState(false); // If true, showing an error and enabling retry\n\n let loadedStartDate: dayjs.Dayjs | null = null;\n let loadedEndDate: dayjs.Dayjs | null = null;\n\n if (initialSession?.basketRows?.length) {\n loadedStartDate = initialSession.basketRows[0].getStartDate();\n loadedEndDate = initialSession.basketRows[0].getEndDate();\n } else {\n if (initialSession?.startDate) {\n loadedStartDate = initialSession.startDate;\n }\n\n if (initialSession?.endDate) {\n loadedEndDate = initialSession.endDate;\n }\n }\n\n const [isDatePickerOpen, setIsDatePickerOpen] = useState<boolean>(false);\n const [startDate, setStartDate] = useState<dayjs.Dayjs | null>(loadedStartDate ?? null);\n const [endDate, setEndDate] = useState<dayjs.Dayjs | null>(loadedEndDate ?? null);\n\n const [hasCheckedOut, setHasCheckedOut] = useState(false);\n const [reservationData, setReservationData] = useState<ReservationsDTO | null>(initialSession?.reservation || null);\n\n const [knownErrorPromoCodes, setKnownErrorPromoCodes] = useState<string[]>([]);\n\n /**\n * Handles availability warnings related to promo codes.\n * Updates basket rows if a promo code is invalid, and logs other warnings.\n *\n * @param warnings - List of warning messages.\n */\n BasketContextErrorHandler.handleAvailabilityWarnings = (warnings: Warning<string>[]) => {\n warnings.forEach((warning: Warning<string>) => {\n if (warning.type === 'PromoCode') {\n // PromoCode warning message\n handleParsedPromoCodeWarning(warning);\n } else {\n // Unexpected warning message\n ErrorHandler.add({ message: warning.message });\n }\n });\n };\n\n function handleParsedPromoCodeWarning(warning: Warning<string>) {\n const promoCode = warning.data;\n if (!promoCode) return;\n updatePromoCodeRows(promoCode, warning.message);\n addPromoCodeToKnownErrors(promoCode);\n }\n\n function updatePromoCodeRows(promoCode: string, message: string) {\n currentBasketRows.forEach((row) => {\n if (promoCode.toLowerCase() === row.getPromoCode().toLowerCase()) {\n row.setPromoCodeStatus(EPromoCodeStatus.Invalid, message);\n workingContext.updateBasketRow(row, false);\n }\n });\n }\n\n function addPromoCodeToKnownErrors(promoCode: string) {\n const upperPromo = promoCode.toUpperCase();\n if (!knownErrorPromoCodes.includes(upperPromo)) {\n setKnownErrorPromoCodes((oldCodes) => [...oldCodes, upperPromo]);\n }\n }\n\n BasketContextErrorHandler.handlePromoSuccess = (promo: string, oneTimeUseOnly?: boolean) => {\n let foundFirstValid = false;\n\n currentBasketRows.forEach((row) => {\n if (row.getPromoCode() === promo && row.getPromoCode()) {\n if (foundFirstValid && oneTimeUseOnly) {\n row.setPromoCodeStatus(EPromoCodeStatus.Forbidden, 'This promo code can only be used on one room.');\n workingContext.updateBasketRow(row, false);\n return;\n }\n\n if (row.getPromoCodeStatus() === EPromoCodeStatus.Valid) {\n foundFirstValid = true;\n return;\n }\n\n row.setPromoCodeStatus(EPromoCodeStatus.Valid);\n workingContext.updateBasketRow(row, false);\n foundFirstValid = true;\n }\n });\n };\n\n // Handles availability warnings related to promo codes end\n\n const debounceUseEffect = useCallback(\n debounce(() => {\n if (!startDate || !endDate) {\n return;\n }\n\n if (isInitialCheckout) {\n DataLayer.instance.sendDateSelection({\n startDate,\n endDate,\n adult: selectedBasketRow?.getAdults(),\n children: selectedBasketRow?.getChildren(),\n infant: selectedBasketRow?.getInfants(),\n });\n }\n\n beContext.sessionProvider?.updateSession({\n startDate,\n endDate,\n });\n\n // TODO re-visit this as we don't want to set dates for everything constantly\n workingContext.getAllDatelessRows().forEach((row: BasketRow) => {\n row.setStartDate(startDate);\n row.setEndDate(endDate);\n\n workingContext.updateBasketRow(row);\n });\n\n //When trying to call row.discardGuestsState() in somewhere, we got conflicted here with BasketRow.setStartDate& BasketRow.setEndDate, it set back to previous startDate/endDate\n //Use debounceUseEffect to fix it\n if (selectedBasketRow) {\n selectedBasketRow.setStartDate(startDate);\n selectedBasketRow.setEndDate(endDate);\n\n workingContext.updateBasketRow(selectedBasketRow, false);\n } else if (currentBasketRows.length === 1) {\n const onlyBasketRow = currentBasketRows[0];\n onlyBasketRow.setStartDate(startDate);\n onlyBasketRow.setEndDate(endDate);\n\n workingContext.updateBasketRow(onlyBasketRow, false);\n }\n }, 500),\n [startDate, endDate]\n );\n\n useEffect(() => {\n debounceUseEffect();\n }, [debounceUseEffect]);\n\n useEffect(() => {\n if (signedInUser) {\n const memberPromoCode = signedInUser.promoCode || (hotel?.memberOnlyPromoCode as string);\n\n const urlPromoCode = getQueryParamFromHash(EAppQueryParameters.PromoCode);\n const allowDefaultMemberPromo = memberPromoCode && !memberOnlyModalPromotion?.memberOnlyDisableDefaultPromo;\n\n currentBasketRows?.forEach((row) => {\n // Only set promo code if row doesn't already have one\n if (row.getPromoCode()) return;\n\n // Determine the default promo code using precedence:\n const promoToApply = urlPromoCode || (allowDefaultMemberPromo ? memberPromoCode : null);\n\n if (promoToApply) {\n row.setPromoCode(promoToApply);\n updateBasketRow(row);\n }\n });\n }\n }, [signedInUser, hotel?.memberOnlyPromoCode]);\n\n useEffect(() => {\n beContext.sessionProvider?.updateSession({ basketRows: currentBasketRows });\n }, [currentBasketRows, selectedBasketRow]);\n\n useEffect(() => {\n updateBasketFeeRows();\n }, [currentBasketRows, basketAddonRows]);\n\n const checkAndApplyMemberOnlyPromo = (row: BasketRow, skipUpdate = false) => {\n if (row && hotel?.memberOnlyPromoCode && signedInUser && !row.getPromoCode()) {\n row.setPromoCode(hotel.memberOnlyPromoCode);\n\n if (!skipUpdate) {\n workingContext.updateBasketRow(row);\n }\n }\n };\n\n const returnAggregationAndTranslation = (reduction: ((row: BasketRow) => number) | number, translation?: string) => {\n const count = typeof reduction === 'number' ? reduction : currentBasketRows.reduce((total, row) => total + reduction(row), 0);\n\n if (translation) {\n return StringHelper.pluralWithDictAndCount(count, translation, t);\n } else {\n return count;\n }\n };\n\n const getNextAvailableBasketRow = (deletedBasketRow?: BasketRow): BasketRow | null => {\n if (!currentBasketRows.length) return null;\n // Filter out the excluded basket row if provided\n const filteredRows = deletedBasketRow ? currentBasketRows.filter((row) => row.getID() !== deletedBasketRow.getID()) : currentBasketRows;\n\n // Find the first row that does not have a rate assigned\n const availableRow = filteredRows.find((row) => !row.getRate());\n\n // Return a row without a rate if found\n // If no such row exists , return the last row in the list\n const nextBasketRow = availableRow ?? filteredRows[filteredRows.length - 1];\n nextBasketRow.normalizeDateRange();\n return nextBasketRow;\n };\n\n const updateQueryParameters = (row: BasketRow | null) => {\n if (!row) return;\n const queryParameters: Record<string, string> = {};\n if (row.getEndDate()) {\n let startDate = selectedBasketRow?.getStartDate();\n if (!startDate) {\n startDate = row.getStartDate();\n }\n queryParameters[EAppQueryParameters.Arrive] = startDate.format(API_DATE_FORMAT);\n queryParameters[EAppQueryParameters.Depart] = row.getEndDate().format(API_DATE_FORMAT);\n }\n if (row.getPromoCode()) queryParameters[EAppQueryParameters.PromoCode] = row.getPromoCode();\n if (row.getChildren() !== undefined) queryParameters[EAppQueryParameters.Children] = row.getChildren().toString();\n if (row.getAdults() !== undefined) queryParameters[EAppQueryParameters.Adults] = row.getAdults().toString();\n\n updateQueryParams(queryParameters);\n };\n\n const updateBasketRow = (row: BasketRow, updateGlobalDates = true) => {\n updateQueryParameters(row);\n\n if (updateGlobalDates && row.getID() === selectedBasketRow?.getID()) {\n setStartDate(row.getStartDate());\n setEndDate(row.getEndDate());\n }\n\n // Here we check if there is no promocode on the row. If there isn't this function will check for existing member details\n // and automatically apply a member only promocode\n checkAndApplyMemberOnlyPromo(row, true);\n\n // Update promo code details from availability cache\n const promoCode = row.getPromoCode();\n if (promoCode) {\n const promoDetails = API.Availability.getPromoCodeDetails(promoCode);\n if (promoDetails) {\n setPromoCodeDetails(promoDetails);\n }\n } else {\n // Clear promo details if no promo code\n setPromoCodeDetails(null);\n }\n\n basketRowReducer({ method: 'Update', row });\n };\n\n const syncSelectedDateRange = (row?: BasketRow) => {\n if (!row) return;\n if ((!row.getStartDate() || !row.getEndDate()) && startDate && endDate) {\n row.setStartDate(startDate);\n row.setEndDate(endDate);\n } else if (!startDate && !endDate && row.getStartDate() && row.getEndDate()) {\n setStartDate(row.getStartDate());\n setEndDate(row.getEndDate());\n }\n };\n\n const { loadedPromotion } = usePromotionContainer({ selectedBasketRow: selectedBasketRow as BasketRow, updateBasketRow });\n\n const genericRetryStrategy =\n ({\n maxRetryAttempts = 3,\n scalingDuration = 0,\n }: {\n maxRetryAttempts?: number;\n scalingDuration?: number;\n } = {}) =>\n (attempts: Observable<any>) => {\n return attempts.pipe(\n mergeMap((error, i) => {\n const retryAttempt = i + 1;\n if (retryAttempt > maxRetryAttempts) {\n return throwError(error);\n }\n console.log(`Attempt ${retryAttempt}: retrying in ${scalingDuration}ms`);\n return timer(scalingDuration);\n }),\n finalize(() => console.log('We are done!'))\n );\n };\n\n /**\n * Booking Fees.\n * These fees aren't related to an addon or a room, they're just on the booking itself.\n */\n const getBookingFees = () => {\n const hotelFees = hotel?.fees ?? [];\n const newFees: ItemisedFee[] = [];\n let totalBookingFees = 0;\n\n for (const fee of getFilteredBookingFees(hotelFees)) {\n const feeAmount = calculateFeeAmount(fee);\n\n newFees.push({ hotelFee: fee, amount: feeAmount });\n totalBookingFees += feeAmount;\n }\n\n // We need to add percentage fees on top of the Booking Fees, if the percentage fee is configured to include previous fees in calculation.\n if (totalBookingFees > 0) {\n let baseAmount = totalBookingFees;\n\n for (const fee of hotelFees.filter((fee) => fee.feeType === EFeeType.PercentageOfBooking && fee.includePreviousFeesInCalculation && !fee.extractFeeFromRates)) {\n const feeAmount = calculateFeeAmount(fee, {\n baseAmount,\n });\n\n console.log(`Booking Fees: Calculated ${fee.name} fee amount on ${baseAmount} = ${feeAmount}`);\n newFees.push({ hotelFee: fee, amount: feeAmount });\n baseAmount += feeAmount;\n }\n }\n\n return newFees;\n };\n\n const getBookingRateFees = (row: BasketRow) => {\n const hotelFees = hotel?.fees ?? [];\n const newFees: ItemisedFee[] = [];\n const initialCost = row.getTotalPrice(true) ?? 0;\n let totalFeesAdded = 0;\n let totalFeesIncludedInRates = 0;\n\n const rateFees = getFilteredBookingRateFees(hotelFees);\n\n // In order to calculate fees that were removed from the incoming rates using extractFeeFromRates option, we need\n // to know which fees were removed. When there's more than 1 percentage fee that's been removed, we can't\n // work backwards to figure out what the original price was without this.\n const removedPercentages = rateFees.filter((fee) => fee.extractFeeFromRates).map((fee) => fee.amount);\n\n for (const fee of rateFees) {\n if (fee.extractFeeFromRates || fee.includeInRates) {\n // For these fees, we need to add the amount to the the totalFeesIncludedInRates variable, so that we can\n // correctly calculate subsequent fees that are using the 'extractFeeFromRates' option.\n const baseAmount = fee.extractFeeFromRates ? initialCost : initialCost + totalFeesIncludedInRates;\n totalFeesIncludedInRates += calculateFeeAmount(fee, {\n baseAmount,\n numberOfNights: row.getNumberOfDays(),\n extractedFromRates: fee.extractFeeFromRates,\n removedPercentages,\n });\n }\n\n let feeCalculationBaseAmount: number;\n if (fee.extractFeeFromRates) {\n // If this fee is included in the rates, there's no additional fee to calculate.\n feeCalculationBaseAmount = fee.includeInRates ? 0 : initialCost;\n } else if (fee.includeInRates) {\n // These fees are already included in the rates, we only need to calculate \"fees on fees\" if applicable.\n if (!fee.includePreviousFeesInCalculation) {\n continue;\n }\n\n feeCalculationBaseAmount = totalFeesAdded;\n } else {\n // This fee either needs to include the full running total, or just the initial cost.\n feeCalculationBaseAmount = fee.includePreviousFeesInCalculation ? initialCost + totalFeesAdded + totalFeesIncludedInRates : initialCost;\n }\n\n const feeAmount = calculateFeeAmount(fee, {\n baseAmount: feeCalculationBaseAmount,\n numberOfNights: row.getNumberOfDays(),\n extractedFromRates: fee.extractFeeFromRates,\n removedPercentages,\n });\n\n newFees.push({ hotelFee: fee, amount: feeAmount });\n\n if (!fee.extractFeeFromRates) {\n totalFeesAdded += feeAmount;\n }\n }\n\n return newFees;\n };\n\n const getBookingAddonFees = () => {\n const hotelFees = hotel?.fees ?? [];\n const newFees: ItemisedFee[] = [];\n const validBasketAddonRows = basketAddonRows.filter((row) => row.isValid());\n for (const row of validBasketAddonRows) {\n const initialCost = row.getTotalPrice() - row.getTotalFees();\n let totalFeesAdded = 0;\n let totalFeesIncludedInRates = 0;\n\n const addonFees = getFilteredBookingAddonFees(hotelFees).filter((fee) => fee.appliesToAddons);\n const removedPercentages = addonFees.filter((fee) => fee.extractFeeFromRates).map((fee) => fee.amount);\n\n const hasItemisedFees = row.getItemisedFees(hotelFees).length > 0;\n\n for (const fee of addonFees) {\n if ((fee.extractFeeFromRates || fee.includeInRates) && hasItemisedFees) {\n const baseAmount = fee.extractFeeFromRates ? initialCost : initialCost + totalFeesIncludedInRates;\n totalFeesIncludedInRates += calculateFeeAmount(fee, {\n baseAmount,\n numberOfNights: row.getNightModifier(),\n extractedFromRates: fee.extractFeeFromRates,\n removedPercentages,\n });\n }\n\n let feeCalculationBaseAmount: number;\n if (fee.extractFeeFromRates) {\n feeCalculationBaseAmount = fee.includeInRates && hasItemisedFees ? 0 : initialCost;\n } else if (fee.includeInRates && hasItemisedFees) {\n feeCalculationBaseAmount = fee.includePreviousFeesInCalculation ? totalFeesAdded : 0;\n } else {\n feeCalculationBaseAmount = fee.includePreviousFeesInCalculation ? initialCost + totalFeesAdded + totalFeesIncludedInRates : initialCost;\n }\n\n const feeAmount = calculateFeeAmount(fee, {\n baseAmount: feeCalculationBaseAmount,\n numberOfNights: row.getNightModifier(),\n extractedFromRates: fee.extractFeeFromRates && !fee.includeInRates,\n removedPercentages,\n });\n\n newFees.push({ hotelFee: fee, amount: feeAmount });\n\n if (!fee.extractFeeFromRates) {\n totalFeesAdded += feeAmount;\n }\n }\n }\n\n return newFees;\n };\n\n const updateBasketFeeRows = () => {\n const validBasketRows = currentBasketRows?.filter((row) => row.isValid());\n\n if (!validBasketRows.length || !hotel?.fees) {\n setBasketFeeRows([]);\n return;\n }\n\n const newFees: ItemisedFee[] = [];\n\n /**\n * Booking Fees.\n * These fees aren't related to an addon or a room, they're just on the booking itself.\n */\n newFees.push(...getBookingFees());\n\n /**\n * Booking Rate Fees.\n */\n for (const row of validBasketRows) {\n const rateFees = getBookingRateFees(row);\n newFees.push(...rateFees);\n }\n\n /**\n * Booking Addon Fees.\n */\n newFees.push(...getBookingAddonFees());\n\n setBasketFeeRows(newFees);\n };\n\n const quoteQueryID: string = useMemo(() => {\n const requireQuote = hotel?.rmsUseDepositQuote || hotel?.bookingFlow === EBookingFlow.PreCheckoutPencil;\n\n if (!hotel || !requireQuote) {\n return '';\n }\n\n return API.Reservation.buildQuoteQueryID(currentBasketRows, isExternalMemberHotel ? memberNumber : undefined);\n }, [currentBasketRows, isExternalMemberHotel, memberNumber, hotel?.hotelID]);\n\n /**\n * Indicates whether required pricing data is ready.\n *\n * - Returns `true` when the hotel does not require a quote.\n * - While a quote is loading, verifies all basket rows contain\n * the required pricing data (`quoteDetails` or `pencilId`).\n * - Used to block UI actions until pricing is ready.\n */\n const isQuoteOrPencilReady = useMemo(() => {\n const requireQuote = !!hotel?.rmsUseDepositQuote || !!(hotel?.bookingFlow && hotel?.bookingFlow == EBookingFlow.PreCheckoutPencil);\n const isLoadedQuoteOrPencil = currentBasketRows.every((basketRow) => {\n if (hotel?.bookingFlow === EBookingFlow.PreCheckoutPencil) {\n return !!basketRow.pencilId;\n }\n if (hotel?.rmsUseDepositQuote) {\n return !!basketRow.quoteDetails;\n }\n return true;\n });\n\n if (!hotel || !requireQuote || (requireQuote && !isLoadingPriceQuote && isLoadedQuoteOrPencil)) {\n return true;\n }\n return false;\n }, [isLoadingPriceQuote, hotel?.rmsUseDepositQuote, hotel?.bookingFlow, currentBasketRows]);\n\n /**\n * Calculate total price of all addons with promo code discounts applied.\n * Uses AddonDiscountCalculator to handle sequential discount allocation.\n */\n const calculateAddonTotalWithDiscounts = useCallback((): number => {\n return AddonDiscountCalculator.calculateTotal(basketAddonRows, currentBasketRows, promoCodeDetails);\n }, [basketAddonRows, currentBasketRows, promoCodeDetails]);\n\n // Whether another room can be added (within max rooms per booking limit)\n const canAddAnotherRoom = useMemo(() => {\n return !hotel?.maxRoomsPerBooking || hotel?.maxRoomsPerBooking > currentBasketRows.length;\n }, [hotel?.maxRoomsPerBooking, currentBasketRows.length]);\n\n const workingContext: BasketContextType = {\n startDate: startDate as Dayjs,\n endDate: endDate as Dayjs,\n\n selectedBasketRow: selectedBasketRow as BasketRow,\n currentBasketRows,\n basketAddonRows,\n\n basketFeeRows,\n updateBasketFeeRows,\n\n hasCheckedOut,\n reservationData: reservationData as ReservationsDTO,\n isLoadingPriceQuote,\n\n loadedPromotion,\n promoCodeDetails,\n quoteQueryID,\n pencilId,\n\n /**\n * Adds a new basket row and applies relevant updates:\n * - Synchronizes the selected date range.\n * - Applies any applicable member-only promotions.\n * - Ensures proper selection logic for the basket row.\n *\n * Selection logic:\n * - If the basket is empty, the newly added row is automatically selected.\n * - If a row is already selected:\n * - If the selected row has an assigned rate, update the selection to the new row.\n * - Otherwise, keep the current selection (allowing continued editing of the existing row).\n * - If no row is selected, set the new row as the selected row.\n *\n * @param {BasketRow} row - The basket row to add.\n */\n addBasketRow: (row: BasketRow) => {\n if (!canAddAnotherRoom) return;\n syncSelectedDateRange(row);\n checkAndApplyMemberOnlyPromo(row);\n\n // Determine if the basket is currently empty\n const isEmptyRows = !currentBasketRows.length;\n if (isEmptyRows) {\n // If empty, set the newly added row as the selected basket row\n setSelectedBasketRow(row);\n } else {\n if (selectedBasketRow) {\n // Determine if the currently selected row has an assigned rate\n const isSelectedRowAssignedRate = selectedBasketRow && selectedBasketRow.getRate();\n if (isSelectedRowAssignedRate) {\n // If the selected row has a rate, update the selection to the new row\n setSelectedBasketRow(row);\n }\n } else {\n // If no row is currently selected, set the new row as the selected basket row\n setSelectedBasketRow(row);\n }\n }\n basketRowReducer({ method: 'Add', row });\n },\n\n initBasketRows: (rows: BasketRow[]) => {\n const firstRow = rows[0];\n syncSelectedDateRange(firstRow);\n setSelectedBasketRow(firstRow);\n basketRowReducer({\n method: 'Init',\n rows: rows,\n });\n },\n\n //TODO: This function needs to be refactored to simplify a lot of this logic, and move notification raising to use the Event Manager instead\n addRate: async (rate: RoomRate, notify = true) => {\n let basketRow: BasketRow | null = null;\n let translationString: string;\n\n let addons = [];\n\n if (selectedBasketRow) {\n selectedBasketRow.setPreGuestsState();\n basketRow = selectedBasketRow;\n if (selectedBasketRow.getRate()) {\n translationString = Translation.Misc.RoomUpdatedNotification;\n } else {\n if (!selectedBasketRow.getStartDate() && selectedBasketRow.getEndDate()) {\n selectedBasketRow.setStartDate(startDate as Dayjs);\n selectedBasketRow.setEndDate(endDate as Dayjs);\n }\n\n translationString = Translation.Misc.RoomAddedNotification;\n }\n } else {\n if (!startDate || !endDate) {\n console.error('room selected with no date values.');\n return;\n }\n\n basketRow = new BasketRow(rate);\n\n basketRow.setStartDate(startDate);\n basketRow.setEndDate(endDate);\n\n translationString = Translation.Misc.RoomAddedNotification;\n }\n\n if (InlineAddonStepFeature.isActive()) {\n basketRow.setRate(rate); // TODO: Fix quick hack to make the Addons load\n addons = await API.Addons.findAddons([basketRow], hotel?.hotelID as string);\n }\n\n basketRow.setAuxiliaryFilter(beContext.currentGroupedRoomFilters);\n beContext.setCurrentGroupedRoomFilters({});\n\n basketRowReducer({ method: 'AddRate', rate, row: basketRow });\n\n // Update promo code details from availability cache\n if (rate.promoCode) {\n const promoDetails = API.Availability.getPromoCodeDetails(rate.promoCode);\n if (promoDetails) {\n setPromoCodeDetails(promoDetails);\n }\n } else {\n // Clear promo details if no promo code\n setPromoCodeDetails(null);\n }\n\n try {\n DataLayer.instance.sendRoomRateAddToCart(\n rate,\n basketRow.getNumberOfDays(),\n startDate ?? basketRow.getStartDate(),\n endDate ?? basketRow.getEndDate(),\n basketRow.getPreUpsellRoomRate()\n );\n } catch (ex) {\n console.log('Failed recording basket Add event');\n }\n\n if (notify) {\n notifications.addNotification({\n icon: IconType.Bed,\n children: (\n <Text inline>\n {t(translationString)} <strong className=\"u-marg-left--light\">{rate.getRoom().name}</strong>\n </Text>\n ),\n });\n }\n\n const nextAvailable = getNextAvailableBasketRow();\n if (!nextAvailable?.getRate()) {\n // If the next available row does not have a rate assigned,\n // set it as the selected basket row to allow rate assignment.\n setSelectedBasketRow(nextAvailable);\n } else {\n // If all rows already have a rate assigned\n // Set the selected basket row to null, ensuring that no row is selected for editing.\n setSelectedBasketRow(null);\n\n // Determine whether the next step is an add-on selection step.\n const isNextStepAddon = StepManager.getNextStepUrl(getStepRoom()) === StepAddon.getStepUrl();\n\n if (isNextStepAddon) {\n if (addons.length) {\n historyConsistentPush(StepAddon.getStepUrl());\n } else {\n historyConsistentPush(StepManager.getNextStepUrl(StepAddon));\n }\n } else {\n historyConsistentPush(StepManager.getNextStepUrl(getStepRoom()));\n }\n }\n },\n\n quoteOrPencilReservation: (applyQuote) => {\n const maxRetryAttempts = 1;\n let callApi: (hotelId: string, rows: BasketRow[], memberNumber?: string, pencilId?: string) => Promise<IBookingQuoteResponse | IPencilReservationResponse>;\n\n // To avoid multiple requests, pencil reservation step also generates a quote (if applicable)\n if (hotel?.bookingFlow === EBookingFlow.PreCheckoutPencil) {\n callApi = API.Reservation.pencilReservation;\n } else if (hotel?.rmsUseDepositQuote) {\n callApi = API.Reservation.getPriceQuote;\n } else {\n return false;\n }\n\n setIsLoadingPriceQuote(true);\n setHasPriceQuoteError(false);\n\n // Clear currently assigned quote details\n // If we're fetching basket row information the currently held info should be disregarded.\n currentBasketRows.forEach((row) => {\n if (row.quoteDetails) {\n row.quoteDetails = undefined;\n updateBasketRow(row);\n }\n });\n\n const retryableGetQuote: () => Observable<IBookingQuoteResponse | IPencilReservationResponse> = () =>\n defer(() => callApi(hotel.hotelID, currentBasketRows, isExternalMemberHotel ? memberNumber : undefined, pencilId)).pipe(\n retryWhen(\n genericRetryStrategy({\n maxRetryAttempts: maxRetryAttempts,\n })\n )\n );\n\n retryableGetQuote().subscribe(\n (response) => {\n let pencilResponse: IPencilReservationResponse | null = null;\n let quoteResponse: IBookingQuoteResponse | undefined;\n\n if (hotel?.bookingFlow === EBookingFlow.PreCheckoutPencil) {\n // Pencil call also passes back the quote (if applicable)\n pencilResponse = response as IPencilReservationResponse;\n // Important: When `hotel?.rmsUseDepositQuote` is false, `pencilResponse.quote` is always null\n quoteResponse = pencilResponse.quote;\n\n // Store parent pencil ID to pass back to the server later\n setPencilId(pencilResponse.pencilId);\n beContext.sessionProvider?.updateSession({ pencilId: pencilResponse.pencilId });\n\n // Future improvement: Handle availability errors\n } else if (hotel.rmsUseDepositQuote) {\n quoteResponse = response as IBookingQuoteResponse;\n }\n\n if (!applyQuote()) {\n // User has left the Confirmation step before the quote was ready, we'll stop here instead of updating the basket.\n // If we don't stop here, the user will be redirected back to the Confirmation step.\n setIsLoadingPriceQuote(false);\n return;\n }\n\n // Ensure pencilId is assigned even when quoteResponse is not available\n for (const basketRow of currentBasketRows) {\n const quoteRow = quoteResponse?.rows?.find((row) => row.rowId === basketRow.getID());\n const pencilRow = pencilResponse?.rows?.find((row) => row.rowId === basketRow.getID());\n\n if (quoteRow) {\n basketRow.quoteDetails = quoteRow;\n }\n\n if (pencilRow) {\n basketRow.pencilId = pencilRow.pencilId;\n }\n\n updateBasketRow(basketRow);\n }\n },\n (error: any) => {\n setHasPriceQuoteError(true);\n console.log(error);\n console.log(`Error!: Retried ${maxRetryAttempts} times then quit!`);\n },\n () => {\n setIsLoadingPriceQuote(false);\n }\n );\n },\n\n /**\n * Filter global list of rooms based on their validity.\n *\n * Useful for getting a complete summary of all the rooms.\n */\n getAllValidRows: () => {\n return currentBasketRows.filter((item) => item.isValid());\n },\n\n getAllDatelessRows: () => {\n return currentBasketRows.filter((item) => !item.getStartDate() || !item.getEndDate());\n },\n isValidDateRange: (): boolean => {\n return !!startDate && !!endDate && startDate.isBefore(endDate);\n },\n\n getNumberOfAdults: (withTranslation = false) => {\n return returnAggregationAndTranslation((row) => row.getAdults(), withTranslation ? Translation.Step.Date.Adult : undefined);\n },\n\n getNumberOfChildren: (withTranslation = false) => {\n return returnAggregationAndTranslation((row) => row.getChildren(), withTranslation ? Translation.Step.Date.Child : undefined);\n },\n\n getNumberOfInfants: (withTranslation = false) => {\n return returnAggregationAndTranslation((row) => row.getInfants(), withTranslation ? Translation.Step.Date.Infant : undefined);\n },\n\n getNumberOfRooms: (withTranslation = false) => {\n return returnAggregationAndTranslation(currentBasketRows.length, withTranslation ? Translation.Step.Date.Room : undefined);\n },\n\n getTotalPrice: () => {\n let totalPrice = returnAggregationAndTranslation((row) => (row.isValid() ? (row.getRate()?.getTotalPrice() as number) : 0)) as number;\n\n // If the hotel requires a deposit, and enableCreditCardSurchase is false, we need to add the deposit fees to the total price.\n if (hotel?.rmsUseDepositQuote && !hotel?.enableCreditCardSurcharge && hotel?.addDepositFeeToBookingTotal) {\n const depositFees = returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalFees as number) : 0)) as number;\n totalPrice += depositFees;\n }\n\n // Add addon totals with promo code discounts applied\n totalPrice += calculateAddonTotalWithDiscounts();\n\n // Add fees that aren't included in the rates.\n basketFeeRows.forEach((row) => {\n totalPrice += row.amount;\n });\n\n return totalPrice;\n },\n\n getTotalQuoteDeposit: () => {\n return returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalDeposit as number) : 0)) as number;\n },\n\n getDepositQuoteFees: () => {\n return returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalFees as number) : 0)) as number;\n },\n\n getTotalFees: () => {\n let totalFees = returnAggregationAndTranslation((row) => (row.isValid() ? (row.getRate()?.getTotalFees() as number) : 0)) as number;\n\n if (totalFees == 0 && hotel?.rmsUseDepositQuote) {\n // Hotel may have credit card surcharges disabled, but they could still be included as a part of the quote.\n totalFees = returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalFees as number) : 0)) as number;\n }\n\n basketAddonRows.forEach((row) => {\n totalFees += row.getTotalFees();\n });\n\n return totalFees;\n },\n\n /**\n * Aggregates all itemised fees from room rates, basket addons, and basket fees.\n * Returns a sorted list of aggregated fees, with percentage fees at the bottom.\n */\n getItemisedFees: () => {\n const feeMap = new Map<HotelFee, number>();\n\n // Aggregate fees from room rates\n currentBasketRows.forEach((row) => {\n if (row.isValid() && row.getRate() && hotel?.fees) {\n const roomFees = row.getRate()?.getItemisedFees(hotel.fees) ?? [];\n accumulateFees(feeMap, roomFees);\n }\n });\n\n // Aggregate fees from basket addon rows\n basketAddonRows.forEach((row) => {\n const addonFees = row.getItemisedFees(hotel?.fees ?? []);\n accumulateFees(feeMap, addonFees);\n });\n\n // Aggregate fees that aren't included in the rooms/addons\n basketFeeRows.forEach((basketFeeRow) => {\n accumulateFees(feeMap, [\n {\n hotelFee: basketFeeRow.hotelFee,\n amount: basketFeeRow.amount,\n },\n ]);\n });\n\n const fees = feeMapToArray(feeMap);\n return sortFees(fees, hotel?.fees || []);\n },\n\n getTotalPayNow: () => {\n if (hotel?.rmsUseDepositQuote) {\n const depositFees = returnAggregationAndTranslation((row) => (row.quoteDetails ? (row.quoteDetails?.totalFees as number) : 0)) as number;\n return workingContext.getTotalQuoteDeposit() + depositFees;\n }\n\n const anyPolicyIsMissingDepositMode = currentBasketRows.some((row) => {\n const guaranteePolicy = row.getRate()?.getGuaranteePolicy();\n return guaranteePolicy && guaranteePolicy.depositMode === null;\n });\n\n if (anyPolicyIsMissingDepositMode) {\n // This should only happen for SynXis.\n return null;\n }\n\n let totalPayNow = 0;\n\n const anyRateRequiresFullPrepayment = currentBasketRows.some((row) => row.getRate()?.getGuaranteePolicy().depositMode === EGuaranteePolicyDepositMode.Full);\n\n if (anyRateRequiresFullPrepayment) {\n // Add booking fees that aren't associated with a rate or addon.\n getBookingFees().forEach((fee) => {\n totalPayNow += fee.amount;\n });\n }\n\n const firstRateGuaranteePolicy = currentBasketRows[0]?.getRate()?.getGuaranteePolicy();\n\n if (firstRateGuaranteePolicy) {\n const addonTotal = calculateAddonTotalWithDiscounts();\n const addonTotalWithFees = addonTotal + getBookingAddonFees().reduce((acc, row) => acc + row.amount, 0);\n const depositPercentage = firstRateGuaranteePolicy.depositPercentage;\n\n switch (firstRateGuaranteePolicy.depositMode) {\n case EGuaranteePolicyDepositMode.Full:\n totalPayNow += addonTotalWithFees;\n break;\n case EGuaranteePolicyDepositMode.Percentage:\n if (depositPercentage) {\n totalPayNow += addonTotalWithFees * (depositPercentage / 100);\n }\n break;\n case EGuaranteePolicyDepositMode.None:\n case EGuaranteePolicyDepositMode.FirstNight:\n break;\n }\n }\n\n for (const row of currentBasketRows) {\n const rate = row.getRate();\n\n // The BookingRate fees that are not included in the rate.\n const bookingRateFees = getBookingRateFees(row).reduce((acc, fee) => acc + fee.amount, 0);\n\n if (rate) {\n totalPayNow += rate.getDepositAccordingToGuaranteePolicy(bookingRateFees);\n }\n }\n\n return totalPayNow;\n },\n\n /**\n * Pops the provided row from the current basket array\n */\n removeBasketRow: (row: BasketRow) => {\n const rowsBeforeRemoval = currentBasketRows.length;\n\n basketRowReducer({ method: 'Remove', row });\n\n if (selectedBasketRow && row.getID() === selectedBasketRow.getID()) {\n const availableBasketRow = getNextAvailableBasketRow(row);\n if (availableBasketRow) {\n setStartDate(availableBasketRow.getStartDate());\n setEndDate(availableBasketRow.getEndDate());\n }\n setSelectedBasketRow(availableBasketRow);\n }\n\n if (rowsBeforeRemoval === 1) {\n workingContext.addBasketRow(new BasketRow());\n }\n },\n\n clearBasketRows: (confirm: boolean) => {\n if (confirm) {\n basketRowReducer({ method: 'Clear' });\n }\n },\n\n updateBasketRow,\n\n /**\n * Selects the given basket row and updates all relevant inputs (e.g., start date and end date).\n * - If the provided row is valid, it updates the selected row and sets the corresponding dates.\n * - If the row is null or invalid, it attempts to select the next available basket row.\n *\n * @param {BasketRow | null} row - The basket row to be selected.\n * @returns {Promise<void>} A promise that resolves when the selection is complete.\n */\n selectBasketRow: async (row: BasketRow | null) => {\n if (row && row.isValid()) {\n setStartDate(row.getStartDate());\n setEndDate(row.getEndDate());\n // Update the selected basket row\n setSelectedBasketRow(row);\n } else {\n // If the row is invalid or null, select the next available basket row\n setSelectedBasketRow(getNextAvailableBasketRow());\n }\n },\n\n setStartDate,\n setEndDate,\n setPromoCodeDetails,\n\n booked: async (data: ReservationsDTO, requestData: RoomstaySession['reservationRequest']) => {\n const updateObject: Partial<RoomstaySession> = { reservation: data };\n\n if (requestData) {\n updateObject.reservationRequest = requestData;\n }\n\n await beContext.sessionProvider?.updateSessionAsync(updateObject);\n setReservationData(data);\n },\n\n rollback: () => {\n beContext.sessionProvider?.updateSession({\n reservation: undefined,\n });\n setReservationData(null);\n },\n\n checkedOut: (data: ReservationsDTO) => {\n setHasCheckedOut(true);\n setReservationData(data);\n setSelectedBasketRow(null);\n basketRowReducer({ method: 'Clear' });\n\n const row = new BasketRow();\n row.setStartDate(dayjs().add(1, 'day'));\n row.setEndDate(dayjs().add(2, 'day'));\n\n basketRowReducer({ method: 'Add', row });\n setBasketAddonRows([]);\n setBasketFeeRows([]);\n\n const sessionProvider = beContext?.engine?.getSessionProvider();\n sessionProvider.deleteSession();\n sessionProvider?.initialize(undefined, beContext?.engine?.getSource());\n const params = new URLSearchParams(window.location.search);\n params.delete('planpay_checkout_id');\n\n // MPGS params\n params.delete('resultIndicator');\n params.delete('sessionVersion');\n params.delete('checkoutVersion');\n\n // Stripe params\n params.delete('payment_intent');\n params.delete('payment_intent_client_secret');\n params.delete('redirect_status');\n\n window.history.replaceState({}, '', `${window.location.pathname}?${params}`);\n navigate(StepThanks.getStepUrl());\n },\n\n /**\n * This is called when the users' payment was successfully verified, but there is additional payment required.\n */\n additionalPaymentRequired: async (data: IPaymentCheckoutDetails) => {\n const currentSession = beContext.sessionProvider?.getSession();\n const resRequest = currentSession?.reservationRequest;\n const resData = reservationData;\n\n if (!resData) return;\n\n if (resRequest?.payment) {\n // Delete SplitPaymentAmount because from now any requests will be for the remaining amount\n delete resRequest.payment.SplitPaymentAmount;\n }\n\n resData.payment = data;\n\n await beContext.sessionProvider.updateSessionAsync({ reservation: resData, reservationRequest: resRequest });\n setReservationData(resData);\n },\n\n finish: () => {\n setReservationData(null);\n setHasCheckedOut(false);\n },\n\n /**\n * Set the selected basket row to null, ensuring that no row is selected for editing.\n */\n clearSelectedRates: () => {\n setSelectedBasketRow(null);\n },\n\n getRowForAddon: (selectedAddon) => {\n if (selectedAddon === undefined) {\n return;\n }\n return basketAddonRows.find((r) => r.getAddon()?.code === selectedAddon?.code);\n },\n\n setAddonQuantities: (addon: Addon, quantities: { quantity: number; adult: number; child: number }, selectedDate: string, selectedTime: string) => {\n let addonRow = basketAddonRows.find((r) => r.getAddon()?.code === addon.code);\n if (addonRow === undefined) {\n addonRow = new BasketAddonRow(addon);\n basketAddonRows.push(addonRow);\n }\n\n addonRow.setQuantity(quantities.quantity ?? 0);\n addonRow.setAdultQuantity(quantities.adult ?? 0);\n addonRow.setChildQuantity(quantities.child ?? 0);\n addonRow.setSelectedDate(selectedDate);\n addonRow.setSelectedTime(addon.availability[selectedDate].selectorTimes ? selectedTime : undefined);\n\n // TODO: Quick hack to fix Synxis Basic Addon quantities.\n if (addon.pricingType === EAddonPricingType.PER_ADULT_OCCUPANCY_PER_NIGHT) {\n // TODO: Because all addons only apply to first room, we can select the 0th from the list.\n const basketRow = currentBasketRows?.[0];\n if (basketRow) {\n addonRow.setAdultQuantity(basketRow.getAdults());\n }\n }\n\n if (addon.pricingType === EAddonPricingType.PER_CHILD_OCCUPANCY_PER_NIGHT) {\n // TODO: Because all addons only apply to first room, we can select the 0th from the list.\n const basketRow = currentBasketRows?.[0];\n if (basketRow) {\n addonRow.setChildQuantity(basketRow.getChildren());\n }\n }\n\n // TODO: More hackyness to handle RMS Per Person Fee requirements\n if (addon.pricingType === EAddonPricingType.PER_ALL_PERSONS || addon.pricingType === EAddonPricingType.PER_ALL_PERSONS_PER_NIGHT) {\n const basketRow = currentBasketRows?.[0];\n if (basketRow) {\n addonRow.setAdultQuantity(basketRow.getAdults());\n addonRow.setChildQuantity(basketRow.getChildren());\n }\n }\n\n setBasketAddonRows([...basketAddonRows]);\n },\n\n removeBasketAddonRow: (row: BasketAddonRow) => {\n setBasketAddonRows((oldRows) => oldRows.filter((item) => item.getID() !== row.getID()));\n },\n\n /**\n * Attempts to select the next available basket row that does not have a rate assigned.\n * If such a row is found, it updates the selected basket row and returns it.\n * Otherwise, it does nothing.\n *\n * @returns {BasketRow | undefined} The selected basket row without a rate, or undefined if none is found.\n */\n attemptSelectUnfilledRow: (): BasketRow | undefined => {\n const row = getNextAvailableBasketRow();\n if (row && !row?.getRate()) {\n // Select the first available row without a rate and update the selected basket row\n setSelectedBasketRow(row);\n return row;\n }\n // No available unfilled row found, return undefined\n },\n // Callback triggered when the DatePicker open state changes.\n onDatePickerOpenChange: (isOpen: boolean) => {\n setIsDatePickerOpen(isOpen);\n },\n // Indicates whether the DatePicker is currently open.\n isDatePickerOpen: isDatePickerOpen,\n canAddAnotherRoom: canAddAnotherRoom,\n hasPriceQuoteError: hasPriceQuoteError,\n isQuoteOrPencilReady: isQuoteOrPencilReady,\n };\n\n return (\n <BasketContext.Provider value={workingContext}>\n <AuthenticationContextProvider>\n {props.children}\n <MemberSignInModal />\n {showPromoCodeAlert && <PromoCodeVerificationAlert selectedBasketRow={selectedBasketRow} />}\n </AuthenticationContextProvider>\n </BasketContext.Provider>\n );\n}\n"]}