@roomstay/frontend 2.6.102 → 2.6.103
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.
- package/dist/177.bundle.js +1 -1
- package/dist/211.bundle.js +1 -0
- package/dist/288.bundle.js +1 -1
- package/dist/326.bundle.js +2 -0
- package/dist/326.bundle.js.LICENSE.txt +16 -0
- package/dist/328.bundle.js +1 -1
- package/dist/main.bundle.js +1 -1
- package/dist/src/api/AnalyticsEventsAPI.d.ts +13 -0
- package/dist/src/api/AnalyticsEventsAPI.js +55 -0
- package/dist/src/api/AnalyticsEventsAPI.js.map +1 -0
- package/dist/src/components/generic/PromotionalCodeInput.js +1 -1
- package/dist/src/components/generic/PromotionalCodeInput.js.map +1 -1
- package/dist/src/components/steps/confirmation/PayPalPaymentOption/PayPalPaymentOption.d.ts +2 -0
- package/dist/src/components/steps/confirmation/PayPalPaymentOption/PayPalPaymentOption.js +86 -0
- package/dist/src/components/steps/confirmation/PayPalPaymentOption/PayPalPaymentOption.js.map +1 -0
- package/dist/src/components/steps/confirmation/RoomContactDetails.js +2 -0
- package/dist/src/components/steps/confirmation/RoomContactDetails.js.map +1 -1
- package/dist/src/components/steps/confirmation/StepConfirmationForm.js +1 -1
- package/dist/src/components/steps/confirmation/StepConfirmationForm.js.map +1 -1
- package/dist/src/components/steps/date/PeoplePicker.js +1 -1
- package/dist/src/components/steps/date/PeoplePicker.js.map +1 -1
- package/dist/src/components/steps/date/PeoplePickerRow.js +2 -2
- package/dist/src/components/steps/date/PeoplePickerRow.js.map +1 -1
- package/dist/src/components/steps/room/RoomListCrossSellBlock.js +1 -0
- package/dist/src/components/steps/room/RoomListCrossSellBlock.js.map +1 -1
- package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummary.js +5 -3
- package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummary.js.map +1 -1
- package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.js +2 -2
- package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.js.map +1 -1
- package/dist/src/components/steps/room/roomBuilderProgress/NumberOfAdultsPicker.js +3 -3
- package/dist/src/components/steps/room/roomBuilderProgress/NumberOfAdultsPicker.js.map +1 -1
- package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgress.js +3 -3
- package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgress.js.map +1 -1
- package/dist/src/contexts/BasketContext/BasketContextType.d.ts +4 -0
- package/dist/src/contexts/BasketContext/BasketContextType.js.map +1 -1
- package/dist/src/contexts/BasketContext/BasketContextWrapper.js +46 -6
- package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +10 -0
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +21 -3
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepPriceQuoteErrorModal.d.ts +9 -0
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepPriceQuoteErrorModal.js +67 -0
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepPriceQuoteErrorModal.js.map +1 -0
- package/dist/src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.js +43 -7
- package/dist/src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.js.map +1 -1
- package/dist/src/handlers/payment/PayPalPaymentHandler.d.ts +2 -0
- package/dist/src/handlers/payment/PayPalPaymentHandler.js +41 -0
- package/dist/src/handlers/payment/PayPalPaymentHandler.js.map +1 -0
- package/dist/src/hooks/useSearchScopeHook.d.ts +5 -2
- package/dist/src/hooks/useSearchScopeHook.js +57 -14
- package/dist/src/hooks/useSearchScopeHook.js.map +1 -1
- package/dist/src/models/Addon/Addon.js +4 -0
- package/dist/src/models/Addon/Addon.js.map +1 -1
- package/dist/src/models/Api/HotelDTO.d.ts +1 -1
- package/dist/src/models/Api/HotelDTO.js.map +1 -1
- package/dist/src/models/BasketRow.d.ts +5 -0
- package/dist/src/models/BasketRow.js +13 -1
- package/dist/src/models/BasketRow.js.map +1 -1
- package/dist/src/models/Client/Hotel/Hotel.d.ts +12 -0
- package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
- package/dist/src/pages/findReservation/FindReservationResults.js +2 -2
- package/dist/src/pages/findReservation/FindReservationResults.js.map +1 -1
- package/dist/src/pages/steps/StepAddon/StepAddonValidator.js +1 -1
- package/dist/src/pages/steps/StepAddon/StepAddonValidator.js.map +1 -1
- package/dist/src/pages/steps/StepConfirmation/StepConfirmationValidator.js +1 -1
- package/dist/src/pages/steps/StepConfirmation/StepConfirmationValidator.js.map +1 -1
- package/dist/src/pages/steps/StepRoom/StepRoomValidator.js +1 -1
- package/dist/src/pages/steps/StepRoom/StepRoomValidator.js.map +1 -1
- package/dist/src/pages/steps/StepThanks/StepThanksComponent.js +2 -2
- package/dist/src/pages/steps/StepThanks/StepThanksComponent.js.map +1 -1
- package/dist/src/providers/FeatureProvider.js +2 -0
- package/dist/src/providers/FeatureProvider.js.map +1 -1
- package/dist/src/providers/RatePillProvider.d.ts +1 -0
- package/dist/src/providers/RatePillProvider.js +11 -4
- package/dist/src/providers/RatePillProvider.js.map +1 -1
- package/dist/src/providers/feature/AnalyticsEventsFeature.d.ts +23 -0
- package/dist/src/providers/feature/AnalyticsEventsFeature.js +83 -0
- package/dist/src/providers/feature/AnalyticsEventsFeature.js.map +1 -0
- package/dist/src/translations/Translation.d.ts +5 -0
- package/dist/src/translations/Translation.js +5 -0
- package/dist/src/translations/Translation.js.map +1 -1
- package/dist/src/translations/languages/en-gb.js +9 -4
- package/dist/src/translations/languages/en-gb.js.map +1 -1
- package/dist/src/util/Analytics/Analytics.d.ts +7 -0
- package/dist/src/util/Analytics/Analytics.js +8 -1
- package/dist/src/util/Analytics/Analytics.js.map +1 -1
- package/dist/src/util/AnalyticsEvents/AnalyticsEvents.d.ts +61 -0
- package/dist/src/util/AnalyticsEvents/AnalyticsEvents.js +329 -0
- package/dist/src/util/AnalyticsEvents/AnalyticsEvents.js.map +1 -0
- package/dist/src/util/AnalyticsEvents/helpers.d.ts +30 -0
- package/dist/src/util/AnalyticsEvents/helpers.js +96 -0
- package/dist/src/util/AnalyticsEvents/helpers.js.map +1 -0
- package/dist/src/util/DataLayer.js +4 -4
- package/dist/src/util/DataLayer.js.map +1 -1
- package/dist/test.bundle.js +1 -1
- package/dist/vendors.bundle.js +1 -1
- package/package.json +3 -2
- package/dist/180.bundle.js +0 -1
- package/dist/570.bundle.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmationStepPriceQuoteErrorModal.js","sourceRoot":"/","sources":["src/contexts/ConfirmationStepContext/ConfirmationStepPriceQuoteErrorModal.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,iDAA+C;AAE/C,6EAAqD;AACrD,6EAAqD;AACrD,uEAAgE;AAChE,sFAAsF;AACtF,kEAA2D;AAC3D,4DAAyD;AACzD,wCAAqC;AACrC,wDAAiD;AAS1C,MAAM,oCAAoC,GAAG,CAAC,KAAgC,EAAE,EAAE;IACrF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACjD,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,OAAO,CACH,8BAAC,qBAAW,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,6BAAe,CAAC,KAAK,EAAE,WAAW,QAAC,OAAO,EAAE,OAAO;QAC9E,uCAAK,SAAS,EAAC,mBAAmB;YAC9B,uCAAK,SAAS,EAAC,6CAA6C;gBACxD,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,EAAE,IAAI,EAAC,MAAM,EAAC,KAAK,EAAE,aAAK,CAAC,MAAM,GAAI,CAC7D;YAEN,uCAAK,SAAS,EAAC,sBAAsB;gBACjC,8BAAC,kBAAQ,IAAC,KAAK,EAAE,yBAAS,CAAC,MAAM,EAAE,IAAI,EAAC,QAAQ,EAAC,IAAI,UAChD,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CACrD,CACT;YAEN,uCAAK,SAAS,EAAC,sBAAsB;gBACjC,uCAAK,SAAS,EAAC,sBAAsB;oBACjC,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,yBAAS,CAAC,MAAM,IAC7C,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAC3D,CACL,CACJ;YAEN,uCAAK,SAAS,EAAC,+BAA+B;gBAC1C,8BAAC,kBAAQ,IAAC,SAAS,EAAC,aAAa,EAAC,OAAO,QAAC,IAAI,EAAE,eAAQ,CAAC,UAAU,EAAE,iBAAiB,QAAC,YAAY,EAAC,MAAM,EAAC,IAAI,QAAC,OAAO,EAAE,MAAM,IAC1H,CAAC,CAAC,yBAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CACxB;gBACX,8BAAC,kBAAQ,IAAC,SAAS,EAAC,aAAa,EAAC,OAAO,QAAC,MAAM,QAAC,IAAI,EAAE,eAAQ,CAAC,WAAW,EAAE,iBAAiB,QAAC,YAAY,EAAC,OAAO,EAAC,IAAI,QAAC,OAAO,EAAE,OAAO,IACpI,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC,CACrD,CACT,CACJ,CACI,CACjB,CAAC;AACN,CAAC,CAAC;AApCW,QAAA,oCAAoC,wCAoC/C","sourcesContent":["import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport BEButton from '@/components/generic/BEButton';\nimport Headline from '@/components/generic/Headline';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\nimport { TextAlign } from '@/util/TextAlignment';\n\ntype PriceQuoteErrorModalProps = {\n onBack: () => void;\n onRetry: () => void;\n onClose: () => void;\n open: boolean;\n};\n\nexport const ConfirmationStepPriceQuoteErrorModal = (props: PriceQuoteErrorModalProps) => {\n const { open, onClose, onBack, onRetry } = props;\n const { t } = useTranslation();\n\n return (\n <SimpleModal open={open} size={SimpleModalSize.Small} alignCenter onClose={onClose}>\n <div className=\"u-pad--heavy-plus\">\n <div className=\"u-flex justify-content-center u-marg-bottom\">\n <Icon icon={IconType.Error} size=\"85px\" color={Color.Accent} />\n </div>\n\n <div className=\"u-marg-bottom--heavy\">\n <Headline align={TextAlign.Center} size=\"larger\" bold>\n {t(Translation.Step.Confirmation.PriceQuoteErrorModal.Title)}\n </Headline>\n </div>\n\n <div className=\"u-marg-bottom--heavy\">\n <div className=\"u-marg-bottom--heavy\">\n <Text type={TextType.Body} align={TextAlign.Center}>\n {t(Translation.Step.Confirmation.PriceQuoteErrorModal.Message)}\n </Text>\n </div>\n </div>\n\n <div className=\"u-flex justify-content-center\">\n <BEButton className=\"u-marg-left\" primary icon={IconType.ArrowLeft2} stopIconAnimation iconPosition=\"left\" wide onClick={onBack}>\n {t(Translation.Navigation.Back)}\n </BEButton>\n <BEButton className=\"u-marg-left\" primary filled icon={IconType.ArrowRight2} stopIconAnimation iconPosition=\"right\" wide onClick={onRetry}>\n {t(Translation.Step.Confirmation.PriceQuoteErrorModal.Retry)}\n </BEButton>\n </div>\n </div>\n </SimpleModal>\n );\n};\n"]}
|
|
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.FullPageEngineContextWrapper = FullPageEngineContextWrapper;
|
|
40
40
|
const contexts_1 = require("../index.js");
|
|
41
41
|
const hooks_1 = require("../../hooks/index.js");
|
|
42
|
+
const core_1 = require("@roomstay/core");
|
|
42
43
|
const gc_frontend_1 = require("@roomstay/gc-frontend");
|
|
43
44
|
const dayjs_1 = __importDefault(require("dayjs"));
|
|
44
45
|
const react_1 = __importStar(require("react"));
|
|
@@ -60,6 +61,7 @@ const FindReservationResults_1 = __importDefault(require("../../pages/findReserv
|
|
|
60
61
|
const HotelInfo_1 = __importDefault(require("../../pages/hotel/HotelInfo"));
|
|
61
62
|
const HotelInfoPlaceholder_1 = __importDefault(require("../../pages/hotel/HotelInfoPlaceholder"));
|
|
62
63
|
const StepHotel_1 = __importDefault(require("../../pages/steps/StepHotel/StepHotel"));
|
|
64
|
+
const AnalyticsEventsFeature_1 = __importDefault(require("../../providers/feature/AnalyticsEventsFeature"));
|
|
63
65
|
const DerbysoftClickTrackingFeature_1 = __importDefault(require("../../providers/feature/DerbysoftClickTrackingFeature"));
|
|
64
66
|
const FeaturedPromoFeature_1 = __importDefault(require("../../providers/feature/FeaturedPromoFeature"));
|
|
65
67
|
const GiftCardFeature_1 = __importDefault(require("../../providers/feature/GiftCardFeature"));
|
|
@@ -101,8 +103,22 @@ function FullPageEngineContextWrapper() {
|
|
|
101
103
|
FeatureProvider_1.default.load(DerbysoftClickTrackingFeature_1.default);
|
|
102
104
|
}
|
|
103
105
|
}, [(_c = hotel === null || hotel === void 0 ? void 0 : hotel.company) === null || _c === void 0 ? void 0 : _c.enableDerbysoftFeed]);
|
|
106
|
+
// Analytics Events (Meta CAPI + Meta Pixel)
|
|
104
107
|
(0, react_1.useEffect)(() => {
|
|
105
|
-
var _a, _b
|
|
108
|
+
var _a, _b;
|
|
109
|
+
const isEnabled = (_a = hotel === null || hotel === void 0 ? void 0 : hotel.integrations) === null || _a === void 0 ? void 0 : _a.includes(core_1.EIntegration.AnalyticsEvents);
|
|
110
|
+
if (isEnabled && (hotel === null || hotel === void 0 ? void 0 : hotel.hotelID) && (hotel === null || hotel === void 0 ? void 0 : hotel.defaultCurrency)) {
|
|
111
|
+
FeatureProvider_1.default.load(AnalyticsEventsFeature_1.default, {
|
|
112
|
+
hotelId: hotel.hotelID,
|
|
113
|
+
currency: hotel.defaultCurrency,
|
|
114
|
+
metaPixelId: hotel.metaPixelId, // TODO: Introduce separate option to load Meta Pixel?
|
|
115
|
+
firePixelEvents: !!hotel.metaPixelId, // TODO: Make this a separate option?
|
|
116
|
+
debug: (_b = hotel.enableAnalyticsDebug) !== null && _b !== void 0 ? _b : false,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}, [hotel === null || hotel === void 0 ? void 0 : hotel.integrations, hotel === null || hotel === void 0 ? void 0 : hotel.hotelID, hotel === null || hotel === void 0 ? void 0 : hotel.defaultCurrency, hotel === null || hotel === void 0 ? void 0 : hotel.metaPixelId, hotel === null || hotel === void 0 ? void 0 : hotel.enableAnalyticsDebug]);
|
|
120
|
+
(0, react_1.useEffect)(() => {
|
|
121
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
106
122
|
const currentBasketRows = basketContext.currentBasketRows;
|
|
107
123
|
let addXRooms = 1;
|
|
108
124
|
// TODO: this probably needs to be the only place this is set, and listen for URL changes
|
|
@@ -186,17 +202,37 @@ function FullPageEngineContextWrapper() {
|
|
|
186
202
|
let roomOccupancy = 1;
|
|
187
203
|
let adults = (_b = parseQueryInt(`adults-${i + 1}`, 1)) !== null && _b !== void 0 ? _b : globalAdults;
|
|
188
204
|
query.delete(`adults-${i + 1}`);
|
|
189
|
-
|
|
205
|
+
// Check mixed occupancy limits first, then fallback to maxOccupancy
|
|
206
|
+
if ((_c = hotel === null || hotel === void 0 ? void 0 : hotel.occupancyLimits) === null || _c === void 0 ? void 0 : _c.highestAdultConfig) {
|
|
207
|
+
if (adults && adults > hotel.occupancyLimits.highestAdultConfig) {
|
|
208
|
+
adults = hotel.occupancyLimits.highestAdultConfig;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else if (adults && (hotel === null || hotel === void 0 ? void 0 : hotel.maxOccupancy) && (roomOccupancy = adults) > hotel.maxOccupancy) {
|
|
190
212
|
adults = undefined;
|
|
191
213
|
}
|
|
192
|
-
let children = (
|
|
214
|
+
let children = (_d = parseQueryInt(`children-${i + 1}`)) !== null && _d !== void 0 ? _d : globalChildren;
|
|
193
215
|
query.delete(`children-${i + 1}`);
|
|
194
|
-
|
|
216
|
+
// Check mixed occupancy limits for children
|
|
217
|
+
if (((_e = hotel === null || hotel === void 0 ? void 0 : hotel.occupancyLimits) === null || _e === void 0 ? void 0 : _e.maxSelectableChildren) && adults) {
|
|
218
|
+
const maxChildren = hotel.occupancyLimits.maxSelectableChildren[adults];
|
|
219
|
+
if (maxChildren !== undefined && children && children > maxChildren) {
|
|
220
|
+
children = maxChildren > 0 ? maxChildren : undefined;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else if (children && (hotel === null || hotel === void 0 ? void 0 : hotel.maxOccupancy) && (roomOccupancy += children) > hotel.maxOccupancy) {
|
|
195
224
|
children = undefined;
|
|
196
225
|
}
|
|
197
|
-
let infants = (
|
|
226
|
+
let infants = (_f = parseQueryInt(`infants-${i + 1}`)) !== null && _f !== void 0 ? _f : globalInfants;
|
|
198
227
|
query.delete(`infants-${i + 1}`);
|
|
199
|
-
|
|
228
|
+
// Check mixed occupancy limits for infants (only if countInfantsInOccupancy is true)
|
|
229
|
+
if ((hotel === null || hotel === void 0 ? void 0 : hotel.countInfantsInOccupancy) && ((_g = hotel === null || hotel === void 0 ? void 0 : hotel.occupancyLimits) === null || _g === void 0 ? void 0 : _g.maxSelectableInfants) && adults) {
|
|
230
|
+
const maxInfants = hotel.occupancyLimits.maxSelectableInfants[adults];
|
|
231
|
+
if (maxInfants !== undefined && infants && infants > maxInfants) {
|
|
232
|
+
infants = maxInfants > 0 ? maxInfants : undefined;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else if (infants && (hotel === null || hotel === void 0 ? void 0 : hotel.maxOccupancy) && hotel.countInfantsInOccupancy && (roomOccupancy += infants) > hotel.maxOccupancy) {
|
|
200
236
|
infants = undefined;
|
|
201
237
|
}
|
|
202
238
|
urlParameterBuilder.rooms[i] = { adults, children, infants };
|
|
@@ -207,7 +243,7 @@ function FullPageEngineContextWrapper() {
|
|
|
207
243
|
let firstBasketRow = undefined;
|
|
208
244
|
const { startDate, endDate, promoCode, promoOnly, rooms } = urlParameterBuilder;
|
|
209
245
|
for (let i = 0; i < addXRooms; i++) {
|
|
210
|
-
const { adults, children, infants } = (
|
|
246
|
+
const { adults, children, infants } = (_h = rooms === null || rooms === void 0 ? void 0 : rooms[i]) !== null && _h !== void 0 ? _h : {};
|
|
211
247
|
const basketRow = new BasketRow_1.default(undefined, undefined, shouldEnableRoomCodeFilter);
|
|
212
248
|
if (startDate) {
|
|
213
249
|
basketRow.setStartDate(startDate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FullPageEngineContextWrapper.js","sourceRoot":"/","sources":["src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n BasketContext,\n BookingEngineContext,\n CompanyContext,\n FullPageBookingEngineUrlParameters,\n FullPageEngineContext,\n FullPageEngineContextType,\n ModalContextWrapper,\n} from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport { PurchaseGiftCardEngine } from '@roomstay/gc-frontend';\nimport dayjs from 'dayjs';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { Navigate, Route, Routes, useLocation, useMatch, useNavigate } from 'react-router-dom';\nimport StepRoute from 'routes/NaturallyProgressedStepRoute';\n\nimport { API_DATE_FORMAT } from '@/api/BaseAPI';\nimport LargeLoader from '@/components/generic/loader/LargeLoader';\nimport { RoomstayMark } from '@/components/generic/RoomstayMark';\nimport ScrollToTop from '@/components/generic/ScrollToTop';\nimport Header from '@/components/navigation/Header';\nimport { PrivateRoute } from '@/containers/PrivateRoute';\nimport { useHistoryConsistentPush } from '@/hooks/HistoryConsistentPush';\nimport { EAppQueryParameters } from '@/models/AppQueryParameters';\nimport BasketRow from '@/models/BasketRow';\nimport RateTypeFilter from '@/models/Room/Filters/RateTypeFilter';\nimport RoomTypeFilter from '@/models/Room/Filters/RoomTypeFilter';\nimport FindReservation, { EFindReservationPath } from '@/pages/findReservation/FindReservation';\nimport FindReservationResults from '@/pages/findReservation/FindReservationResults';\nimport HotelInfo from '@/pages/hotel/HotelInfo';\nimport HotelInfoPlaceholder from '@/pages/hotel/HotelInfoPlaceholder';\nimport Step from '@/pages/steps/Step';\nimport StepHotel from '@/pages/steps/StepHotel/StepHotel';\nimport DerbysoftClickTrackingFeature from '@/providers/feature/DerbysoftClickTrackingFeature';\nimport FeaturedPromoFeature from '@/providers/feature/FeaturedPromoFeature';\nimport GiftCardFeature from '@/providers/feature/GiftCardFeature';\nimport MemberPortalFeature from '@/providers/feature/MemberPortalFeature';\nimport FeatureProvider from '@/providers/FeatureProvider';\nimport getStepRoom from '@/util/GetStepRoom';\nimport { ROUTES } from '@/util/RouteManager';\nimport StepManager from '@/util/StepManager';\n\nimport { EngineBodyLayout } from './EngineBodyLayout';\nimport { EnginePageLayout } from './EnginePageLayout';\n\nconst AccountRouter = React.lazy(() =>\n import('@/pages/account/AccountRouter').then(({ AccountRouter }) => ({\n default: AccountRouter,\n }))\n);\n\ndeclare const GIFT_CARD_API_URL: string;\ndeclare const GIFT_CARD_ASSET_URL: string;\n\nexport function FullPageEngineContextWrapper() {\n const basketContext = useContext(BasketContext);\n const ccx = useContext(CompanyContext);\n const beContext = useContext(BookingEngineContext);\n\n const [engineReady, setEngineReady] = useState(false);\n const [urlFlagsParsed, setUrlFlagsParsed] = useState(false);\n const [urlParameters, setUrlParameters] = useState<FullPageBookingEngineUrlParameters>({});\n\n const [currentStep, setCurrentStep] = useState<Step>(StepManager.getStepFromName(beContext.engine.getInitialSession()?.step as string) ?? StepManager.getFirstStep());\n const [initialStep, setInitialStep] = useState<Step>(StepManager.getFirstStep());\n\n const { hotel } = useCurrentHotel();\n\n const location = useLocation();\n const historyConsistentPush = useHistoryConsistentPush();\n const navigate = useNavigate();\n\n const isInStepRoot = useMatch(StepManager.STEP_BASE);\n\n useEffect(() => {\n beContext.sessionProvider?.updateSession({ step: currentStep.getName() });\n\n if (currentStep === StepHotel) {\n ccx.changeHotel(null);\n }\n }, [currentStep]);\n\n useEffect(() => {\n if (hotel?.company?.enableDerbysoftFeed) {\n FeatureProvider.load(DerbysoftClickTrackingFeature);\n }\n }, [hotel?.company?.enableDerbysoftFeed]);\n\n useEffect(() => {\n const currentBasketRows = basketContext.currentBasketRows;\n\n let addXRooms = 1;\n\n // TODO: this probably needs to be the only place this is set, and listen for URL changes\n if (currentBasketRows.length === 0) {\n const urlParameterBuilder: FullPageBookingEngineUrlParameters = {};\n // The Choose Hotel step should not apply the room filter\n const shouldEnableRoomCodeFilter = currentStep.getName() !== StepHotel.getName();\n\n if (location.search) {\n const query = new URLSearchParams(location.search);\n\n const format = API_DATE_FORMAT;\n\n let start = dayjs(query.get(EAppQueryParameters.Arrive), format);\n let end = dayjs(query.get(EAppQueryParameters.Depart), format);\n\n const promoCode = query.get(EAppQueryParameters.PromoCode);\n const promoOnly = query.get(EAppQueryParameters.PromoOnly);\n\n const promoFeatured = query.get(EAppQueryParameters.PromoFeatured);\n\n if (promoCode) {\n urlParameterBuilder.promoCode = promoCode;\n }\n\n if (promoOnly && promoOnly.toLowerCase() !== 'false') {\n urlParameterBuilder.promoOnly = Boolean(promoOnly);\n }\n\n if (promoFeatured && promoFeatured.toLowerCase() !== 'false') {\n FeatureProvider.load(FeaturedPromoFeature);\n urlParameterBuilder.promoFeatured = true;\n }\n\n const updatedCurrentFilters = { ...beContext.currentFilters };\n const roomCode = query.get(EAppQueryParameters.Room);\n\n if (roomCode && shouldEnableRoomCodeFilter) {\n // TODO: Refactor this to come from this context instead.\n updatedCurrentFilters['RoomType'] = new RoomTypeFilter([roomCode]);\n }\n\n const rateCode = query.get(EAppQueryParameters.Rate);\n if (rateCode) {\n // TODO: Refactor this to come from this context instead.\n updatedCurrentFilters['RateType'] = new RateTypeFilter([rateCode]);\n }\n beContext.setCurrentFilters(updatedCurrentFilters);\n\n const hotelId = query.get(EAppQueryParameters.Hotel);\n\n if (hotelId) {\n if (ccx.changeHotel(hotelId)) {\n if (!start.isValid()) {\n start = dayjs().add(1, 'day');\n }\n\n if (!end.isValid()) {\n end = start.add(1, 'day');\n }\n\n setInitialStep(getStepRoom());\n }\n\n urlParameterBuilder.hotelId = hotelId;\n }\n\n const defaultCity = query.get(EAppQueryParameters.DefaultCity);\n if (defaultCity) {\n urlParameterBuilder.defaultCity = defaultCity;\n }\n\n // We're doing dates last, as other properties, like hotelID might change them if they're not already set\n if (start.isValid() && end.isValid()) {\n const today = dayjs().startOf('day');\n\n if (start.isBefore(today)) {\n start = today;\n }\n\n if (end.isBefore(start) || end.isSame(start)) {\n end = start.add(1, 'day');\n } else if (end.isBefore(today.add(1, 'day')) || end.isSame(today)) {\n end = today.add(1, 'day');\n }\n\n urlParameterBuilder.startDate = start;\n urlParameterBuilder.endDate = end;\n }\n\n const parseQueryInt = (key: string, min = 0): number | undefined => {\n const value = Number.parseInt(query.get(key) ?? '', 10);\n return Number.isNaN(value) || value < min ? undefined : value;\n };\n\n addXRooms = parseQueryInt(EAppQueryParameters.Rooms, 1) ?? 1;\n const globalAdults = parseQueryInt(EAppQueryParameters.Adults, 1);\n const globalChildren = parseQueryInt(EAppQueryParameters.Children);\n const globalInfants = parseQueryInt(EAppQueryParameters.Infants);\n\n urlParameterBuilder.rooms = [];\n\n for (let i = 0; i < addXRooms; i++) {\n let roomOccupancy = 1;\n\n let adults = parseQueryInt(`adults-${i + 1}`, 1) ?? globalAdults;\n query.delete(`adults-${i + 1}`);\n\n if (adults && hotel?.maxOccupancy && (roomOccupancy = adults) > hotel.maxOccupancy) {\n adults = undefined;\n }\n\n let children = parseQueryInt(`children-${i + 1}`) ?? globalChildren;\n query.delete(`children-${i + 1}`);\n\n if (children && hotel?.maxOccupancy && (roomOccupancy += children) > hotel.maxOccupancy) {\n children = undefined;\n }\n\n let infants = parseQueryInt(`infants-${i + 1}`) ?? globalInfants;\n query.delete(`infants-${i + 1}`);\n\n if (infants && hotel?.maxOccupancy && hotel.countInfantsInOccupancy && (roomOccupancy += infants) > hotel.maxOccupancy) {\n infants = undefined;\n }\n\n urlParameterBuilder.rooms[i] = { adults, children, infants };\n }\n\n navigate({ search: query.toString() }, { replace: true });\n setUrlParameters(urlParameterBuilder);\n }\n\n let firstBasketRow: BasketRow | undefined = undefined;\n const { startDate, endDate, promoCode, promoOnly, rooms } = urlParameterBuilder;\n for (let i = 0; i < addXRooms; i++) {\n const { adults, children, infants } = rooms?.[i] ?? {};\n const basketRow = new BasketRow(undefined, undefined, shouldEnableRoomCodeFilter);\n\n if (startDate) {\n basketRow.setStartDate(startDate);\n }\n\n if (endDate) {\n basketRow.setEndDate(endDate);\n }\n\n if (promoCode) {\n basketRow.setPromoCode(promoCode);\n }\n\n if (promoOnly) {\n basketRow.setPromoOnly(promoOnly);\n }\n\n if (adults) {\n basketRow.setAdults(adults);\n }\n\n if (children) {\n basketRow.setChildren(children);\n }\n\n if (infants) {\n basketRow.setInfants(infants);\n }\n\n basketContext.addBasketRow(basketRow);\n\n if (i === 0) {\n firstBasketRow = basketRow;\n }\n }\n\n if (firstBasketRow?.getStartDate() && firstBasketRow.getEndDate() && StepManager.getFirstStep() !== StepHotel) {\n basketContext.selectBasketRow(firstBasketRow);\n setInitialStep(getStepRoom());\n }\n } else {\n const initialSession = beContext.engine.getInitialSession();\n if (initialSession) {\n setInitialStep(StepManager.getStepFromName(initialSession.step) as Step);\n }\n }\n\n setUrlFlagsParsed(true);\n }, []);\n\n /**\n * Engine Ready useEffect, used to deffer loading the UI until everything engine wise is set up properly\n */\n useEffect(() => {\n if (!engineReady) {\n if (ccx.hotels.length > 0 && urlFlagsParsed) {\n setEngineReady(true);\n }\n }\n }, [ccx.hotels, urlFlagsParsed]);\n\n useEffect(() => {\n if (engineReady) {\n if (isInStepRoot && initialStep) {\n // We want to respect the browsers pathname, and only redirect to a defined step if\n // the pathname isn't set, or matches an unknown page.\n\n // Is the current location in the path? i.e does the user want to be somewhere specific\n let pathInLoadedSteps = false;\n for (const step of StepManager.getSteps()) {\n // Using match instead of equals as some clients have skipped the trailing slash\n // We also want to make sure to only match the start of the path, in case step contains nested paths.\n if (location.pathname.match(new RegExp(`${step.getStepUrl()}.+`, 'ig'))) {\n pathInLoadedSteps = true;\n break;\n }\n }\n\n // We're in /step/ but on a not recognized one.\n if (!pathInLoadedSteps) {\n historyConsistentPush(initialStep.getStepUrl());\n }\n }\n }\n }, [engineReady]);\n\n useEffect(() => {\n if (hotel) {\n if (hotel.currentRoomSort) {\n beContext.setCurrentRoomSort(hotel.currentRoomSort);\n }\n if (hotel.currentRoomRateSort) {\n beContext.setCurrentRoomRateSort(hotel.currentRoomRateSort);\n }\n }\n }, [hotel?.currentRoomSort, hotel?.currentRoomRateSort]);\n\n const workingContext: FullPageEngineContextType = { urlParameters, currentStep, setCurrentStep };\n\n return (\n <FullPageEngineContext.Provider value={workingContext}>\n <ModalContextWrapper>\n <ScrollToTop />\n <header className=\"engine-header\">\n <Header />\n </header>\n\n {engineReady && (\n <Routes>\n <Route path=\"/\" element={<Navigate to={StepManager.getFirstStep().getStepUrl()} replace />} />\n\n <Route path=\"/step\" element={<EngineBodyLayout />}>\n {StepManager.getSteps().map((step: Step) => (\n <Route key={step.getName()} path={`${step.getStepUrl()}*`} element={<StepRoute step={step} />} />\n ))}\n </Route>\n\n {/**\n * We aren't on a /step/ path, or the root path, so it's probably one of the engine-page paths.\n * If no matching path is found, we'll redirect back to the first step.\n */}\n <Route path=\"/*\" element={<EnginePageLayout />}>\n {/* TODO: This startsWith('/') check should be temporary. We should update the Route in client config after this is merged. */}\n <Route\n path={ROUTES.HOTEL_INFO.startsWith('/') ? ROUTES.HOTEL_INFO.substring(1) : ROUTES.HOTEL_INFO}\n element={\n <React.Suspense fallback={<HotelInfoPlaceholder />}>\n <HotelInfo />\n </React.Suspense>\n }\n />\n\n {Object.values(EFindReservationPath)\n .filter((path) => MemberPortalFeature.isActive() || path === EFindReservationPath.FindReservation)\n .map((path) => (\n <Route\n key={path}\n path={path}\n element={\n <React.Suspense fallback={<div>Loading...</div>}>\n <FindReservation />\n </React.Suspense>\n }\n />\n ))}\n\n <Route\n path=\"find-reservation/:ref/:email\"\n element={\n <React.Suspense fallback={<div>Loading...</div>}>\n <FindReservationResults />\n </React.Suspense>\n }\n />\n\n <Route\n path=\"account/*\"\n element={\n <PrivateRoute>\n {MemberPortalFeature.isActive() && (\n <React.Suspense\n fallback={\n <div>\n <LargeLoader />\n </div>\n }\n >\n <AccountRouter />\n </React.Suspense>\n )}\n </PrivateRoute>\n }\n />\n\n {GiftCardFeature.isActive() && GiftCardFeature.config && (\n <Route\n path=\"gift-cards/purchase\"\n element={\n <React.Suspense fallback={<div>Loading...</div>}>\n <PurchaseGiftCardEngine\n companyId={GiftCardFeature.config.companyId}\n companyName={hotel?.name ?? ''}\n logoUrl={GiftCardFeature.config.logoUrl ?? hotel?.logo.toString() ?? ''}\n homeUrl={hotel?.hotelUrl ?? ''}\n apiUrl={GIFT_CARD_API_URL}\n assetUrl={GIFT_CARD_ASSET_URL}\n />\n </React.Suspense>\n }\n />\n )}\n\n {/* We haven't found a matching path, so just redirect to the first step. */}\n <Route path=\"*\" element={<Navigate to={StepManager.getFirstStep().getStepUrl()} replace />} />\n </Route>\n </Routes>\n )}\n\n <RoomstayMark />\n </ModalContextWrapper>\n </FullPageEngineContext.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FullPageEngineContextWrapper.js","sourceRoot":"/","sources":["src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n BasketContext,\n BookingEngineContext,\n CompanyContext,\n FullPageBookingEngineUrlParameters,\n FullPageEngineContext,\n FullPageEngineContextType,\n ModalContextWrapper,\n} from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport { EIntegration } from '@roomstay/core';\nimport { PurchaseGiftCardEngine } from '@roomstay/gc-frontend';\nimport dayjs from 'dayjs';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { Navigate, Route, Routes, useLocation, useMatch, useNavigate } from 'react-router-dom';\nimport StepRoute from 'routes/NaturallyProgressedStepRoute';\n\nimport { API_DATE_FORMAT } from '@/api/BaseAPI';\nimport LargeLoader from '@/components/generic/loader/LargeLoader';\nimport { RoomstayMark } from '@/components/generic/RoomstayMark';\nimport ScrollToTop from '@/components/generic/ScrollToTop';\nimport Header from '@/components/navigation/Header';\nimport { PrivateRoute } from '@/containers/PrivateRoute';\nimport { useHistoryConsistentPush } from '@/hooks/HistoryConsistentPush';\nimport { EAppQueryParameters } from '@/models/AppQueryParameters';\nimport BasketRow from '@/models/BasketRow';\nimport RateTypeFilter from '@/models/Room/Filters/RateTypeFilter';\nimport RoomTypeFilter from '@/models/Room/Filters/RoomTypeFilter';\nimport FindReservation, { EFindReservationPath } from '@/pages/findReservation/FindReservation';\nimport FindReservationResults from '@/pages/findReservation/FindReservationResults';\nimport HotelInfo from '@/pages/hotel/HotelInfo';\nimport HotelInfoPlaceholder from '@/pages/hotel/HotelInfoPlaceholder';\nimport Step from '@/pages/steps/Step';\nimport StepHotel from '@/pages/steps/StepHotel/StepHotel';\nimport AnalyticsEventsFeature from '@/providers/feature/AnalyticsEventsFeature';\nimport DerbysoftClickTrackingFeature from '@/providers/feature/DerbysoftClickTrackingFeature';\nimport FeaturedPromoFeature from '@/providers/feature/FeaturedPromoFeature';\nimport GiftCardFeature from '@/providers/feature/GiftCardFeature';\nimport MemberPortalFeature from '@/providers/feature/MemberPortalFeature';\nimport FeatureProvider from '@/providers/FeatureProvider';\nimport getStepRoom from '@/util/GetStepRoom';\nimport { ROUTES } from '@/util/RouteManager';\nimport StepManager from '@/util/StepManager';\n\nimport { EngineBodyLayout } from './EngineBodyLayout';\nimport { EnginePageLayout } from './EnginePageLayout';\n\nconst AccountRouter = React.lazy(() =>\n import('@/pages/account/AccountRouter').then(({ AccountRouter }) => ({\n default: AccountRouter,\n }))\n);\n\ndeclare const GIFT_CARD_API_URL: string;\ndeclare const GIFT_CARD_ASSET_URL: string;\n\nexport function FullPageEngineContextWrapper() {\n const basketContext = useContext(BasketContext);\n const ccx = useContext(CompanyContext);\n const beContext = useContext(BookingEngineContext);\n\n const [engineReady, setEngineReady] = useState(false);\n const [urlFlagsParsed, setUrlFlagsParsed] = useState(false);\n const [urlParameters, setUrlParameters] = useState<FullPageBookingEngineUrlParameters>({});\n\n const [currentStep, setCurrentStep] = useState<Step>(StepManager.getStepFromName(beContext.engine.getInitialSession()?.step as string) ?? StepManager.getFirstStep());\n const [initialStep, setInitialStep] = useState<Step>(StepManager.getFirstStep());\n\n const { hotel } = useCurrentHotel();\n\n const location = useLocation();\n const historyConsistentPush = useHistoryConsistentPush();\n const navigate = useNavigate();\n\n const isInStepRoot = useMatch(StepManager.STEP_BASE);\n\n useEffect(() => {\n beContext.sessionProvider?.updateSession({ step: currentStep.getName() });\n\n if (currentStep === StepHotel) {\n ccx.changeHotel(null);\n }\n }, [currentStep]);\n\n useEffect(() => {\n if (hotel?.company?.enableDerbysoftFeed) {\n FeatureProvider.load(DerbysoftClickTrackingFeature);\n }\n }, [hotel?.company?.enableDerbysoftFeed]);\n\n // Analytics Events (Meta CAPI + Meta Pixel)\n useEffect(() => {\n const isEnabled = hotel?.integrations?.includes(EIntegration.AnalyticsEvents);\n if (isEnabled && hotel?.hotelID && hotel?.defaultCurrency) {\n FeatureProvider.load(AnalyticsEventsFeature, {\n hotelId: hotel.hotelID,\n currency: hotel.defaultCurrency,\n metaPixelId: hotel.metaPixelId, // TODO: Introduce separate option to load Meta Pixel?\n firePixelEvents: !!hotel.metaPixelId, // TODO: Make this a separate option?\n debug: hotel.enableAnalyticsDebug ?? false,\n });\n }\n }, [hotel?.integrations, hotel?.hotelID, hotel?.defaultCurrency, hotel?.metaPixelId, hotel?.enableAnalyticsDebug]);\n\n useEffect(() => {\n const currentBasketRows = basketContext.currentBasketRows;\n\n let addXRooms = 1;\n\n // TODO: this probably needs to be the only place this is set, and listen for URL changes\n if (currentBasketRows.length === 0) {\n const urlParameterBuilder: FullPageBookingEngineUrlParameters = {};\n // The Choose Hotel step should not apply the room filter\n const shouldEnableRoomCodeFilter = currentStep.getName() !== StepHotel.getName();\n\n if (location.search) {\n const query = new URLSearchParams(location.search);\n\n const format = API_DATE_FORMAT;\n\n let start = dayjs(query.get(EAppQueryParameters.Arrive), format);\n let end = dayjs(query.get(EAppQueryParameters.Depart), format);\n\n const promoCode = query.get(EAppQueryParameters.PromoCode);\n const promoOnly = query.get(EAppQueryParameters.PromoOnly);\n\n const promoFeatured = query.get(EAppQueryParameters.PromoFeatured);\n\n if (promoCode) {\n urlParameterBuilder.promoCode = promoCode;\n }\n\n if (promoOnly && promoOnly.toLowerCase() !== 'false') {\n urlParameterBuilder.promoOnly = Boolean(promoOnly);\n }\n\n if (promoFeatured && promoFeatured.toLowerCase() !== 'false') {\n FeatureProvider.load(FeaturedPromoFeature);\n urlParameterBuilder.promoFeatured = true;\n }\n\n const updatedCurrentFilters = { ...beContext.currentFilters };\n const roomCode = query.get(EAppQueryParameters.Room);\n\n if (roomCode && shouldEnableRoomCodeFilter) {\n // TODO: Refactor this to come from this context instead.\n updatedCurrentFilters['RoomType'] = new RoomTypeFilter([roomCode]);\n }\n\n const rateCode = query.get(EAppQueryParameters.Rate);\n if (rateCode) {\n // TODO: Refactor this to come from this context instead.\n updatedCurrentFilters['RateType'] = new RateTypeFilter([rateCode]);\n }\n beContext.setCurrentFilters(updatedCurrentFilters);\n\n const hotelId = query.get(EAppQueryParameters.Hotel);\n\n if (hotelId) {\n if (ccx.changeHotel(hotelId)) {\n if (!start.isValid()) {\n start = dayjs().add(1, 'day');\n }\n\n if (!end.isValid()) {\n end = start.add(1, 'day');\n }\n\n setInitialStep(getStepRoom());\n }\n\n urlParameterBuilder.hotelId = hotelId;\n }\n\n const defaultCity = query.get(EAppQueryParameters.DefaultCity);\n if (defaultCity) {\n urlParameterBuilder.defaultCity = defaultCity;\n }\n\n // We're doing dates last, as other properties, like hotelID might change them if they're not already set\n if (start.isValid() && end.isValid()) {\n const today = dayjs().startOf('day');\n\n if (start.isBefore(today)) {\n start = today;\n }\n\n if (end.isBefore(start) || end.isSame(start)) {\n end = start.add(1, 'day');\n } else if (end.isBefore(today.add(1, 'day')) || end.isSame(today)) {\n end = today.add(1, 'day');\n }\n\n urlParameterBuilder.startDate = start;\n urlParameterBuilder.endDate = end;\n }\n\n const parseQueryInt = (key: string, min = 0): number | undefined => {\n const value = Number.parseInt(query.get(key) ?? '', 10);\n return Number.isNaN(value) || value < min ? undefined : value;\n };\n\n addXRooms = parseQueryInt(EAppQueryParameters.Rooms, 1) ?? 1;\n const globalAdults = parseQueryInt(EAppQueryParameters.Adults, 1);\n const globalChildren = parseQueryInt(EAppQueryParameters.Children);\n const globalInfants = parseQueryInt(EAppQueryParameters.Infants);\n\n urlParameterBuilder.rooms = [];\n\n for (let i = 0; i < addXRooms; i++) {\n let roomOccupancy = 1;\n\n let adults = parseQueryInt(`adults-${i + 1}`, 1) ?? globalAdults;\n query.delete(`adults-${i + 1}`);\n\n // Check mixed occupancy limits first, then fallback to maxOccupancy\n if (hotel?.occupancyLimits?.highestAdultConfig) {\n if (adults && adults > hotel.occupancyLimits.highestAdultConfig) {\n adults = hotel.occupancyLimits.highestAdultConfig;\n }\n } else if (adults && hotel?.maxOccupancy && (roomOccupancy = adults) > hotel.maxOccupancy) {\n adults = undefined;\n }\n\n let children = parseQueryInt(`children-${i + 1}`) ?? globalChildren;\n query.delete(`children-${i + 1}`);\n\n // Check mixed occupancy limits for children\n if (hotel?.occupancyLimits?.maxSelectableChildren && adults) {\n const maxChildren = hotel.occupancyLimits.maxSelectableChildren[adults];\n if (maxChildren !== undefined && children && children > maxChildren) {\n children = maxChildren > 0 ? maxChildren : undefined;\n }\n } else if (children && hotel?.maxOccupancy && (roomOccupancy += children) > hotel.maxOccupancy) {\n children = undefined;\n }\n\n let infants = parseQueryInt(`infants-${i + 1}`) ?? globalInfants;\n query.delete(`infants-${i + 1}`);\n\n // Check mixed occupancy limits for infants (only if countInfantsInOccupancy is true)\n if (hotel?.countInfantsInOccupancy && hotel?.occupancyLimits?.maxSelectableInfants && adults) {\n const maxInfants = hotel.occupancyLimits.maxSelectableInfants[adults];\n if (maxInfants !== undefined && infants && infants > maxInfants) {\n infants = maxInfants > 0 ? maxInfants : undefined;\n }\n } else if (infants && hotel?.maxOccupancy && hotel.countInfantsInOccupancy && (roomOccupancy += infants) > hotel.maxOccupancy) {\n infants = undefined;\n }\n\n urlParameterBuilder.rooms[i] = { adults, children, infants };\n }\n\n navigate({ search: query.toString() }, { replace: true });\n setUrlParameters(urlParameterBuilder);\n }\n\n let firstBasketRow: BasketRow | undefined = undefined;\n const { startDate, endDate, promoCode, promoOnly, rooms } = urlParameterBuilder;\n for (let i = 0; i < addXRooms; i++) {\n const { adults, children, infants } = rooms?.[i] ?? {};\n const basketRow = new BasketRow(undefined, undefined, shouldEnableRoomCodeFilter);\n\n if (startDate) {\n basketRow.setStartDate(startDate);\n }\n\n if (endDate) {\n basketRow.setEndDate(endDate);\n }\n\n if (promoCode) {\n basketRow.setPromoCode(promoCode);\n }\n\n if (promoOnly) {\n basketRow.setPromoOnly(promoOnly);\n }\n\n if (adults) {\n basketRow.setAdults(adults);\n }\n\n if (children) {\n basketRow.setChildren(children);\n }\n\n if (infants) {\n basketRow.setInfants(infants);\n }\n\n basketContext.addBasketRow(basketRow);\n\n if (i === 0) {\n firstBasketRow = basketRow;\n }\n }\n\n if (firstBasketRow?.getStartDate() && firstBasketRow.getEndDate() && StepManager.getFirstStep() !== StepHotel) {\n basketContext.selectBasketRow(firstBasketRow);\n setInitialStep(getStepRoom());\n }\n } else {\n const initialSession = beContext.engine.getInitialSession();\n if (initialSession) {\n setInitialStep(StepManager.getStepFromName(initialSession.step) as Step);\n }\n }\n\n setUrlFlagsParsed(true);\n }, []);\n\n /**\n * Engine Ready useEffect, used to deffer loading the UI until everything engine wise is set up properly\n */\n useEffect(() => {\n if (!engineReady) {\n if (ccx.hotels.length > 0 && urlFlagsParsed) {\n setEngineReady(true);\n }\n }\n }, [ccx.hotels, urlFlagsParsed]);\n\n useEffect(() => {\n if (engineReady) {\n if (isInStepRoot && initialStep) {\n // We want to respect the browsers pathname, and only redirect to a defined step if\n // the pathname isn't set, or matches an unknown page.\n\n // Is the current location in the path? i.e does the user want to be somewhere specific\n let pathInLoadedSteps = false;\n for (const step of StepManager.getSteps()) {\n // Using match instead of equals as some clients have skipped the trailing slash\n // We also want to make sure to only match the start of the path, in case step contains nested paths.\n if (location.pathname.match(new RegExp(`${step.getStepUrl()}.+`, 'ig'))) {\n pathInLoadedSteps = true;\n break;\n }\n }\n\n // We're in /step/ but on a not recognized one.\n if (!pathInLoadedSteps) {\n historyConsistentPush(initialStep.getStepUrl());\n }\n }\n }\n }, [engineReady]);\n\n useEffect(() => {\n if (hotel) {\n if (hotel.currentRoomSort) {\n beContext.setCurrentRoomSort(hotel.currentRoomSort);\n }\n if (hotel.currentRoomRateSort) {\n beContext.setCurrentRoomRateSort(hotel.currentRoomRateSort);\n }\n }\n }, [hotel?.currentRoomSort, hotel?.currentRoomRateSort]);\n\n const workingContext: FullPageEngineContextType = { urlParameters, currentStep, setCurrentStep };\n\n return (\n <FullPageEngineContext.Provider value={workingContext}>\n <ModalContextWrapper>\n <ScrollToTop />\n <header className=\"engine-header\">\n <Header />\n </header>\n\n {engineReady && (\n <Routes>\n <Route path=\"/\" element={<Navigate to={StepManager.getFirstStep().getStepUrl()} replace />} />\n\n <Route path=\"/step\" element={<EngineBodyLayout />}>\n {StepManager.getSteps().map((step: Step) => (\n <Route key={step.getName()} path={`${step.getStepUrl()}*`} element={<StepRoute step={step} />} />\n ))}\n </Route>\n\n {/**\n * We aren't on a /step/ path, or the root path, so it's probably one of the engine-page paths.\n * If no matching path is found, we'll redirect back to the first step.\n */}\n <Route path=\"/*\" element={<EnginePageLayout />}>\n {/* TODO: This startsWith('/') check should be temporary. We should update the Route in client config after this is merged. */}\n <Route\n path={ROUTES.HOTEL_INFO.startsWith('/') ? ROUTES.HOTEL_INFO.substring(1) : ROUTES.HOTEL_INFO}\n element={\n <React.Suspense fallback={<HotelInfoPlaceholder />}>\n <HotelInfo />\n </React.Suspense>\n }\n />\n\n {Object.values(EFindReservationPath)\n .filter((path) => MemberPortalFeature.isActive() || path === EFindReservationPath.FindReservation)\n .map((path) => (\n <Route\n key={path}\n path={path}\n element={\n <React.Suspense fallback={<div>Loading...</div>}>\n <FindReservation />\n </React.Suspense>\n }\n />\n ))}\n\n <Route\n path=\"find-reservation/:ref/:email\"\n element={\n <React.Suspense fallback={<div>Loading...</div>}>\n <FindReservationResults />\n </React.Suspense>\n }\n />\n\n <Route\n path=\"account/*\"\n element={\n <PrivateRoute>\n {MemberPortalFeature.isActive() && (\n <React.Suspense\n fallback={\n <div>\n <LargeLoader />\n </div>\n }\n >\n <AccountRouter />\n </React.Suspense>\n )}\n </PrivateRoute>\n }\n />\n\n {GiftCardFeature.isActive() && GiftCardFeature.config && (\n <Route\n path=\"gift-cards/purchase\"\n element={\n <React.Suspense fallback={<div>Loading...</div>}>\n <PurchaseGiftCardEngine\n companyId={GiftCardFeature.config.companyId}\n companyName={hotel?.name ?? ''}\n logoUrl={GiftCardFeature.config.logoUrl ?? hotel?.logo.toString() ?? ''}\n homeUrl={hotel?.hotelUrl ?? ''}\n apiUrl={GIFT_CARD_API_URL}\n assetUrl={GIFT_CARD_ASSET_URL}\n />\n </React.Suspense>\n }\n />\n )}\n\n {/* We haven't found a matching path, so just redirect to the first step. */}\n <Route path=\"*\" element={<Navigate to={StepManager.getFirstStep().getStepUrl()} replace />} />\n </Route>\n </Routes>\n )}\n\n <RoomstayMark />\n </ModalContextWrapper>\n </FullPageEngineContext.Provider>\n );\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.paypalPaymentHandler = void 0;
|
|
16
|
+
const core_1 = require("@roomstay/core");
|
|
17
|
+
const react_1 = __importDefault(require("react"));
|
|
18
|
+
const PayPalPaymentOption_1 = require("../../components/steps/confirmation/PayPalPaymentOption/PayPalPaymentOption");
|
|
19
|
+
const hooks_1 = require("../../hooks");
|
|
20
|
+
const paypalPaymentHandler = () => {
|
|
21
|
+
const { hotel } = (0, hooks_1.useCurrentHotel)();
|
|
22
|
+
return {
|
|
23
|
+
name: 'PayPal',
|
|
24
|
+
isAvailable: (hotel === null || hotel === void 0 ? void 0 : hotel.cardProcessor) === core_1.EHotelCardProcessor.PayPal,
|
|
25
|
+
isExclusive: true,
|
|
26
|
+
requireBookingPlaced: true,
|
|
27
|
+
hasCustomConfirmButton: true,
|
|
28
|
+
bookingPaymentMethod: core_1.EBookingPaymentMethod.Card,
|
|
29
|
+
onConfirm: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
30
|
+
return { success: true, retryPayment: false, message: '' };
|
|
31
|
+
}),
|
|
32
|
+
getBookingPaymentRequestObject: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
+
return {
|
|
34
|
+
Method: core_1.EBookingPaymentMethod.Card,
|
|
35
|
+
};
|
|
36
|
+
}),
|
|
37
|
+
renderPaymentInput: () => react_1.default.createElement(PayPalPaymentOption_1.PayPalPaymentOption, null),
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
exports.paypalPaymentHandler = paypalPaymentHandler;
|
|
41
|
+
//# sourceMappingURL=PayPalPaymentHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PayPalPaymentHandler.js","sourceRoot":"/","sources":["src/handlers/payment/PayPalPaymentHandler.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yCAA4E;AAC5E,kDAA0B;AAE1B,iHAA8G;AAE9G,mCAA0C;AAEnC,MAAM,oBAAoB,GAAG,GAAmB,EAAE;IACrD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,uBAAe,GAAE,CAAC;IAEpC,OAAO;QACH,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,MAAK,0BAAmB,CAAC,MAAM;QAChE,WAAW,EAAE,IAAI;QACjB,oBAAoB,EAAE,IAAI;QAC1B,sBAAsB,EAAE,IAAI;QAC5B,oBAAoB,EAAE,4BAAqB,CAAC,IAAI;QAChD,SAAS,EAAE,GAAS,EAAE;YAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC/D,CAAC,CAAA;QACD,8BAA8B,EAAE,GAAS,EAAE;YACvC,OAAO;gBACH,MAAM,EAAE,4BAAqB,CAAC,IAAI;aACrC,CAAC;QACN,CAAC,CAAA;QACD,kBAAkB,EAAE,GAAG,EAAE,CAAC,8BAAC,yCAAmB,OAAG;KACpD,CAAC;AACN,CAAC,CAAC;AApBW,QAAA,oBAAoB,wBAoB/B","sourcesContent":["import { EBookingPaymentMethod, EHotelCardProcessor } from '@roomstay/core';\nimport React from 'react';\n\nimport { PayPalPaymentOption } from '@/components/steps/confirmation/PayPalPaymentOption/PayPalPaymentOption';\nimport { PaymentHandler } from '@/handlers/payment/PaymentHandler';\nimport { useCurrentHotel } from '@/hooks';\n\nexport const paypalPaymentHandler = (): PaymentHandler => {\n const { hotel } = useCurrentHotel();\n\n return {\n name: 'PayPal',\n isAvailable: hotel?.cardProcessor === EHotelCardProcessor.PayPal,\n isExclusive: true,\n requireBookingPlaced: true,\n hasCustomConfirmButton: true,\n bookingPaymentMethod: EBookingPaymentMethod.Card,\n onConfirm: async () => {\n return { success: true, retryPayment: false, message: '' };\n },\n getBookingPaymentRequestObject: async () => {\n return {\n Method: EBookingPaymentMethod.Card,\n };\n },\n renderPaymentInput: () => <PayPalPaymentOption />,\n };\n};\n"]}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
export declare const useSearchScopeHook: () => {
|
|
2
|
-
getMaxSelectableAdults: ({ adults, children }: {
|
|
2
|
+
getMaxSelectableAdults: ({ adults, children, infants }: {
|
|
3
3
|
adults: number;
|
|
4
4
|
children?: number;
|
|
5
|
+
infants?: number;
|
|
5
6
|
}) => number;
|
|
6
7
|
getMaxSelectableChildren: ({ adults }: {
|
|
7
8
|
adults: number;
|
|
8
9
|
}) => number;
|
|
9
|
-
getMaxSelectableInfants: (
|
|
10
|
+
getMaxSelectableInfants: ({ adults }: {
|
|
11
|
+
adults: number;
|
|
12
|
+
}) => number;
|
|
10
13
|
showChildren: boolean;
|
|
11
14
|
};
|
|
@@ -3,27 +3,70 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.useSearchScopeHook = void 0;
|
|
4
4
|
const CurrentHotelHook_1 = require("./CurrentHotelHook");
|
|
5
5
|
const useSearchScopeHook = () => {
|
|
6
|
-
var _a;
|
|
6
|
+
var _a, _b;
|
|
7
7
|
const { hotel } = (0, CurrentHotelHook_1.useCurrentHotel)();
|
|
8
|
-
const
|
|
8
|
+
const limits = hotel === null || hotel === void 0 ? void 0 : hotel.occupancyLimits;
|
|
9
|
+
const countInfants = (_a = hotel === null || hotel === void 0 ? void 0 : hotel.countInfantsInOccupancy) !== null && _a !== void 0 ? _a : false;
|
|
10
|
+
const getOccupancyConfig = (adults) => {
|
|
11
|
+
if (!limits)
|
|
12
|
+
return null;
|
|
13
|
+
if (adults > limits.highestAdultConfig)
|
|
14
|
+
return null;
|
|
15
|
+
if (limits.maxSelectableChildren[adults] === undefined)
|
|
16
|
+
return null;
|
|
17
|
+
return {
|
|
18
|
+
children: limits.maxSelectableChildren[adults],
|
|
19
|
+
infants: limits.maxSelectableInfants[adults],
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
const getMaxSelectableAdults = ({ adults, children = 0, infants = 0 }) => {
|
|
9
23
|
var _a, _b;
|
|
10
|
-
const maxOccupancy = Math.min((_a = hotel === null || hotel === void 0 ? void 0 : hotel.maxAdults) !== null && _a !== void 0 ? _a :
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
24
|
+
const maxOccupancy = Math.min((_a = hotel === null || hotel === void 0 ? void 0 : hotel.maxAdults) !== null && _a !== void 0 ? _a : Number.MAX_VALUE, (_b = hotel === null || hotel === void 0 ? void 0 : hotel.maxOccupancy) !== null && _b !== void 0 ? _b : 0);
|
|
25
|
+
if (limits) {
|
|
26
|
+
let maxAdults = 0;
|
|
27
|
+
for (let adultCount = 1; adultCount <= limits.highestAdultConfig; adultCount++) {
|
|
28
|
+
const config = getOccupancyConfig(adultCount);
|
|
29
|
+
if (!config) {
|
|
30
|
+
// No config for this adult count - use standard occupancy logic
|
|
31
|
+
const totalOccupancy = adultCount + children + (countInfants ? infants : 0);
|
|
32
|
+
if (totalOccupancy <= maxOccupancy) {
|
|
33
|
+
maxAdults = adultCount;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else if (config.children >= children) {
|
|
37
|
+
// Config exists and supports the children count
|
|
38
|
+
if (countInfants && config.infants !== undefined) {
|
|
39
|
+
if (config.infants >= infants) {
|
|
40
|
+
maxAdults = adultCount;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
maxAdults = adultCount;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return Math.max(maxAdults, 1);
|
|
15
49
|
}
|
|
16
|
-
|
|
50
|
+
// Standard logic
|
|
51
|
+
const maxAdults = Math.max(maxOccupancy - children, adults !== null && adults !== void 0 ? adults : 1);
|
|
52
|
+
return Math.max(maxAdults, 1) || 1;
|
|
17
53
|
};
|
|
18
54
|
const getMaxSelectableChildren = ({ adults }) => {
|
|
19
|
-
var _a, _b;
|
|
20
|
-
|
|
55
|
+
var _a, _b, _c;
|
|
56
|
+
const standardMax = Math.max(Math.min((_a = hotel === null || hotel === void 0 ? void 0 : hotel.maxChildren) !== null && _a !== void 0 ? _a : Number.MAX_VALUE, (_b = hotel === null || hotel === void 0 ? void 0 : hotel.maxOccupancy) !== null && _b !== void 0 ? _b : 0) - adults, 0);
|
|
57
|
+
const config = getOccupancyConfig(adults);
|
|
58
|
+
return (_c = config === null || config === void 0 ? void 0 : config.children) !== null && _c !== void 0 ? _c : standardMax;
|
|
21
59
|
};
|
|
22
|
-
const getMaxSelectableInfants = () => {
|
|
23
|
-
var _a;
|
|
24
|
-
|
|
60
|
+
const getMaxSelectableInfants = ({ adults }) => {
|
|
61
|
+
var _a, _b;
|
|
62
|
+
const standardMax = (_a = hotel === null || hotel === void 0 ? void 0 : hotel.maxInfants) !== null && _a !== void 0 ? _a : 10;
|
|
63
|
+
if (!countInfants) {
|
|
64
|
+
return standardMax;
|
|
65
|
+
}
|
|
66
|
+
const config = getOccupancyConfig(adults);
|
|
67
|
+
return (_b = config === null || config === void 0 ? void 0 : config.infants) !== null && _b !== void 0 ? _b : standardMax;
|
|
25
68
|
};
|
|
26
|
-
const showChildren = ((
|
|
69
|
+
const showChildren = ((_b = hotel === null || hotel === void 0 ? void 0 : hotel.childConfiguration) === null || _b === void 0 ? void 0 : _b.supportChildren) !== false;
|
|
27
70
|
return {
|
|
28
71
|
getMaxSelectableAdults,
|
|
29
72
|
getMaxSelectableChildren,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSearchScopeHook.js","sourceRoot":"/","sources":["src/hooks/useSearchScopeHook.ts"],"names":[],"mappings":";;;AAAA,+DAA2D;AAEpD,MAAM,kBAAkB,GAAG,GAAG,EAAE;;IACnC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,kCAAe,GAAE,CAAC;IAEpC,MAAM,sBAAsB,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"useSearchScopeHook.js","sourceRoot":"/","sources":["src/hooks/useSearchScopeHook.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCurrentHotel } from '@/hooks/CurrentHotelHook';\n\nexport const useSearchScopeHook = () => {\n const { hotel } = useCurrentHotel();\n\n const limits = hotel?.occupancyLimits;\n const countInfants = hotel?.countInfantsInOccupancy ?? false;\n\n const getOccupancyConfig = (adults: number) => {\n if (!limits) return null;\n if (adults > limits.highestAdultConfig) return null;\n if (limits.maxSelectableChildren[adults] === undefined) return null;\n\n return {\n children: limits.maxSelectableChildren[adults],\n infants: limits.maxSelectableInfants[adults],\n };\n };\n\n const getMaxSelectableAdults = ({ adults, children = 0, infants = 0 }: { adults: number; children?: number; infants?: number }): number => {\n const maxOccupancy = Math.min(hotel?.maxAdults ?? Number.MAX_VALUE, hotel?.maxOccupancy ?? 0);\n\n if (limits) {\n let maxAdults = 0;\n for (let adultCount = 1; adultCount <= limits.highestAdultConfig; adultCount++) {\n const config = getOccupancyConfig(adultCount);\n\n if (!config) {\n // No config for this adult count - use standard occupancy logic\n const totalOccupancy = adultCount + children + (countInfants ? infants : 0);\n if (totalOccupancy <= maxOccupancy) {\n maxAdults = adultCount;\n }\n } else if (config.children >= children) {\n // Config exists and supports the children count\n if (countInfants && config.infants !== undefined) {\n if (config.infants >= infants) {\n maxAdults = adultCount;\n }\n } else {\n maxAdults = adultCount;\n }\n }\n }\n return Math.max(maxAdults, 1);\n }\n\n // Standard logic\n const maxAdults = Math.max(maxOccupancy - children, adults ?? 1);\n return Math.max(maxAdults, 1) || 1;\n };\n\n const getMaxSelectableChildren = ({ adults }: { adults: number }): number => {\n const standardMax = Math.max(Math.min(hotel?.maxChildren ?? Number.MAX_VALUE, hotel?.maxOccupancy ?? 0) - adults, 0);\n const config = getOccupancyConfig(adults);\n\n return config?.children ?? standardMax;\n };\n\n const getMaxSelectableInfants = ({ adults }: { adults: number }): number => {\n const standardMax = hotel?.maxInfants ?? 10;\n\n if (!countInfants) {\n return standardMax;\n }\n\n const config = getOccupancyConfig(adults);\n return config?.infants ?? standardMax;\n };\n\n const showChildren = hotel?.childConfiguration?.supportChildren !== false;\n\n return {\n getMaxSelectableAdults,\n getMaxSelectableChildren,\n getMaxSelectableInfants,\n showChildren,\n };\n};\n"]}
|
|
@@ -45,6 +45,10 @@ class Addon {
|
|
|
45
45
|
Object.keys(data).map((key) => {
|
|
46
46
|
this[key] = data[key];
|
|
47
47
|
}, this);
|
|
48
|
+
// The image property comes as an array so we need to handle this
|
|
49
|
+
if (Array.isArray(this.image) && this.image.length > 0) {
|
|
50
|
+
this.image = this.image[0];
|
|
51
|
+
}
|
|
48
52
|
let first = true;
|
|
49
53
|
for (const date in this.availability) {
|
|
50
54
|
if (!Object.prototype.hasOwnProperty.call(this.availability, date)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Addon.js","sourceRoot":"/","sources":["src/models/Addon/Addon.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Addon.js","sourceRoot":"/","sources":["src/models/Addon/Addon.ts"],"names":[],"mappings":"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","sourcesContent":["import { EAddonPricingType, IPriceInfo } from '@roomstay/core';\nimport dayjs, { Dayjs } from 'dayjs';\n\ninterface IAddon {\n code: string;\n\n /**\n * The SynXis CR RatePlan Code associated with the Package if the Package is restricted to certain RatePlans\n */\n ratePlanCode: string;\n\n name: string;\n\n description: string;\n\n /**\n * Whether the price for this package is included in the room rate.\n * (Always `false` unless the price is zero)\n */\n inclusive: boolean;\n\n image?: string;\n\n url?: string;\n\n /**\n * Defines how a service is priced.\n * Values:\n * Per Stay\n * Per Night\n * Per Person\n * Per Person Per Night\n */\n pricingType: EAddonPricingType;\n\n hideDatePicker?: boolean;\n\n category: string;\n\n cancelPenalty?: string;\n\n guaranteeDescription?: string;\n\n availability: { [date: string]: PriceInfo };\n\n checkInDate: dayjs.Dayjs;\n checkOutDate: dayjs.Dayjs;\n}\n\nexport const ADDON_PER_NIGHT_TYPES = [\n EAddonPricingType.PER_NIGHT,\n EAddonPricingType.PER_PERSON_PER_NIGHT,\n\n EAddonPricingType.PER_QUANTITY_NAME_PER_NIGHT,\n EAddonPricingType.PER_ROOM_QUANTITY_PER_NIGHT,\n EAddonPricingType.PER_PERSON_OCCUPANCY_PER_NIGHT,\n EAddonPricingType.PER_ADULT_OCCUPANCY_PER_NIGHT,\n EAddonPricingType.PER_CHILD_OCCUPANCY_PER_NIGHT,\n\n EAddonPricingType.PER_ALL_PERSONS_PER_NIGHT,\n];\n\nexport const ADDON_PER_PERSON_PER_NIGHT_TYPES = [\n EAddonPricingType.PER_PERSON_PER_NIGHT,\n EAddonPricingType.PER_PERSON_OCCUPANCY_PER_NIGHT,\n EAddonPricingType.PER_ADULT_OCCUPANCY_PER_NIGHT,\n EAddonPricingType.PER_CHILD_OCCUPANCY_PER_NIGHT,\n];\n\nexport class Addon {\n public code!: string;\n\n /**\n * The SynXis CR RatePlan Code associated with the Package if the Package is restricted to certain RatePlans\n */\n public ratePlanCode!: string;\n\n public name!: string;\n\n public description!: string;\n\n /**\n * Whether the price for this package is included in the room rate.\n * (Always `false` unless the price is zero)\n */\n public inclusive = false;\n\n public image?: string;\n\n public url?: string;\n\n /**\n * Defines how a service is priced.\n * Values:\n * Per Stay\n * Per Night\n * Per Person\n * Per Person Per Night\n */\n public pricingType!: EAddonPricingType;\n\n public hideDatePicker!: false;\n public hideQuantity!: false;\n\n public category!: string;\n\n public cancelPenalty?: string;\n\n public guaranteeDescription?: string;\n\n public availability: { [date: string]: PriceInfo } = {};\n\n public selected?: boolean;\n\n public selectorDates: { text: string; value: string }[] = [];\n\n public firstDate?: string;\n\n public checkInDate!: dayjs.Dayjs;\n public checkOutDate!: dayjs.Dayjs;\n\n public nights!: number;\n\n public order?: number;\n\n public constructor(props?: IAddon) {\n if (props) {\n this.applyData(props);\n }\n }\n\n public static fromData(data: any) {\n const addon = new this();\n\n addon.applyData(data);\n\n return addon;\n }\n\n public applyData(data: IAddon) {\n Object.keys(data).map((key: any) => {\n (this as any)[key] = (data as any)[key];\n }, this);\n\n // The image property comes as an array so we need to handle this\n if (Array.isArray(this.image) && this.image.length > 0) {\n this.image = this.image[0];\n }\n\n let first = true;\n for (const date in this.availability) {\n if (!Object.prototype.hasOwnProperty.call(this.availability, date)) {\n continue;\n }\n\n const day = dayjs(date, 'YYYY-MM-DD');\n this.selectorDates.push({ text: day.format('D MMM'), value: date });\n if (first) {\n this.firstDate = date;\n first = false;\n }\n\n const priceInfo = this.availability[date];\n priceInfo.selectorTimes = [];\n priceInfo.timeSlots?.forEach((slot) => {\n const timeRegExp = /T(\\d{2}):(\\d{2}):(\\d{2})$/;\n const startTime = slot.startTime?.match(timeRegExp);\n const endTime = slot.endTime?.match(timeRegExp);\n\n if (startTime && endTime) {\n const start = dayjs().hour(parseInt(startTime[1], 10)).minute(parseInt(startTime[2], 10)).second(parseInt(startTime[3], 10));\n const end = dayjs().hour(parseInt(endTime[1], 10)).minute(parseInt(endTime[2], 10)).second(parseInt(endTime[3], 10));\n\n const [hours, minutes, seconds] = (slot.increment as string).split(':').map((it) => parseInt(it, 10));\n\n const increment = (time: Dayjs) => time.add(hours, 'hour').add(minutes, 'minute').add(seconds, 'second');\n\n for (let time = start; time.isBefore(end, 'second'); time = increment(time)) {\n (priceInfo.selectorTimes as { text: string; value: string }[]).push({ text: time.format('h:mma'), value: time.format('THH:mm:ss') });\n }\n }\n });\n }\n\n if (data.checkInDate && data.checkOutDate) {\n this.nights = data.checkOutDate.diff(data.checkInDate, 'day');\n }\n }\n}\n\nexport type PriceInfo = IPriceInfo & {\n fee?: number;\n adultFee?: number;\n childFee?: number;\n selectorTimes?: { text: string; value: string }[];\n};\n"]}
|
|
@@ -118,7 +118,7 @@ export type HotelDTO = {
|
|
|
118
118
|
disableSavedPayments: boolean;
|
|
119
119
|
enableRoomUpsells?: boolean;
|
|
120
120
|
enableRateUpsells?: boolean;
|
|
121
|
-
} & Pick<AdminHotelConfig, 'childConfiguration' | 'perks' | 'perkTitle' | 'countryPrefix' | 'quoteImageDesktop' | 'quoteImageMobile' | 'memberOnlyImage' | 'captureChildAge' | 'company' | 'fees' | 'addDepositFeeToBookingTotal' | 'minAdultAge' | 'maxAdultAge' | 'countInfantsInOccupancy' | 'preferProviderBookingId' | 'showUnavailableRooms' | 'isRACMemberNoRequired' | 'countryCode' | 'calendarHighlights'> & Pick<ClientHotelConfig, 'memberOnlyRenderRateLast'>;
|
|
121
|
+
} & Pick<AdminHotelConfig, 'childConfiguration' | 'perks' | 'perkTitle' | 'countryPrefix' | 'quoteImageDesktop' | 'quoteImageMobile' | 'memberOnlyImage' | 'captureChildAge' | 'company' | 'fees' | 'addDepositFeeToBookingTotal' | 'minAdultAge' | 'maxAdultAge' | 'countInfantsInOccupancy' | 'occupancyLimits' | 'preferProviderBookingId' | 'showUnavailableRooms' | 'isRACMemberNoRequired' | 'metaPixelId' | 'enableAnalyticsDebug' | 'countryCode' | 'calendarHighlights' | 'maxRoomsPerBooking' | 'bookingFlow'> & Pick<ClientHotelConfig, 'memberOnlyRenderRateLast'>;
|
|
122
122
|
export declare enum VGSCardName {
|
|
123
123
|
Visa = "visa",
|
|
124
124
|
Mastercard = "mastercard",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HotelDTO.js","sourceRoot":"/","sources":["src/models/Api/HotelDTO.ts"],"names":[],"mappings":";;;AAMA,uDAAiH;
|
|
1
|
+
{"version":3,"file":"HotelDTO.js","sourceRoot":"/","sources":["src/models/Api/HotelDTO.ts"],"names":[],"mappings":";;;AAMA,uDAAiH;AAiKjH,IAAY,WAOX;AAPD,WAAY,WAAW;IACnB,4BAAa,CAAA;IACb,wCAAyB,CAAA;IACzB,0BAAW,CAAA;IACX,wCAAyB,CAAA;IACzB,uCAAwB,CAAA;IACxB,oCAAqB,CAAA;AACzB,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB;AAEY,QAAA,0BAA0B,GAAsD;IACzF,CAAC,wBAAgB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,IAAI;IACzC,CAAC,wBAAgB,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,UAAU;IACrD,CAAC,wBAAgB,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG;IACvC,CAAC,wBAAgB,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,eAAe;IAC/D,CAAC,wBAAgB,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,UAAU;IACrD,CAAC,wBAAgB,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,QAAQ;CACpD,CAAC","sourcesContent":["import { EnvironmentName } from '@planpay/web/src/lib/shared-lib-duplicates';\nimport type { EBookingPaymentMethod, EHotelCardProcessor, EHotelStateFieldConfiguration, EIntegration, IAuxiliaryFilter } from '@roomstay/core';\nimport { DeepPartial } from 'react-hook-form';\n\nimport ColorProfile from '@/models/Client/Hotel/ColorProfile';\nimport { DistanceUnitType } from '@/models/Client/Hotel/DistanceUnitType.types';\nimport { AdminHotelConfig, ClientHotelConfig, ConfigHotel, EPaymentCardType } from '@/models/Client/Hotel/Hotel';\nimport HotelAddress from '@/models/Client/Hotel/HotelAddress';\nimport { HotelDataSource } from '@/models/Client/Hotel/HotelDataSource.types';\nimport { WeekdayStartsOn } from '@/models/Client/Hotel/WeekdayStartsOn.types';\n\nexport type HotelServiceDTO = {\n detail: string;\n included: boolean;\n name: string;\n onsite: boolean;\n};\n\nexport type HotelRoomsDTO = {\n [roomTypeCode: string]: HotelRoomDTO;\n};\n\nexport type HotelRoomGroupsDTO = {\n groupName: string;\n id: string;\n checkInTime?: string | null;\n checkOutTime?: string | null;\n filters: {\n [id: string]: {\n // Options on the AuxiliaryFilter itself:\n name: string;\n type: 'select';\n includeAllAbove: boolean;\n requireInput: boolean;\n options: IAuxiliaryFilter['options'];\n\n // Options on the RoomGroupAuxiliaryFilter:\n requireSelection: boolean;\n };\n };\n}[];\n\nexport type HotelRoomAmenitiesDTO = {\n type: string;\n description: string;\n};\n\nexport type HotelRoomDTO = {\n code: string;\n name: string;\n shortDescription: string;\n longDescription: string;\n images: string[];\n quantity: number;\n maxOccupancy: number;\n bedQuantity: number;\n showBedType?: boolean;\n standardNumBeds: number;\n maxRollaways: number;\n bedType: string;\n amenities: HotelRoomAmenitiesDTO[];\n features: HotelRoomAmenitiesDTO[];\n bedTypeOverride?: string;\n roomGroupId?: string;\n roomSize?: number;\n prePerkDisclaimer?: string;\n perks?: ConfigHotel['perks'];\n petFriendly?: boolean;\n};\n\nexport type HotelDTO = {\n id: number;\n name: string;\n chainId: number;\n chainName: string;\n\n address: HotelAddress;\n phone: string;\n\n latitude: string;\n longitude: string;\n\n utcOffset: string;\n timeZone: string;\n\n languageCode: string;\n currencyCode: string;\n\n checkInTime: string;\n checkOutTime: string;\n\n paymentCardTypes: EPaymentCardType[];\n\n description: string;\n locationDescription: string;\n policies: string;\n\n hotelServices: HotelServiceDTO[];\n businessServices: HotelServiceDTO[];\n\n rooms: { [roomTypeCode: string]: HotelRoomDTO };\n dataSource: HotelDataSource;\n\n // Following fields are only present if dataSource = 'roomstay'\n logo?: string;\n colors: DeepPartial<ColorProfile>;\n distanceUnitType?: DistanceUnitType;\n weekdayStartsOn?: WeekdayStartsOn;\n\n crossSellHotelIds?: string[];\n paymentMethods: EBookingPaymentMethod[];\n cardProcessor: EHotelCardProcessor;\n planpay?: {\n username: string;\n minDaysShowPlanpay: number;\n env: EnvironmentName;\n };\n\n email?: string;\n hotelUrl?: string;\n heroImage?: string;\n images?: string[];\n integrations?: EIntegration[];\n roomGroups: HotelRoomGroupsDTO;\n rmsUseDepositQuote?: boolean;\n checkAreaAvailabilityOnRoomStep?: boolean;\n /** @deprecated Use the new Fees model instead */\n enableCreditCardSurcharge?: boolean;\n availableCountries?: { name: string; value: string }[];\n preventCancellation?: boolean;\n maxAdults?: number;\n maxChildren?: number;\n maxInfants?: number;\n stateFieldConfiguration?: EHotelStateFieldConfiguration;\n itineraryNote: string;\n disableSavedPayments: boolean;\n enableRoomUpsells?: boolean;\n enableRateUpsells?: boolean;\n} & Pick<\n AdminHotelConfig,\n | 'childConfiguration'\n | 'perks'\n | 'perkTitle'\n | 'countryPrefix'\n | 'quoteImageDesktop'\n | 'quoteImageMobile'\n | 'memberOnlyImage'\n | 'captureChildAge'\n | 'company'\n | 'fees'\n | 'addDepositFeeToBookingTotal'\n | 'minAdultAge'\n | 'maxAdultAge'\n | 'countInfantsInOccupancy'\n | 'occupancyLimits'\n | 'preferProviderBookingId'\n | 'showUnavailableRooms'\n | 'isRACMemberNoRequired'\n | 'metaPixelId'\n | 'enableAnalyticsDebug'\n | 'countryCode'\n | 'calendarHighlights'\n | 'maxRoomsPerBooking'\n | 'bookingFlow'\n> &\n Pick<ClientHotelConfig, 'memberOnlyRenderRateLast'>;\n\nexport enum VGSCardName {\n Visa = 'visa',\n Mastercard = 'mastercard',\n JCB = 'jcb',\n DinersClub = 'dinersclub',\n AmericanExpress = 'amex',\n UnionPay = 'unionpay',\n}\n\nexport const SynxisToVGSCardNameMapping: { [synxisName in EPaymentCardType]: VGSCardName } = {\n [EPaymentCardType.Visa]: VGSCardName.Visa,\n [EPaymentCardType.Mastercard]: VGSCardName.Mastercard,\n [EPaymentCardType.JCB]: VGSCardName.JCB,\n [EPaymentCardType.AmericanExpress]: VGSCardName.AmericanExpress,\n [EPaymentCardType.DinersClub]: VGSCardName.DinersClub,\n [EPaymentCardType.UnionPay]: VGSCardName.UnionPay,\n};\n"]}
|
|
@@ -69,6 +69,11 @@ export default class BasketRow {
|
|
|
69
69
|
getArrivalDate(): string | null;
|
|
70
70
|
getDepartureDate(): string | null;
|
|
71
71
|
getStayDateRange(format?: string, separator?: string): string | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* Ensures endDate is always at least 1 day after startDate.
|
|
74
|
+
* Prevents invalid basket date ranges inherited from previous rows.
|
|
75
|
+
*/
|
|
76
|
+
normalizeDateRange: () => void;
|
|
72
77
|
getAdults(): number;
|
|
73
78
|
getChildren(): number;
|
|
74
79
|
getInfants(): number;
|
|
@@ -46,6 +46,18 @@ class BasketRow {
|
|
|
46
46
|
* Indicates availability for a specific room extracted from the URL's room parameter
|
|
47
47
|
*/
|
|
48
48
|
this.roomCode = '';
|
|
49
|
+
/**
|
|
50
|
+
* Ensures endDate is always at least 1 day after startDate.
|
|
51
|
+
* Prevents invalid basket date ranges inherited from previous rows.
|
|
52
|
+
*/
|
|
53
|
+
this.normalizeDateRange = () => {
|
|
54
|
+
if (!this.startDate)
|
|
55
|
+
return;
|
|
56
|
+
const minimumEndDate = this.startDate.clone().add(1, 'day');
|
|
57
|
+
if (!this.endDate || this.endDate.isBefore(minimumEndDate, 'day')) {
|
|
58
|
+
this.endDate = minimumEndDate;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
49
61
|
/**
|
|
50
62
|
* Returns the tooltip text based on the promo code status.
|
|
51
63
|
*
|
|
@@ -182,7 +194,7 @@ class BasketRow {
|
|
|
182
194
|
return this.promoCodeStatus;
|
|
183
195
|
}
|
|
184
196
|
isValid() {
|
|
185
|
-
return this.startDate && this.endDate && !!this.rate;
|
|
197
|
+
return !!this.startDate && !!this.endDate && this.startDate.isBefore(this.endDate) && !!this.rate;
|
|
186
198
|
}
|
|
187
199
|
setPromoCode(code) {
|
|
188
200
|
if (this.promoCode !== code.toUpperCase()) {
|