@roomstay/frontend 2.6.83 → 2.6.85
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/151.bundle.js +1 -0
- package/dist/177.bundle.js +1 -0
- package/dist/279.bundle.js +1 -0
- package/dist/288.bundle.js +1 -0
- package/dist/370.bundle.js +1 -0
- package/dist/375.bundle.js +1 -0
- package/dist/430.bundle.js +1 -0
- package/dist/439.bundle.js +1 -0
- package/dist/446.bundle.js +1 -0
- package/dist/449.bundle.js +1 -0
- package/dist/535.bundle.js +2 -0
- package/dist/535.bundle.js.LICENSE.txt +30 -0
- package/dist/537.bundle.js +1 -0
- package/dist/619.bundle.js +1 -0
- package/dist/625.bundle.js +1 -0
- package/dist/686.bundle.js +1 -0
- package/dist/873.bundle.js +1 -0
- package/dist/972.bundle.js +1 -0
- package/dist/978.bundle.js +1 -0
- package/dist/984.bundle.js +1 -0
- package/dist/main.bundle.js +1 -0
- package/dist/src/api/AvailabilityAPI.d.ts +16 -1
- package/dist/src/api/AvailabilityAPI.js +69 -4
- package/dist/src/api/AvailabilityAPI.js.map +1 -1
- package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js +1 -0
- package/dist/src/components/generic/custom/EnhancedPhoneNumberField/EnhancedPhoneNumberField.js.map +1 -1
- package/dist/src/components/steps/room/AvailableUpgradesModal.js +96 -28
- package/dist/src/components/steps/room/AvailableUpgradesModal.js.map +1 -1
- package/dist/src/components/steps/room/LargeRateCard.d.ts +10 -0
- package/dist/src/components/steps/room/LargeRateCard.js +120 -0
- package/dist/src/components/steps/room/LargeRateCard.js.map +1 -0
- package/dist/src/components/steps/room/LargeRoomCard.js +9 -3
- package/dist/src/components/steps/room/LargeRoomCard.js.map +1 -1
- package/dist/src/contexts/BasketContext/BasketContextType.d.ts +1 -2
- package/dist/src/contexts/BasketContext/BasketContextType.js.map +1 -1
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +2 -0
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
- package/dist/src/hooks/AutoFocusOnSelect.d.ts +23 -1
- package/dist/src/hooks/AutoFocusOnSelect.js +3 -3
- package/dist/src/hooks/AutoFocusOnSelect.js.map +1 -1
- package/dist/src/models/Api/HotelDTO.d.ts +2 -0
- package/dist/src/models/Api/HotelDTO.js.map +1 -1
- package/dist/src/models/Api/IEventReservation.d.ts +5 -0
- package/dist/src/models/Api/IEventReservation.js.map +1 -1
- package/dist/src/models/Client/Hotel/Company.d.ts +2 -0
- package/dist/src/models/Client/Hotel/Company.js.map +1 -1
- package/dist/src/models/Client/Hotel/Hotel.d.ts +2 -0
- package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
- package/dist/src/models/Room/RoomRate.d.ts +5 -1
- package/dist/src/models/Room/RoomRate.js +5 -1
- package/dist/src/models/Room/RoomRate.js.map +1 -1
- package/dist/src/pages/steps/StepThanks/StepThanksComponent.js +5 -0
- package/dist/src/pages/steps/StepThanks/StepThanksComponent.js.map +1 -1
- package/dist/src/providers/feature/RoomUpsellFeature.d.ts +10 -0
- package/dist/src/providers/feature/RoomUpsellFeature.js +10 -0
- package/dist/src/providers/feature/RoomUpsellFeature.js.map +1 -1
- package/dist/src/translations/Translation.d.ts +7 -0
- package/dist/src/translations/Translation.js +7 -0
- package/dist/src/translations/Translation.js.map +1 -1
- package/dist/src/translations/languages/en-gb.js +7 -0
- package/dist/src/translations/languages/en-gb.js.map +1 -1
- package/dist/src/util/Analytics/Analytics.d.ts +2 -0
- package/dist/src/util/Analytics/Analytics.js +4 -0
- package/dist/src/util/Analytics/Analytics.js.map +1 -1
- package/dist/src/util/Analytics/GoogleAnalytics4.js +4 -4
- package/dist/src/util/Analytics/GoogleAnalytics4.js.map +1 -1
- package/dist/src/util/Analytics/UniversalAnalytics.js +1 -1
- package/dist/src/util/Analytics/UniversalAnalytics.js.map +1 -1
- package/dist/src/util/DataLayer.d.ts +1 -0
- package/dist/src/util/DataLayer.js +10 -4
- package/dist/src/util/DataLayer.js.map +1 -1
- package/dist/test.bundle.js +1 -0
- package/dist/vendors.bundle.js +2 -0
- package/dist/vendors.bundle.js.LICENSE.txt +114 -0
- package/package.json +6 -3
|
@@ -58,6 +58,7 @@ const Headline_1 = __importDefault(require("../../generic/Headline"));
|
|
|
58
58
|
const SimpleModal_1 = __importDefault(require("../../generic/modal/SimpleModal"));
|
|
59
59
|
const Text_1 = __importStar(require("../../generic/Text"));
|
|
60
60
|
const ImageGallerySlider_1 = __importDefault(require("./ImageGallerySlider"));
|
|
61
|
+
const LargeRateCard_1 = __importDefault(require("./LargeRateCard"));
|
|
61
62
|
const LargeRoomCard_1 = __importDefault(require("./LargeRoomCard"));
|
|
62
63
|
const useSignedInMember_1 = require("../../../hooks/useSignedInMember");
|
|
63
64
|
const RoomUpsellFeature_1 = __importDefault(require("../../../providers/feature/RoomUpsellFeature"));
|
|
@@ -73,7 +74,8 @@ const AvailableUpgradesModal = () => {
|
|
|
73
74
|
const { on } = (0, hooks_1.useEvent)();
|
|
74
75
|
const room = row === null || row === void 0 ? void 0 : row.getRoom();
|
|
75
76
|
const selectedRate = row === null || row === void 0 ? void 0 : row.getRate();
|
|
76
|
-
const [
|
|
77
|
+
const [roomUpgrades, setRoomUpgrades] = (0, react_1.useState)([]);
|
|
78
|
+
const [rateUpgrades, setRateUpgrades] = (0, react_1.useState)([]);
|
|
77
79
|
(0, react_1.useEffect)(() => {
|
|
78
80
|
let cancelled = false;
|
|
79
81
|
on(events_1.AddToCartEvent, (event) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -88,39 +90,94 @@ const AvailableUpgradesModal = () => {
|
|
|
88
90
|
}, []);
|
|
89
91
|
(0, react_1.useEffect)(() => {
|
|
90
92
|
let cancelled = false;
|
|
91
|
-
if (row) {
|
|
92
|
-
BookingAPI_1.default.Availability.fetchAvailabilityData(row, hotel === null || hotel === void 0 ? void 0 : hotel.hotelID, memberNumber, true).then((availableRooms) => {
|
|
93
|
+
if (row && selectedRate) {
|
|
94
|
+
BookingAPI_1.default.Availability.fetchAvailabilityData(row, hotel === null || hotel === void 0 ? void 0 : hotel.hotelID, memberNumber, true).then((availableRooms) => __awaiter(void 0, void 0, void 0, function* () {
|
|
93
95
|
if (cancelled)
|
|
94
96
|
return;
|
|
95
|
-
const
|
|
96
|
-
availableRooms === null || availableRooms === void 0 ? void 0 : availableRooms.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
fewRates.forEach((oneRate) => {
|
|
100
|
-
unfilteredRates.push(oneRate);
|
|
97
|
+
const allRates = [];
|
|
98
|
+
availableRooms === null || availableRooms === void 0 ? void 0 : availableRooms.forEach((availableRoom) => {
|
|
99
|
+
availableRoom.getRates().forEach((rate) => {
|
|
100
|
+
allRates.push(rate);
|
|
101
101
|
});
|
|
102
102
|
});
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
const roomUpsellsEnabled = (hotel === null || hotel === void 0 ? void 0 : hotel.enableRoomUpsells) || RoomUpsellFeature_1.default.isActive();
|
|
104
|
+
const rateUpsellsEnabled = hotel === null || hotel === void 0 ? void 0 : hotel.enableRateUpsells;
|
|
105
|
+
// Check for minimum stay opportunities
|
|
106
|
+
const hasMinStayOpportunities = BookingAPI_1.default.Availability.hasMinStayUpsellOpportunities(row, hotel === null || hotel === void 0 ? void 0 : hotel.hotelID, memberNumber);
|
|
107
|
+
const minStayUpsells = [];
|
|
108
|
+
if (rateUpsellsEnabled && hasMinStayOpportunities) {
|
|
109
|
+
// Fetch extended availability for minimum stay upsells
|
|
110
|
+
const extendedRooms = yield BookingAPI_1.default.Availability.fetchMinimumStayExtensions(row, hotel === null || hotel === void 0 ? void 0 : hotel.hotelID, memberNumber);
|
|
111
|
+
if (extendedRooms && !cancelled) {
|
|
112
|
+
extendedRooms.forEach((room) => {
|
|
113
|
+
room.getRates().forEach((rate) => {
|
|
114
|
+
// We want to find rates where the user can extend the stay in their current room, for a lower price per night.
|
|
115
|
+
const wasAvailableForOriginalDates = allRates.find((r) => r.code === rate.code);
|
|
116
|
+
const isCheaperPerNight = rate.getAveragePrice() < selectedRate.getAveragePrice();
|
|
117
|
+
const requiresLongerStay = rate.minNightStayOverride && rate.minNightStayOverride > row.getNumberOfDays();
|
|
118
|
+
const isSameRoom = rate.getRoom().code === selectedRate.getRoom().code;
|
|
119
|
+
if (!wasAvailableForOriginalDates && isSameRoom && rate.isUpsellRate && isCheaperPerNight && requiresLongerStay) {
|
|
120
|
+
minStayUpsells.push(rate);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (cancelled)
|
|
127
|
+
return;
|
|
128
|
+
// Find rate upgrades (same room, different rate)
|
|
129
|
+
const rateUpgradeRoomRates = rateUpsellsEnabled
|
|
130
|
+
? allRates
|
|
131
|
+
.filter((rate) => {
|
|
132
|
+
const isSameRoom = rate.getRoom().code === selectedRate.getRoom().code;
|
|
133
|
+
const isDifferentRate = rate.code !== selectedRate.code;
|
|
134
|
+
const isUpsellRate = rate.isUpsellRate === true;
|
|
135
|
+
const isMoreExpensive = rate.getAveragePrice() > selectedRate.getAveragePrice();
|
|
136
|
+
// Don't show rates with lower minimum stay requirements as upsells, because we might show a minimum
|
|
137
|
+
// stay upsell when the user has already chosen a rate with a longer minimum stay requirement.
|
|
138
|
+
// But, still show upsell rates that don't have a minimum night stay requirement.
|
|
139
|
+
const hasLowerMinStay = rate.minNightStayOverride && rate.minNightStayOverride < row.getNumberOfDays();
|
|
140
|
+
return isSameRoom && isDifferentRate && isUpsellRate && isMoreExpensive && !hasLowerMinStay;
|
|
141
|
+
})
|
|
142
|
+
.sort((a, b) => a.getAveragePrice() - b.getAveragePrice())
|
|
143
|
+
.slice(0, 3)
|
|
144
|
+
: [];
|
|
145
|
+
// Combine regular rate upgrades with minimum stay upsells
|
|
146
|
+
const allRateUpgrades = [...rateUpgradeRoomRates, ...minStayUpsells]
|
|
107
147
|
.sort((a, b) => {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
148
|
+
// Prioritize minimum stay deals (rates with minNightStayOverride)
|
|
149
|
+
const aIsMinStay = !!(a.minNightStayOverride && a.minNightStayOverride > row.getNumberOfDays());
|
|
150
|
+
const bIsMinStay = !!(b.minNightStayOverride && b.minNightStayOverride > row.getNumberOfDays());
|
|
151
|
+
if (aIsMinStay && !bIsMinStay)
|
|
111
152
|
return -1;
|
|
153
|
+
if (!aIsMinStay && bIsMinStay)
|
|
154
|
+
return 1;
|
|
112
155
|
return a.getAveragePrice() - b.getAveragePrice();
|
|
113
156
|
})
|
|
114
157
|
.slice(0, 3);
|
|
115
|
-
|
|
116
|
-
|
|
158
|
+
// Find room upgrades (different room, same rate, higher price)
|
|
159
|
+
const roomUpgradeRoomRates = roomUpsellsEnabled
|
|
160
|
+
? allRates
|
|
161
|
+
.filter((rate) => {
|
|
162
|
+
const isDifferentRoom = rate.getRoom().code !== selectedRate.getRoom().code;
|
|
163
|
+
const isSameRate = rate.name === selectedRate.name;
|
|
164
|
+
const isMoreExpensive = rate.getAveragePrice() > selectedRate.getAveragePrice();
|
|
165
|
+
return isDifferentRoom && isSameRate && isMoreExpensive;
|
|
166
|
+
})
|
|
167
|
+
.sort((a, b) => a.getAveragePrice() - b.getAveragePrice())
|
|
168
|
+
.slice(0, 3)
|
|
169
|
+
: [];
|
|
170
|
+
setRoomUpgrades(roomUpgradeRoomRates);
|
|
171
|
+
setRateUpgrades(allRateUpgrades);
|
|
172
|
+
const hasUpgrades = roomUpgradeRoomRates.length > 0 || allRateUpgrades.length > 0;
|
|
173
|
+
if (!hasUpgrades && selectedRate) {
|
|
117
174
|
// Proceed as if user clicked the nav.
|
|
118
175
|
confirmRateOnClick();
|
|
119
176
|
}
|
|
120
177
|
else {
|
|
121
|
-
setIsOpen(
|
|
178
|
+
setIsOpen(hasUpgrades);
|
|
122
179
|
}
|
|
123
|
-
});
|
|
180
|
+
}));
|
|
124
181
|
}
|
|
125
182
|
return () => {
|
|
126
183
|
cancelled = true;
|
|
@@ -140,7 +197,15 @@ const AvailableUpgradesModal = () => {
|
|
|
140
197
|
if (row) {
|
|
141
198
|
if (rate) {
|
|
142
199
|
DataLayer_1.default.instance.sendUpsellConfirmed({ from: row.getStartDate(), to: row.getEndDate() }, row.getRate(), rate);
|
|
143
|
-
|
|
200
|
+
const isUpsellActive = (hotel === null || hotel === void 0 ? void 0 : hotel.enableRoomUpsells) || RoomUpsellFeature_1.default.isActive() || (hotel === null || hotel === void 0 ? void 0 : hotel.enableRateUpsells);
|
|
201
|
+
// Check if this is a minimum stay upsell that requires extending the checkout
|
|
202
|
+
if (rate.minNightStayOverride && rate.minNightStayOverride > row.getNumberOfDays()) {
|
|
203
|
+
const newStartDate = row.getStartDate();
|
|
204
|
+
const newEndDate = newStartDate.add(rate.minNightStayOverride, 'days');
|
|
205
|
+
row.setStartDate(newStartDate);
|
|
206
|
+
row.setEndDate(newEndDate);
|
|
207
|
+
}
|
|
208
|
+
row.setRate(rate, isUpsellActive);
|
|
144
209
|
basketContext.updateBasketRow(row);
|
|
145
210
|
closeModal();
|
|
146
211
|
}
|
|
@@ -149,7 +214,11 @@ const AvailableUpgradesModal = () => {
|
|
|
149
214
|
}
|
|
150
215
|
}
|
|
151
216
|
};
|
|
152
|
-
|
|
217
|
+
const roomUpsellsEnabled = (hotel === null || hotel === void 0 ? void 0 : hotel.enableRoomUpsells) || RoomUpsellFeature_1.default.isActive();
|
|
218
|
+
const rateUpsellsEnabled = hotel === null || hotel === void 0 ? void 0 : hotel.enableRateUpsells;
|
|
219
|
+
const upsellsEnabled = roomUpsellsEnabled || rateUpsellsEnabled;
|
|
220
|
+
const allUpgrades = [...rateUpgrades, ...roomUpgrades].slice(0, 3);
|
|
221
|
+
return upsellsEnabled && row ? (react_1.default.createElement(SimpleModal_1.default, { open: isOpen, onClose: cancelUpsell, title: t(Translation_1.Translation.Step.Room.AvailableUpgrades) },
|
|
153
222
|
react_1.default.createElement("div", { className: "upgrades-room-modal" },
|
|
154
223
|
react_1.default.createElement("div", { className: "current-room-block container" },
|
|
155
224
|
react_1.default.createElement("div", { className: "u-flex u-flex-flex-start row" },
|
|
@@ -176,12 +245,11 @@ const AvailableUpgradesModal = () => {
|
|
|
176
245
|
react_1.default.createElement("div", { className: "u-pad-top u-marg-bottom" },
|
|
177
246
|
react_1.default.createElement("div", { className: "u-marg-bottom--heavy" },
|
|
178
247
|
react_1.default.createElement(Headline_1.default, { bold: true }, t(Translation_1.Translation.Step.Room.CheckOutOtherOptions))),
|
|
179
|
-
react_1.default.createElement("div", { className: "row no-gutters" },
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
react_1.default.createElement(LargeRoomCard_1.default, { selectedRate: selectedRate, rate: rate, onSelectRate: onSelectRate })));
|
|
248
|
+
react_1.default.createElement("div", { className: "row no-gutters" }, allUpgrades.map((rate) => {
|
|
249
|
+
const isRateUpgrade = rate.getRoom().code === (selectedRate === null || selectedRate === void 0 ? void 0 : selectedRate.getRoom().code);
|
|
250
|
+
const key = `room-${rate.getRoom().code}-${rate.code}`;
|
|
251
|
+
return (react_1.default.createElement("div", { className: "col-md-6 col-xl-4 u-marg-bottom u-pad-left--light u-pad-right--light", key: key }, selectedRate &&
|
|
252
|
+
(isRateUpgrade ? (react_1.default.createElement(LargeRateCard_1.default, { selectedRate: selectedRate, rate: rate, onSelectRate: () => confirmRateOnClick(rate), startDate: row.getStartDate() })) : (react_1.default.createElement(LargeRoomCard_1.default, { selectedRate: selectedRate, rate: rate, onSelectRate: () => confirmRateOnClick(rate) })))));
|
|
185
253
|
}))))))) : null;
|
|
186
254
|
};
|
|
187
255
|
exports.default = AvailableUpgradesModal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvailableUpgradesModal.js","sourceRoot":"/","sources":["src/components/steps/room/AvailableUpgradesModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport { AddToCartEvent } from '@frontend/events';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport React, { FC, useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport SimpleModal from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport LargeRoomCard from '@/components/steps/room/LargeRoomCard';\nimport { useSignedInMember } from '@/hooks/useSignedInMember';\nimport BasketRow from '@/models/BasketRow';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport RoomUpsellFeature from '@/providers/feature/RoomUpsellFeature';\nimport { Color } from '@/util/Color';\nimport DataLayer from '@/util/DataLayer';\n\nconst AvailableUpgradesModal: FC = () => {\n const { t } = useTranslation();\n const { hotel } = useCurrentHotel();\n const { memberNumber } = useSignedInMember();\n const [isOpen, setIsOpen] = useState(false);\n const [row, setRow] = useState<BasketRow | null>(null);\n\n const basketContext = useContext(BasketContext);\n\n const { on } = useEvent();\n\n const room = row?.getRoom();\n const selectedRate = row?.getRate();\n\n const [rates, setRates] = useState<RoomRate[]>();\n\n useEffect(() => {\n let cancelled = false;\n\n on(AddToCartEvent, async (event: AddToCartEvent): Promise<void | boolean> => {\n if (cancelled) return;\n\n setRow(event.basketRow);\n return true;\n });\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n\n if (row) {\n API.Availability.fetchAvailabilityData(row, hotel?.hotelID as string, memberNumber, true).then((availableRooms) => {\n if (cancelled) return;\n\n const unfilteredRates: RoomRate[] = [];\n availableRooms\n ?.map((availableRoom) => {\n return availableRoom.getRates();\n })\n .forEach((fewRates) => {\n fewRates.forEach((oneRate) => {\n unfilteredRates.push(oneRate);\n });\n });\n const filteredRates = unfilteredRates\n .filter((rate) => {\n return rate.getAveragePrice() > (selectedRate?.getAveragePrice() as number) && rate.name === selectedRate?.name;\n })\n .sort((a: RoomRate, b: RoomRate) => {\n if (a.getAveragePrice() === selectedRate?.getAveragePrice()) return 1;\n if (b.getAveragePrice() === selectedRate?.getAveragePrice()) return -1;\n return a.getAveragePrice() - b.getAveragePrice();\n })\n .slice(0, 3);\n\n setRates(filteredRates);\n if (filteredRates.length === 0 && selectedRate) {\n // Proceed as if user clicked the nav.\n confirmRateOnClick();\n } else {\n setIsOpen(true);\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [row, memberNumber]);\n\n const closeModal = () => {\n setIsOpen(false);\n setRow(null);\n };\n\n const cancelUpsell = () => {\n if (row) {\n DataLayer.instance.sendUpsellCancelled({ from: row.getStartDate(), to: row.getEndDate() }, row.getRate() as RoomRate);\n }\n\n closeModal();\n };\n\n const confirmRateOnClick = (rate?: RoomRate) => {\n if (row) {\n if (rate) {\n DataLayer.instance.sendUpsellConfirmed({ from: row.getStartDate(), to: row.getEndDate() }, row.getRate() as RoomRate, rate);\n\n row.setRate(rate, RoomUpsellFeature.isActive());\n basketContext.updateBasketRow(row);\n closeModal();\n } else {\n cancelUpsell();\n }\n }\n };\n\n return RoomUpsellFeature.isActive() ? (\n <SimpleModal open={isOpen} onClose={cancelUpsell} title={t(Translation.Step.Room.AvailableUpgrades)}>\n <div className=\"upgrades-room-modal\">\n <div className=\"current-room-block container\">\n <div className=\"u-flex u-flex-flex-start row\">\n <div className=\"image-wrapper col-md-3 col-12\">\n <ImageGallerySlider images={room?.getImages() || []} />\n </div>\n <div className=\"u-flex info-block col-md-7 col-sm-9\">\n <div>\n <Text color={Color.DarkGrey} bold>\n {t(Translation.Step.Room.CurrentSelectedRoom)}\n </Text>\n <Headline bold>{room?.name}</Headline>\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {selectedRate?.name}\n </Text>\n </div>\n <div>\n <div className=\"room-details--content-price flex-row\">\n <Headline bold>\n <Currency hideDecimals>{selectedRate?.getAveragePrice()}</Currency>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Grey} className=\"u-nowrap\">\n <span dangerouslySetInnerHTML={{ __html: t(Translation.Step.Room.RoomInfo.IncludesTaxes) }}></span>\n </Text>\n </div>\n </div>\n </div>\n <div className=\"u-flex u-flex-align-center col-md-2 col-sm-3\">\n <BEButton wide filled primary onClick={() => confirmRateOnClick()}>\n {t(Translation.Step.Room.Confirm)}\n </BEButton>\n </div>\n </div>\n </div>\n <div className=\"container\" style={{ backgroundColor: Color.Snow }}>\n <div className=\"u-pad-top u-marg-bottom\">\n <div className=\"u-marg-bottom--heavy\">\n <Headline bold>{t(Translation.Step.Room.CheckOutOtherOptions)}</Headline>\n </div>\n <div className=\"row no-gutters\">\n {rates?.map((rate) => {\n const onSelectRate = () => {\n confirmRateOnClick(rate);\n };\n\n return (\n <div className=\"col-md-6 col-xl-4 u-marg-bottom u-pad-left--light u-pad-right--light\" key={rate.getRoom().name}>\n <LargeRoomCard selectedRate={selectedRate as RoomRate} rate={rate} onSelectRate={onSelectRate} />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n </SimpleModal>\n ) : null;\n};\n\nexport default AvailableUpgradesModal;\n"]}
|
|
1
|
+
{"version":3,"file":"AvailableUpgradesModal.js","sourceRoot":"/","sources":["src/components/steps/room/AvailableUpgradesModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext } from '@frontend/contexts';\nimport { AddToCartEvent } from '@frontend/events';\nimport { useCurrentHotel, useEvent } from '@frontend/hooks';\nimport React, { FC, useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport API from '@/api/BookingAPI';\nimport BEButton from '@/components/generic/BEButton';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport SimpleModal from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport LargeRateCard from '@/components/steps/room/LargeRateCard';\nimport LargeRoomCard from '@/components/steps/room/LargeRoomCard';\nimport { useSignedInMember } from '@/hooks/useSignedInMember';\nimport BasketRow from '@/models/BasketRow';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport RoomUpsellFeature from '@/providers/feature/RoomUpsellFeature';\nimport { Color } from '@/util/Color';\nimport DataLayer from '@/util/DataLayer';\n\nconst AvailableUpgradesModal: FC = () => {\n const { t } = useTranslation();\n const { hotel } = useCurrentHotel();\n const { memberNumber } = useSignedInMember();\n const [isOpen, setIsOpen] = useState(false);\n const [row, setRow] = useState<BasketRow | null>(null);\n\n const basketContext = useContext(BasketContext);\n\n const { on } = useEvent();\n\n const room = row?.getRoom();\n const selectedRate = row?.getRate();\n\n const [roomUpgrades, setRoomUpgrades] = useState<RoomRate[]>([]);\n const [rateUpgrades, setRateUpgrades] = useState<RoomRate[]>([]);\n\n useEffect(() => {\n let cancelled = false;\n\n on(AddToCartEvent, async (event: AddToCartEvent): Promise<void | boolean> => {\n if (cancelled) return;\n\n setRow(event.basketRow);\n return true;\n });\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n\n if (row && selectedRate) {\n API.Availability.fetchAvailabilityData(row, hotel?.hotelID as string, memberNumber, true).then(async (availableRooms) => {\n if (cancelled) return;\n\n const allRates: RoomRate[] = [];\n availableRooms?.forEach((availableRoom) => {\n availableRoom.getRates().forEach((rate) => {\n allRates.push(rate);\n });\n });\n\n const roomUpsellsEnabled = hotel?.enableRoomUpsells || RoomUpsellFeature.isActive();\n const rateUpsellsEnabled = hotel?.enableRateUpsells;\n\n // Check for minimum stay opportunities\n const hasMinStayOpportunities = API.Availability.hasMinStayUpsellOpportunities(row, hotel?.hotelID as string, memberNumber);\n const minStayUpsells: RoomRate[] = [];\n\n if (rateUpsellsEnabled && hasMinStayOpportunities) {\n // Fetch extended availability for minimum stay upsells\n const extendedRooms = await API.Availability.fetchMinimumStayExtensions(row, hotel?.hotelID as string, memberNumber);\n\n if (extendedRooms && !cancelled) {\n extendedRooms.forEach((room) => {\n room.getRates().forEach((rate) => {\n // We want to find rates where the user can extend the stay in their current room, for a lower price per night.\n const wasAvailableForOriginalDates = allRates.find((r) => r.code === rate.code);\n const isCheaperPerNight = rate.getAveragePrice() < selectedRate.getAveragePrice();\n const requiresLongerStay = rate.minNightStayOverride && rate.minNightStayOverride > row.getNumberOfDays();\n const isSameRoom = rate.getRoom().code === selectedRate.getRoom().code;\n\n if (!wasAvailableForOriginalDates && isSameRoom && rate.isUpsellRate && isCheaperPerNight && requiresLongerStay) {\n minStayUpsells.push(rate);\n }\n });\n });\n }\n }\n\n if (cancelled) return;\n\n // Find rate upgrades (same room, different rate)\n const rateUpgradeRoomRates = rateUpsellsEnabled\n ? allRates\n .filter((rate) => {\n const isSameRoom = rate.getRoom().code === selectedRate.getRoom().code;\n const isDifferentRate = rate.code !== selectedRate.code;\n const isUpsellRate = rate.isUpsellRate === true;\n const isMoreExpensive = rate.getAveragePrice() > selectedRate.getAveragePrice();\n\n // Don't show rates with lower minimum stay requirements as upsells, because we might show a minimum\n // stay upsell when the user has already chosen a rate with a longer minimum stay requirement.\n // But, still show upsell rates that don't have a minimum night stay requirement.\n const hasLowerMinStay = rate.minNightStayOverride && rate.minNightStayOverride < row.getNumberOfDays();\n\n return isSameRoom && isDifferentRate && isUpsellRate && isMoreExpensive && !hasLowerMinStay;\n })\n .sort((a, b) => a.getAveragePrice() - b.getAveragePrice())\n .slice(0, 3)\n : [];\n\n // Combine regular rate upgrades with minimum stay upsells\n const allRateUpgrades = [...rateUpgradeRoomRates, ...minStayUpsells]\n .sort((a, b) => {\n // Prioritize minimum stay deals (rates with minNightStayOverride)\n const aIsMinStay = !!(a.minNightStayOverride && a.minNightStayOverride > row.getNumberOfDays());\n const bIsMinStay = !!(b.minNightStayOverride && b.minNightStayOverride > row.getNumberOfDays());\n if (aIsMinStay && !bIsMinStay) return -1;\n if (!aIsMinStay && bIsMinStay) return 1;\n return a.getAveragePrice() - b.getAveragePrice();\n })\n .slice(0, 3);\n\n // Find room upgrades (different room, same rate, higher price)\n const roomUpgradeRoomRates = roomUpsellsEnabled\n ? allRates\n .filter((rate) => {\n const isDifferentRoom = rate.getRoom().code !== selectedRate.getRoom().code;\n const isSameRate = rate.name === selectedRate.name;\n const isMoreExpensive = rate.getAveragePrice() > selectedRate.getAveragePrice();\n\n return isDifferentRoom && isSameRate && isMoreExpensive;\n })\n .sort((a, b) => a.getAveragePrice() - b.getAveragePrice())\n .slice(0, 3)\n : [];\n\n setRoomUpgrades(roomUpgradeRoomRates);\n setRateUpgrades(allRateUpgrades);\n\n const hasUpgrades = roomUpgradeRoomRates.length > 0 || allRateUpgrades.length > 0;\n if (!hasUpgrades && selectedRate) {\n // Proceed as if user clicked the nav.\n confirmRateOnClick();\n } else {\n setIsOpen(hasUpgrades);\n }\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [row, memberNumber]);\n\n const closeModal = () => {\n setIsOpen(false);\n setRow(null);\n };\n\n const cancelUpsell = () => {\n if (row) {\n DataLayer.instance.sendUpsellCancelled({ from: row.getStartDate(), to: row.getEndDate() }, row.getRate() as RoomRate);\n }\n\n closeModal();\n };\n\n const confirmRateOnClick = (rate?: RoomRate) => {\n if (row) {\n if (rate) {\n DataLayer.instance.sendUpsellConfirmed({ from: row.getStartDate(), to: row.getEndDate() }, row.getRate() as RoomRate, rate);\n\n const isUpsellActive = hotel?.enableRoomUpsells || RoomUpsellFeature.isActive() || hotel?.enableRateUpsells;\n\n // Check if this is a minimum stay upsell that requires extending the checkout\n if (rate.minNightStayOverride && rate.minNightStayOverride > row.getNumberOfDays()) {\n const newStartDate = row.getStartDate();\n const newEndDate = newStartDate.add(rate.minNightStayOverride, 'days');\n\n row.setStartDate(newStartDate);\n row.setEndDate(newEndDate);\n }\n\n row.setRate(rate, isUpsellActive);\n basketContext.updateBasketRow(row);\n closeModal();\n } else {\n cancelUpsell();\n }\n }\n };\n\n const roomUpsellsEnabled = hotel?.enableRoomUpsells || RoomUpsellFeature.isActive();\n const rateUpsellsEnabled = hotel?.enableRateUpsells;\n const upsellsEnabled = roomUpsellsEnabled || rateUpsellsEnabled;\n\n const allUpgrades = [...rateUpgrades, ...roomUpgrades].slice(0, 3);\n\n return upsellsEnabled && row ? (\n <SimpleModal open={isOpen} onClose={cancelUpsell} title={t(Translation.Step.Room.AvailableUpgrades)}>\n <div className=\"upgrades-room-modal\">\n <div className=\"current-room-block container\">\n <div className=\"u-flex u-flex-flex-start row\">\n <div className=\"image-wrapper col-md-3 col-12\">\n <ImageGallerySlider images={room?.getImages() || []} />\n </div>\n <div className=\"u-flex info-block col-md-7 col-sm-9\">\n <div>\n <Text color={Color.DarkGrey} bold>\n {t(Translation.Step.Room.CurrentSelectedRoom)}\n </Text>\n <Headline bold>{room?.name}</Headline>\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {selectedRate?.name}\n </Text>\n </div>\n <div>\n <div className=\"room-details--content-price flex-row\">\n <Headline bold>\n <Currency hideDecimals>{selectedRate?.getAveragePrice()}</Currency>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Grey} className=\"u-nowrap\">\n <span dangerouslySetInnerHTML={{ __html: t(Translation.Step.Room.RoomInfo.IncludesTaxes) }}></span>\n </Text>\n </div>\n </div>\n </div>\n <div className=\"u-flex u-flex-align-center col-md-2 col-sm-3\">\n <BEButton wide filled primary onClick={() => confirmRateOnClick()}>\n {t(Translation.Step.Room.Confirm)}\n </BEButton>\n </div>\n </div>\n </div>\n <div className=\"container\" style={{ backgroundColor: Color.Snow }}>\n <div className=\"u-pad-top u-marg-bottom\">\n <div className=\"u-marg-bottom--heavy\">\n <Headline bold>{t(Translation.Step.Room.CheckOutOtherOptions)}</Headline>\n </div>\n\n {/* Combined Upgrades - Rate upgrades first, then Room upgrades */}\n <div className=\"row no-gutters\">\n {allUpgrades.map((rate) => {\n const isRateUpgrade = rate.getRoom().code === selectedRate?.getRoom().code;\n const key = `room-${rate.getRoom().code}-${rate.code}`;\n\n return (\n <div className=\"col-md-6 col-xl-4 u-marg-bottom u-pad-left--light u-pad-right--light\" key={key}>\n {selectedRate &&\n (isRateUpgrade ? (\n <LargeRateCard\n selectedRate={selectedRate}\n rate={rate}\n onSelectRate={() => confirmRateOnClick(rate)}\n startDate={row.getStartDate()}\n />\n ) : (\n <LargeRoomCard selectedRate={selectedRate} rate={rate} onSelectRate={() => confirmRateOnClick(rate)} />\n ))}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n </SimpleModal>\n ) : null;\n};\n\nexport default AvailableUpgradesModal;\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import { RoomRate } from '../../../models/Room/RoomRate';
|
|
3
|
+
interface Props {
|
|
4
|
+
rate: RoomRate;
|
|
5
|
+
selectedRate: RoomRate;
|
|
6
|
+
onSelectRate: () => void;
|
|
7
|
+
startDate?: dayjs.Dayjs;
|
|
8
|
+
}
|
|
9
|
+
declare const LargeRateCard: (props: Props) => JSX.Element;
|
|
10
|
+
export default LargeRateCard;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const react_1 = __importDefault(require("react"));
|
|
40
|
+
const react_i18next_1 = require("react-i18next");
|
|
41
|
+
const Translation_1 = require("translations/Translation");
|
|
42
|
+
const BEButton_1 = __importDefault(require("../../generic/BEButton"));
|
|
43
|
+
const Currency_1 = __importDefault(require("../../generic/Currency"));
|
|
44
|
+
const Headline_1 = __importDefault(require("../../generic/Headline"));
|
|
45
|
+
const Text_1 = __importStar(require("../../generic/Text"));
|
|
46
|
+
const ImageGallerySlider_1 = __importDefault(require("./ImageGallerySlider"));
|
|
47
|
+
const RoomRate_1 = require("../../../models/Room/RoomRate");
|
|
48
|
+
const Color_1 = require("../../../util/Color");
|
|
49
|
+
const StringHelper_1 = __importDefault(require("../../../util/StringHelper"));
|
|
50
|
+
const LargeRateCard = (props) => {
|
|
51
|
+
const { t } = (0, react_i18next_1.useTranslation)();
|
|
52
|
+
const room = props.rate.getRoom();
|
|
53
|
+
const trimmedDescription = props.rate.description || props.rate.name;
|
|
54
|
+
const updateRate = () => {
|
|
55
|
+
props.onSelectRate();
|
|
56
|
+
};
|
|
57
|
+
// Calculate the price difference
|
|
58
|
+
const ratePrice = props.rate.getAveragePrice();
|
|
59
|
+
const selectedPrice = props.selectedRate.getAveragePrice();
|
|
60
|
+
const priceDifference = ratePrice - selectedPrice;
|
|
61
|
+
// Calculate current nights from the selected rate's night rates
|
|
62
|
+
const currentNights = Object.keys(props.selectedRate.nightRates).length;
|
|
63
|
+
// Only show minimum stay upgrades if they require longer stay AND are cheaper per night
|
|
64
|
+
const minNightStay = props.rate.minNightStayOverride;
|
|
65
|
+
const isMinStayUpgrade = minNightStay && minNightStay > currentNights && ratePrice < selectedPrice;
|
|
66
|
+
// Calculate the extended checkout date for minimum stay upgrades
|
|
67
|
+
const extendedCheckoutDate = props.startDate && minNightStay ? props.startDate.add(minNightStay, 'days') : null;
|
|
68
|
+
return (react_1.default.createElement("div", { className: "upgrade-card upgrade-card--rate u-border-rounded" },
|
|
69
|
+
react_1.default.createElement("div", { className: "upgrade-card__image" },
|
|
70
|
+
react_1.default.createElement(ImageGallerySlider_1.default, { images: room.getImages() })),
|
|
71
|
+
react_1.default.createElement("div", { className: "u-pad container" },
|
|
72
|
+
react_1.default.createElement(Text_1.default, { bold: true }, room.name),
|
|
73
|
+
react_1.default.createElement("div", { className: "u-marg-top--light" },
|
|
74
|
+
react_1.default.createElement(Text_1.default, { bold: true, color: Color_1.Color.Accent }, props.rate.name),
|
|
75
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.DarkGrey }, trimmedDescription)),
|
|
76
|
+
react_1.default.createElement("div", { className: "u-flex flex-column no-gutters u-marg-top" },
|
|
77
|
+
isMinStayUpgrade && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
78
|
+
react_1.default.createElement("div", { className: "u-marg-bottom" },
|
|
79
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Accent }, t(Translation_1.Translation.Step.Room.Upsell.ExtendYourStay, {
|
|
80
|
+
count: minNightStay - currentNights,
|
|
81
|
+
nights: StringHelper_1.default.pluralWithDict(minNightStay - currentNights, Translation_1.Translation.Misc.Night, t).toLowerCase(),
|
|
82
|
+
})),
|
|
83
|
+
extendedCheckoutDate && (react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Accent, bold: true, className: "u-marg-top-bottom--lighter" }, t(Translation_1.Translation.Step.Room.Upsell.ExtendCheckout, {
|
|
84
|
+
date: extendedCheckoutDate.format('MMM D, YYYY'),
|
|
85
|
+
}))),
|
|
86
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.DarkGrey }, t(Translation_1.Translation.Step.Room.Upsell.MinimumStay, { minNightStay }))),
|
|
87
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Graphite }, t(Translation_1.Translation.Step.Room.Upsell.SaveWithLongerStay)),
|
|
88
|
+
react_1.default.createElement("div", { className: "u-flex u-flex-flex-start u-flex-align-center flex-row" },
|
|
89
|
+
react_1.default.createElement(Headline_1.default, { bold: true, color: Color_1.Color.Success },
|
|
90
|
+
react_1.default.createElement("span", { className: "u-flex align-items-center" },
|
|
91
|
+
react_1.default.createElement(Currency_1.default, { hideDecimals: true }, props.rate.getAveragePrice()))),
|
|
92
|
+
react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, inline: true },
|
|
93
|
+
"/",
|
|
94
|
+
t(Translation_1.Translation.Misc.Night))),
|
|
95
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Success, className: "upgrade-inline-price" },
|
|
96
|
+
react_1.default.createElement(react_i18next_1.Trans, { i18nKey: Translation_1.Translation.Step.Room.Upsell.SavePerNight, values: { amount: Math.abs(priceDifference) }, components: [
|
|
97
|
+
react_1.default.createElement(Currency_1.default, { key: 0, hideDecimals: true }, Math.abs(priceDifference)),
|
|
98
|
+
] })))),
|
|
99
|
+
!isMinStayUpgrade && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
100
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Navy, inline: true }, t(Translation_1.Translation.Misc.From)),
|
|
101
|
+
react_1.default.createElement("div", { className: "u-flex u-flex-flex-start u-flex-align-center flex-row" },
|
|
102
|
+
react_1.default.createElement(Headline_1.default, { bold: true },
|
|
103
|
+
react_1.default.createElement("span", { className: "u-flex align-items-center" },
|
|
104
|
+
"+",
|
|
105
|
+
react_1.default.createElement(Currency_1.default, { hideDecimals: true }, priceDifference))),
|
|
106
|
+
react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, inline: true },
|
|
107
|
+
"/",
|
|
108
|
+
t(Translation_1.Translation.Misc.Night))))),
|
|
109
|
+
react_1.default.createElement("div", { className: "u-marg-bottom" },
|
|
110
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Grey, inline: true, className: "u-nowrap" },
|
|
111
|
+
react_1.default.createElement("span", { dangerouslySetInnerHTML: {
|
|
112
|
+
__html: props.rate.getPriceType() === RoomRate_1.RoomRatePriceInclusion.IncludingFeesAndTaxes
|
|
113
|
+
? t(Translation_1.Translation.Step.Room.RoomInfo.IncludesTaxes)
|
|
114
|
+
: t(Translation_1.Translation.Step.Room.ExcludingTaxes),
|
|
115
|
+
} }))),
|
|
116
|
+
react_1.default.createElement("div", { className: "u-marg-top--light u-flex justify-content-end u-w-100@m-" },
|
|
117
|
+
react_1.default.createElement(BEButton_1.default, { onClick: updateRate, name: "UpgradeRateButton", primary: true, filled: true, wide: true }, t(Translation_1.Translation.Step.Room.Upgrade)))))));
|
|
118
|
+
};
|
|
119
|
+
exports.default = LargeRateCard;
|
|
120
|
+
//# sourceMappingURL=LargeRateCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LargeRateCard.js","sourceRoot":"/","sources":["src/components/steps/room/LargeRateCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import dayjs from 'dayjs';\nimport React from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport BEButton from '@/components/generic/BEButton';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { RoomRate, RoomRatePriceInclusion } from '@/models/Room/RoomRate';\nimport { Color } from '@/util/Color';\nimport StringHelper from '@/util/StringHelper';\n\ninterface Props {\n rate: RoomRate;\n selectedRate: RoomRate;\n onSelectRate: () => void;\n startDate?: dayjs.Dayjs;\n}\n\nconst LargeRateCard = (props: Props) => {\n const { t } = useTranslation();\n\n const room = props.rate.getRoom();\n const trimmedDescription = props.rate.description || props.rate.name;\n\n const updateRate = () => {\n props.onSelectRate();\n };\n\n // Calculate the price difference\n const ratePrice = props.rate.getAveragePrice();\n const selectedPrice = props.selectedRate.getAveragePrice();\n const priceDifference = ratePrice - selectedPrice;\n\n // Calculate current nights from the selected rate's night rates\n const currentNights = Object.keys(props.selectedRate.nightRates).length;\n\n // Only show minimum stay upgrades if they require longer stay AND are cheaper per night\n const minNightStay = props.rate.minNightStayOverride;\n const isMinStayUpgrade = minNightStay && minNightStay > currentNights && ratePrice < selectedPrice;\n\n // Calculate the extended checkout date for minimum stay upgrades\n const extendedCheckoutDate = props.startDate && minNightStay ? props.startDate.add(minNightStay, 'days') : null;\n\n return (\n <div className=\"upgrade-card upgrade-card--rate u-border-rounded\">\n <div className=\"upgrade-card__image\">\n <ImageGallerySlider images={room.getImages()} />\n </div>\n <div className=\"u-pad container\">\n <Text bold>{room.name}</Text>\n <div className=\"u-marg-top--light\">\n <Text bold color={Color.Accent}>\n {props.rate.name}\n </Text>\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {trimmedDescription}\n </Text>\n </div>\n\n <div className=\"u-flex flex-column no-gutters u-marg-top\">\n {isMinStayUpgrade && (\n <>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Accent}>\n {t(Translation.Step.Room.Upsell.ExtendYourStay, {\n count: minNightStay - currentNights,\n nights: StringHelper.pluralWithDict(minNightStay - currentNights, Translation.Misc.Night, t).toLowerCase(),\n })}\n </Text>\n {extendedCheckoutDate && (\n <Text type={TextType.Small} color={Color.Accent} bold className=\"u-marg-top-bottom--lighter\">\n {t(Translation.Step.Room.Upsell.ExtendCheckout, {\n date: extendedCheckoutDate.format('MMM D, YYYY'),\n })}\n </Text>\n )}\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {t(Translation.Step.Room.Upsell.MinimumStay, { minNightStay })}\n </Text>\n </div>\n\n <Text type={TextType.Small} color={Color.Graphite}>\n {t(Translation.Step.Room.Upsell.SaveWithLongerStay)}\n </Text>\n\n <div className=\"u-flex u-flex-flex-start u-flex-align-center flex-row\">\n <Headline bold color={Color.Success}>\n <span className=\"u-flex align-items-center\">\n <Currency hideDecimals>{props.rate.getAveragePrice()}</Currency>\n </span>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n\n <Text type={TextType.Small} color={Color.Success} className=\"upgrade-inline-price\">\n <Trans\n i18nKey={Translation.Step.Room.Upsell.SavePerNight}\n values={{ amount: Math.abs(priceDifference) }}\n components={[\n <Currency key={0} hideDecimals>\n {Math.abs(priceDifference)}\n </Currency>,\n ]}\n />\n </Text>\n </>\n )}\n\n {!isMinStayUpgrade && (\n <>\n <Text type={TextType.Small} color={Color.Navy} inline>\n {t(Translation.Misc.From)}\n </Text>\n <div className=\"u-flex u-flex-flex-start u-flex-align-center flex-row\">\n <Headline bold>\n <span className=\"u-flex align-items-center\">\n +<Currency hideDecimals>{priceDifference}</Currency>\n </span>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n </>\n )}\n\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Grey} inline className=\"u-nowrap\">\n <span\n dangerouslySetInnerHTML={{\n __html:\n props.rate.getPriceType() === RoomRatePriceInclusion.IncludingFeesAndTaxes\n ? t(Translation.Step.Room.RoomInfo.IncludesTaxes)\n : t(Translation.Step.Room.ExcludingTaxes),\n }}\n ></span>\n </Text>\n </div>\n\n <div className=\"u-marg-top--light u-flex justify-content-end u-w-100@m-\">\n <BEButton onClick={updateRate} name=\"UpgradeRateButton\" primary filled wide>\n {t(Translation.Step.Room.Upgrade)}\n </BEButton>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LargeRateCard;\n"]}
|
|
@@ -48,6 +48,7 @@ const Icon_1 = __importStar(require("../../generic/Icon/Icon"));
|
|
|
48
48
|
const Text_1 = __importStar(require("../../generic/Text"));
|
|
49
49
|
const Tooltip_1 = __importDefault(require("../../generic/Tooltip/Tooltip"));
|
|
50
50
|
const ImageGallerySlider_1 = __importDefault(require("./ImageGallerySlider"));
|
|
51
|
+
const RoomRate_1 = require("../../../models/Room/RoomRate");
|
|
51
52
|
const Color_1 = require("../../../util/Color");
|
|
52
53
|
const HotelPerkHelper_1 = require("../../../util/HotelPerkHelper");
|
|
53
54
|
const ScreenSize_1 = __importDefault(require("../../../util/ScreenSize"));
|
|
@@ -91,8 +92,8 @@ const LargeRoomCard = (props) => {
|
|
|
91
92
|
text: t(Translation_1.Translation.Step.Room.PetFriendly),
|
|
92
93
|
});
|
|
93
94
|
}
|
|
94
|
-
return (react_1.default.createElement("div", { className: "
|
|
95
|
-
react_1.default.createElement("div", { className: "
|
|
95
|
+
return (react_1.default.createElement("div", { className: "upgrade-card upgrade-card--room u-border-rounded" },
|
|
96
|
+
react_1.default.createElement("div", { className: "upgrade-card__image" },
|
|
96
97
|
react_1.default.createElement(ImageGallerySlider_1.default, { images: (_e = props.rate) === null || _e === void 0 ? void 0 : _e.getRoom().getImages() })),
|
|
97
98
|
react_1.default.createElement("div", { className: "u-pad container" },
|
|
98
99
|
react_1.default.createElement(Text_1.default, { bold: true }, (_f = props.rate) === null || _f === void 0 ? void 0 : _f.getRoom().name),
|
|
@@ -136,7 +137,12 @@ const LargeRoomCard = (props) => {
|
|
|
136
137
|
"/",
|
|
137
138
|
t(Translation_1.Translation.Misc.Night))),
|
|
138
139
|
react_1.default.createElement("div", { className: "u-marg-bottom" },
|
|
139
|
-
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Grey, inline: true, className: "u-nowrap" },
|
|
140
|
+
react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Grey, inline: true, className: "u-nowrap" },
|
|
141
|
+
react_1.default.createElement("span", { dangerouslySetInnerHTML: {
|
|
142
|
+
__html: props.rate.getPriceType() === RoomRate_1.RoomRatePriceInclusion.IncludingFeesAndTaxes
|
|
143
|
+
? t(Translation_1.Translation.Step.Room.RoomInfo.IncludesTaxes)
|
|
144
|
+
: t(Translation_1.Translation.Step.Room.ExcludingTaxes),
|
|
145
|
+
} }))),
|
|
140
146
|
react_1.default.createElement("div", { className: "u-marg-top--light u-flex justify-content-end u-w-100@m-" },
|
|
141
147
|
react_1.default.createElement(BEButton_1.default, { onClick: updateRate, name: "ViewRatesNowButton", primary: true, filled: true, wide: true }, t(Translation_1.Translation.Step.Room.Upgrade)))))));
|
|
142
148
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LargeRoomCard.js","sourceRoot":"/","sources":["src/components/steps/room/LargeRoomCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BookingEngineContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport React, { useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport BEButton from '@/components/generic/BEButton';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport Text, { TextType } from '@/components/generic/Text';\nimport Tooltip from '@/components/generic/Tooltip/Tooltip';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport { Color } from '@/util/Color';\nimport { getPerkIconElement } from '@/util/HotelPerkHelper';\nimport ScreenSize from '@/util/ScreenSize';\n\ninterface Props {\n rate: RoomRate;\n selectedRate: RoomRate;\n\n onSelectRate: () => void;\n}\n\nconst LargeRoomCard = (props: Props) => {\n const beContext = useContext(BookingEngineContext);\n const { hotel } = useCurrentHotel();\n\n const { t } = useTranslation();\n\n const extraRoomData = hotel?.rooms[props.rate?.getRoom().code as string];\n const roomSize = hotel?.overwrites?.[props.rate?.getRoom().code as string];\n const trimmedDescription = props.rate?.getRoom().getShortDescription();\n const petFriendly = !!extraRoomData?.petFriendly;\n\n const room = props.rate.getRoom();\n const { roomPerks, prePerkDisclaimer } = room.getRoomPerks({\n hotel: hotel,\n room: room,\n perksLimitNumber: 4,\n });\n\n const updateRate = () => {\n props.onSelectRate();\n };\n\n const roomInfo = [\n {\n icon: IconType.People,\n text: t(Translation.Step.Room.Sleeps, {\n maxOccupancy: extraRoomData?.maxOccupancy,\n }),\n },\n {\n icon: IconType.Bed,\n text: extraRoomData?.bedTypeOverride ? extraRoomData?.bedTypeOverride : `${extraRoomData?.bedType} ${extraRoomData?.bedQuantity}`,\n },\n {\n icon: IconType.RoomSize,\n text: roomSize?.RoomDimensions,\n },\n ];\n\n if (petFriendly) {\n roomInfo.push({\n icon: IconType.PetFriendly,\n text: t(Translation.Step.Room.PetFriendly),\n });\n }\n\n return (\n <div className=\"large-room-card u-border-rounded\">\n <div className=\"large-room-card --image\">\n <ImageGallerySlider images={props.rate?.getRoom().getImages()} />\n </div>\n <div className=\"u-pad container\">\n <Text bold>{props.rate?.getRoom().name}</Text>\n <div className=\"u-flex u-marg-top-bottom\">\n {roomInfo.map((item, index) => {\n return (\n <div className=\"u-flex\" key={index}>\n <Icon icon={item.icon} />\n <Text className=\"u-marg-left--light\" type={TextType.Label}>\n {item.text}\n </Text>\n </div>\n );\n })}\n </div>\n <div className=\"u-marg-bottom--light description\">\n <Text className=\"text\" type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: trimmedDescription?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n\n {prePerkDisclaimer?.replace(/<br(\\/|)>/g, '') && (\n <div className=\"u-marg-bottom--heavy\">\n <Text color={Color.Accent} type={TextType.Small}>\n <strong>{t(Translation.Step.Room.RoomInfo.Disclaimer)}</strong>\n </Text>\n <Text color={Color.DarkGrey} type={TextType.Small}>\n <span className=\"u-text-overflow-ellipsis-2\" dangerouslySetInnerHTML={{ __html: prePerkDisclaimer?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n )}\n\n <Text className=\"u-marg-bottom\" bold type={TextType.Label} color={Color.Accent}>\n {t(Translation.Step.Room.YouWillGetThisAllForFree)}\n </Text>\n <div className=\"u-flex u-flex-align-center row justify-content-center\">\n <div className=\"u-flex col-md-12 flex-wrap justify-content-start\">\n {roomPerks?.map((perk) => {\n const isAllPerksOpened = beContext.screenSize < ScreenSize.ExtraLarge;\n const perkIconElement = getPerkIconElement(perk, Color.Snow);\n\n return (\n <div className=\"u-flex justify-content-start u-flex-align-center u-marg-bottom u-w-48@l- u-pad-left--light u-pad-right--light\" key={perk.name}>\n <Tooltip title={perk.name}>\n <div>{perkIconElement}</div>\n </Tooltip>\n <div className={`u-marg-left u-marg-right ${isAllPerksOpened ? '' : 'u-none'}`}>\n <Text type={TextType.Small}>\n {perk?.perkNameRenderer\n ? perk.perkNameRenderer({\n hotel,\n room,\n })\n : perk.name}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n <div className=\"u-flex flex-column no-gutters\">\n <Text type={TextType.Small} color={Color.Navy} inline>\n {t(Translation.Misc.From)}\n </Text>\n <div className=\"u-flex u-flex-flex-start u-flex-align-center flex-row\">\n <Headline bold>\n <span className=\"u-flex align-items-center\">\n +<Currency hideDecimals>{props.rate?.getAveragePrice() - props.selectedRate?.getAveragePrice()}</Currency>\n </span>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Grey} inline className=\"u-nowrap\">\n {t(Translation.Step.Room.ExcludingTaxes)}\n </Text>\n </div>\n <div className=\"u-marg-top--light u-flex justify-content-end u-w-100@m-\">\n <BEButton onClick={updateRate} name=\"ViewRatesNowButton\" primary filled wide>\n {t(Translation.Step.Room.Upgrade)}\n </BEButton>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LargeRoomCard;\n"]}
|
|
1
|
+
{"version":3,"file":"LargeRoomCard.js","sourceRoot":"/","sources":["src/components/steps/room/LargeRoomCard.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAA0D;AAC1D,2CAAkD;AAClD,+CAA0C;AAC1C,iDAA+C;AAC/C,0DAAuD;AAEvD,6EAAqD;AACrD,6EAAqD;AACrD,6EAAqD;AACrD,uEAAgE;AAChE,kEAA2D;AAC3D,mFAA2D;AAC3D,oGAA4E;AAC5E,qDAA0E;AAC1E,wCAAqC;AACrC,4DAA4D;AAC5D,mEAA2C;AAS3C,MAAM,aAAa,GAAG,CAAC,KAAY,EAAE,EAAE;;IACnC,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,+BAAoB,CAAC,CAAC;IACnD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,uBAAe,GAAE,CAAC;IAEpC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAE/B,MAAM,aAAa,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,GAAG,IAAc,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,0CAAG,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,GAAG,IAAc,CAAC,CAAC;IAC3E,MAAM,kBAAkB,GAAG,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACvE,MAAM,WAAW,GAAG,CAAC,CAAC,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,WAAW,CAAA,CAAC;IAEjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;QACvD,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,IAAI;QACV,gBAAgB,EAAE,CAAC;KACtB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,KAAK,CAAC,YAAY,EAAE,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG;QACb;YACI,IAAI,EAAE,eAAQ,CAAC,MAAM;YACrB,IAAI,EAAE,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAClC,YAAY,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,YAAY;aAC5C,CAAC;SACL;QACD;YACI,IAAI,EAAE,eAAQ,CAAC,GAAG;YAClB,IAAI,EAAE,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,eAAe,EAAC,CAAC,CAAC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,eAAe,CAAC,CAAC,CAAC,GAAG,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,IAAI,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,WAAW,EAAE;SACpI;QACD;YACI,IAAI,EAAE,eAAQ,CAAC,QAAQ;YACvB,IAAI,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc;SACjC;KACJ,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,eAAQ,CAAC,WAAW;YAC1B,IAAI,EAAE,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;SAC7C,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CACH,uCAAK,SAAS,EAAC,kDAAkD;QAC7D,uCAAK,SAAS,EAAC,qBAAqB;YAChC,8BAAC,4BAAkB,IAAC,MAAM,EAAE,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,GAAG,SAAS,EAAE,GAAI,CAC/D;QACN,uCAAK,SAAS,EAAC,iBAAiB;YAC5B,8BAAC,cAAI,IAAC,IAAI,UAAE,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,GAAG,IAAI,CAAQ;YAC9C,uCAAK,SAAS,EAAC,0BAA0B,IACpC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC1B,OAAO,CACH,uCAAK,SAAS,EAAC,QAAQ,EAAC,GAAG,EAAE,KAAK;oBAC9B,8BAAC,cAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAI;oBACzB,8BAAC,cAAI,IAAC,SAAS,EAAC,oBAAoB,EAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,IACpD,IAAI,CAAC,IAAI,CACP,CACL,CACT,CAAC;YACN,CAAC,CAAC,CACA;YACN,uCAAK,SAAS,EAAC,kCAAkC;gBAC7C,8BAAC,cAAI,IAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAE,eAAQ,CAAC,KAAK;oBACvC,wCAAM,uBAAuB,EAAE,EAAE,MAAM,EAAE,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,KAAI,EAAE,EAAE,GAAI,CAC/F,CACL;YAEL,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,KAAI,CAC7C,uCAAK,SAAS,EAAC,sBAAsB;gBACjC,8BAAC,cAAI,IAAC,KAAK,EAAE,aAAK,CAAC,MAAM,EAAE,IAAI,EAAE,eAAQ,CAAC,KAAK;oBAC3C,8CAAS,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAU,CAC5D;gBACP,8BAAC,cAAI,IAAC,KAAK,EAAE,aAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,eAAQ,CAAC,KAAK;oBAC7C,wCAAM,SAAS,EAAC,4BAA4B,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,CAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,KAAI,EAAE,EAAE,GAAI,CACrI,CACL,CACT;YAED,8BAAC,cAAI,IAAC,SAAS,EAAC,eAAe,EAAC,IAAI,QAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,aAAK,CAAC,MAAM,IACzE,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAC/C;YACP,uCAAK,SAAS,EAAC,uDAAuD;gBAClE,uCAAK,SAAS,EAAC,kDAAkD,IAC5D,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACrB,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,GAAG,oBAAU,CAAC,UAAU,CAAC;oBACtE,MAAM,eAAe,GAAG,IAAA,oCAAkB,EAAC,IAAI,EAAE,aAAK,CAAC,IAAI,CAAC,CAAC;oBAE7D,OAAO,CACH,uCAAK,SAAS,EAAC,+GAA+G,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI;wBACzI,8BAAC,iBAAO,IAAC,KAAK,EAAE,IAAI,CAAC,IAAI;4BACrB,2CAAM,eAAe,CAAO,CACtB;wBACV,uCAAK,SAAS,EAAE,4BAA4B,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;4BAC1E,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,IACrB,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB;gCACnB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;oCAClB,KAAK;oCACL,IAAI;iCACP,CAAC;gCACJ,CAAC,CAAC,IAAI,CAAC,IAAI,CACZ,CACL,CACJ,CACT,CAAC;gBACN,CAAC,CAAC,CACA,CACJ;YACN,uCAAK,SAAS,EAAC,+BAA+B;gBAC1C,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,aAAK,CAAC,IAAI,EAAE,MAAM,UAChD,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CACtB;gBACP,uCAAK,SAAS,EAAC,uDAAuD;oBAClE,8BAAC,kBAAQ,IAAC,IAAI;wBACV,wCAAM,SAAS,EAAC,2BAA2B;;4BACtC,8BAAC,kBAAQ,IAAC,YAAY,UAAE,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,eAAe,EAAE,KAAG,MAAA,KAAK,CAAC,YAAY,0CAAE,eAAe,EAAE,CAAA,CAAY,CACvG,CACA;oBACX,8BAAC,cAAI,IAAC,KAAK,EAAE,aAAK,CAAC,QAAQ,EAAE,MAAM;;wBAC7B,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CACxB,CACL;gBACN,uCAAK,SAAS,EAAC,eAAe;oBAC1B,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,aAAK,CAAC,IAAI,EAAE,MAAM,QAAC,SAAS,EAAC,UAAU;wBACtE,wCACI,uBAAuB,EAAE;gCACrB,MAAM,EACF,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,iCAAsB,CAAC,qBAAqB;oCACtE,CAAC,CAAC,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;oCACjD,CAAC,CAAC,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;6BACpD,GACG,CACL,CACL;gBACN,uCAAK,SAAS,EAAC,yDAAyD;oBACpE,8BAAC,kBAAQ,IAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC,oBAAoB,EAAC,OAAO,QAAC,MAAM,QAAC,IAAI,UACvE,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAC1B,CACT,CACJ,CACJ,CACJ,CACT,CAAC;AACN,CAAC,CAAC;AAEF,kBAAe,aAAa,CAAC","sourcesContent":["import { BookingEngineContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport React, { useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport BEButton from '@/components/generic/BEButton';\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport Text, { TextType } from '@/components/generic/Text';\nimport Tooltip from '@/components/generic/Tooltip/Tooltip';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { RoomRate, RoomRatePriceInclusion } from '@/models/Room/RoomRate';\nimport { Color } from '@/util/Color';\nimport { getPerkIconElement } from '@/util/HotelPerkHelper';\nimport ScreenSize from '@/util/ScreenSize';\n\ninterface Props {\n rate: RoomRate;\n selectedRate: RoomRate;\n\n onSelectRate: () => void;\n}\n\nconst LargeRoomCard = (props: Props) => {\n const beContext = useContext(BookingEngineContext);\n const { hotel } = useCurrentHotel();\n\n const { t } = useTranslation();\n\n const extraRoomData = hotel?.rooms[props.rate?.getRoom().code as string];\n const roomSize = hotel?.overwrites?.[props.rate?.getRoom().code as string];\n const trimmedDescription = props.rate?.getRoom().getShortDescription();\n const petFriendly = !!extraRoomData?.petFriendly;\n\n const room = props.rate.getRoom();\n const { roomPerks, prePerkDisclaimer } = room.getRoomPerks({\n hotel: hotel,\n room: room,\n perksLimitNumber: 4,\n });\n\n const updateRate = () => {\n props.onSelectRate();\n };\n\n const roomInfo = [\n {\n icon: IconType.People,\n text: t(Translation.Step.Room.Sleeps, {\n maxOccupancy: extraRoomData?.maxOccupancy,\n }),\n },\n {\n icon: IconType.Bed,\n text: extraRoomData?.bedTypeOverride ? extraRoomData?.bedTypeOverride : `${extraRoomData?.bedType} ${extraRoomData?.bedQuantity}`,\n },\n {\n icon: IconType.RoomSize,\n text: roomSize?.RoomDimensions,\n },\n ];\n\n if (petFriendly) {\n roomInfo.push({\n icon: IconType.PetFriendly,\n text: t(Translation.Step.Room.PetFriendly),\n });\n }\n\n return (\n <div className=\"upgrade-card upgrade-card--room u-border-rounded\">\n <div className=\"upgrade-card__image\">\n <ImageGallerySlider images={props.rate?.getRoom().getImages()} />\n </div>\n <div className=\"u-pad container\">\n <Text bold>{props.rate?.getRoom().name}</Text>\n <div className=\"u-flex u-marg-top-bottom\">\n {roomInfo.map((item, index) => {\n return (\n <div className=\"u-flex\" key={index}>\n <Icon icon={item.icon} />\n <Text className=\"u-marg-left--light\" type={TextType.Label}>\n {item.text}\n </Text>\n </div>\n );\n })}\n </div>\n <div className=\"u-marg-bottom--light description\">\n <Text className=\"text\" type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: trimmedDescription?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n\n {prePerkDisclaimer?.replace(/<br(\\/|)>/g, '') && (\n <div className=\"u-marg-bottom--heavy\">\n <Text color={Color.Accent} type={TextType.Small}>\n <strong>{t(Translation.Step.Room.RoomInfo.Disclaimer)}</strong>\n </Text>\n <Text color={Color.DarkGrey} type={TextType.Small}>\n <span className=\"u-text-overflow-ellipsis-2\" dangerouslySetInnerHTML={{ __html: prePerkDisclaimer?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n )}\n\n <Text className=\"u-marg-bottom\" bold type={TextType.Label} color={Color.Accent}>\n {t(Translation.Step.Room.YouWillGetThisAllForFree)}\n </Text>\n <div className=\"u-flex u-flex-align-center row justify-content-center\">\n <div className=\"u-flex col-md-12 flex-wrap justify-content-start\">\n {roomPerks?.map((perk) => {\n const isAllPerksOpened = beContext.screenSize < ScreenSize.ExtraLarge;\n const perkIconElement = getPerkIconElement(perk, Color.Snow);\n\n return (\n <div className=\"u-flex justify-content-start u-flex-align-center u-marg-bottom u-w-48@l- u-pad-left--light u-pad-right--light\" key={perk.name}>\n <Tooltip title={perk.name}>\n <div>{perkIconElement}</div>\n </Tooltip>\n <div className={`u-marg-left u-marg-right ${isAllPerksOpened ? '' : 'u-none'}`}>\n <Text type={TextType.Small}>\n {perk?.perkNameRenderer\n ? perk.perkNameRenderer({\n hotel,\n room,\n })\n : perk.name}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n <div className=\"u-flex flex-column no-gutters\">\n <Text type={TextType.Small} color={Color.Navy} inline>\n {t(Translation.Misc.From)}\n </Text>\n <div className=\"u-flex u-flex-flex-start u-flex-align-center flex-row\">\n <Headline bold>\n <span className=\"u-flex align-items-center\">\n +<Currency hideDecimals>{props.rate?.getAveragePrice() - props.selectedRate?.getAveragePrice()}</Currency>\n </span>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Grey} inline className=\"u-nowrap\">\n <span\n dangerouslySetInnerHTML={{\n __html:\n props.rate.getPriceType() === RoomRatePriceInclusion.IncludingFeesAndTaxes\n ? t(Translation.Step.Room.RoomInfo.IncludesTaxes)\n : t(Translation.Step.Room.ExcludingTaxes),\n }}\n ></span>\n </Text>\n </div>\n <div className=\"u-marg-top--light u-flex justify-content-end u-w-100@m-\">\n <BEButton onClick={updateRate} name=\"ViewRatesNowButton\" primary filled wide>\n {t(Translation.Step.Room.Upgrade)}\n </BEButton>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LargeRoomCard;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReservationsDTO } from '@roomstay/core';
|
|
1
|
+
import { IPaymentCheckoutDetails, ReservationsDTO } from '@roomstay/core';
|
|
2
2
|
import type dayjs from 'dayjs';
|
|
3
3
|
import type { Addon } from '../../models/Addon/Addon';
|
|
4
4
|
import type BasketAddonRow from '../../models/BasketAddonRow';
|
|
@@ -7,7 +7,6 @@ import { ItemisedFee } from '../../models/Fee';
|
|
|
7
7
|
import type { IPromotion } from '../../models/Promotion/IPromotion.type';
|
|
8
8
|
import type { RoomRate } from '../../models/Room/RoomRate';
|
|
9
9
|
import { RoomstaySession } from '../../models/RoomstaySession';
|
|
10
|
-
import { IPaymentCheckoutDetails } from '@roomstay/core';
|
|
11
10
|
export interface BasketContextType {
|
|
12
11
|
selectedBasketRow: BasketRow;
|
|
13
12
|
currentBasketRows: BasketRow[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasketContextType.js","sourceRoot":"/","sources":["src/contexts/BasketContext/BasketContextType.ts"],"names":[],"mappings":"","sourcesContent":["import { ReservationsDTO } from '@roomstay/core';\nimport type dayjs from 'dayjs';\n\nimport type { Addon } from '@/models/Addon/Addon';\nimport type BasketAddonRow from '@/models/BasketAddonRow';\nimport type BasketRow from '@/models/BasketRow';\nimport { ItemisedFee } from '@/models/Fee';\nimport type { IPromotion } from '@/models/Promotion/IPromotion.type';\nimport type { RoomRate } from '@/models/Room/RoomRate';\nimport { RoomstaySession } from '@/models/RoomstaySession';\
|
|
1
|
+
{"version":3,"file":"BasketContextType.js","sourceRoot":"/","sources":["src/contexts/BasketContext/BasketContextType.ts"],"names":[],"mappings":"","sourcesContent":["import { IPaymentCheckoutDetails, ReservationsDTO } from '@roomstay/core';\nimport type dayjs from 'dayjs';\n\nimport type { Addon } from '@/models/Addon/Addon';\nimport type BasketAddonRow from '@/models/BasketAddonRow';\nimport type BasketRow from '@/models/BasketRow';\nimport { ItemisedFee } from '@/models/Fee';\nimport type { IPromotion } from '@/models/Promotion/IPromotion.type';\nimport type { RoomRate } from '@/models/Room/RoomRate';\nimport { RoomstaySession } from '@/models/RoomstaySession';\n\nexport interface BasketContextType {\n selectedBasketRow: BasketRow;\n currentBasketRows: BasketRow[];\n basketAddonRows: BasketAddonRow[];\n basketFeeRows: ItemisedFee[];\n loadedPromotion: IPromotion | null;\n quoteQueryID: string; // This ID is used to detect changes and re-fetch deposit quotes during checkout.\n\n startDate: dayjs.Dayjs;\n endDate: dayjs.Dayjs;\n pencilId: string | undefined;\n\n isLoadingPriceQuote: boolean;\n\n addBasketRow: (row: BasketRow) => void;\n addRate: (rate: RoomRate, notify?: boolean) => Promise<void>;\n\n getAllValidRows: () => BasketRow[];\n getAllDatelessRows: () => BasketRow[];\n\n getNumberOfAdults: (withTranslation: boolean) => number | string;\n getNumberOfChildren: (withTranslation: boolean) => number | string;\n getNumberOfInfants: (withTranslation: boolean) => number | string;\n getNumberOfRooms: (withTranslation: boolean) => number | string;\n\n getTotalPrice: () => any;\n getTotalQuoteDeposit: () => number;\n getDepositQuoteFees: () => number;\n getTotalFees: () => number;\n getItemisedFees: () => ItemisedFee[];\n // Can be null if we don't know the pay now amount (SynXis)\n getTotalPayNow: () => number | null;\n\n updateBasketRow: (row: BasketRow, updateGlobalDates?: boolean) => void;\n removeBasketRow: (row: BasketRow) => void;\n\n clearBasketRows: (confirm: boolean) => void;\n selectBasketRow: (row: BasketRow | null) => void;\n\n setStartDate: (date: dayjs.Dayjs) => void;\n setEndDate: (date: dayjs.Dayjs) => void;\n\n quoteOrPencilReservation: (applyQuote: () => boolean) => void;\n\n hasCheckedOut: boolean;\n reservationData: ReservationsDTO;\n booked: (data: ReservationsDTO, reservationRequest?: RoomstaySession['reservationRequest']) => Promise<void>;\n rollback: () => void;\n checkedOut: (data: ReservationsDTO) => void;\n clearSelectedRates: () => void;\n finish: () => void;\n additionalPaymentRequired: (data: IPaymentCheckoutDetails) => void;\n\n getRowForAddon: (selectedAddon: Addon) => BasketAddonRow | undefined;\n\n setAddonQuantities: (addon: Addon, quantities: { quantity: number; adult: number; child: number }, selectedDate: string, selectedTime: string) => void;\n\n removeBasketAddonRow: (row: BasketAddonRow) => void;\n attemptSelectUnfilledRow: () => BasketRow | undefined;\n\n initBasketRows: (basketRows: BasketRow[]) => void;\n updateBasketFeeRows: () => void;\n\n onDatePickerOpenChange: (isOpen: boolean) => void;\n isDatePickerOpen: boolean;\n}\n"]}
|
|
@@ -235,6 +235,8 @@ const CompanyContextWrapper = ({ configCompany: company, children }) => {
|
|
|
235
235
|
updatedHotel.integrations = details.integrations;
|
|
236
236
|
updatedHotel.availableCountries = details.availableCountries;
|
|
237
237
|
updatedHotel.preventCancellation = details.preventCancellation;
|
|
238
|
+
updatedHotel.enableRoomUpsells = details.enableRoomUpsells;
|
|
239
|
+
updatedHotel.enableRateUpsells = details.enableRateUpsells;
|
|
238
240
|
if (updatedHotel.dataSource === HotelDataSource_types_1.HotelDataSource.Roomstay) {
|
|
239
241
|
if (details.logo) {
|
|
240
242
|
updatedHotel.logo = details.logo;
|