@roomstay/frontend 2.6.59 → 2.6.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/449.bundle.js +1 -1
  2. package/dist/main.bundle.js +1 -1
  3. package/dist/src/components/steps/hotel/HotelCard.js +22 -5
  4. package/dist/src/components/steps/hotel/HotelCard.js.map +1 -1
  5. package/dist/src/components/steps/room/ImageGallerySlider.js +5 -3
  6. package/dist/src/components/steps/room/ImageGallerySlider.js.map +1 -1
  7. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateRow.d.ts +3 -1
  8. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateRow.js +47 -21
  9. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateRow.js.map +1 -1
  10. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.d.ts +3 -1
  11. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.js +7 -6
  12. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.js.map +1 -1
  13. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.d.ts +4 -0
  14. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngine.js.map +1 -1
  15. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.d.ts +28 -0
  16. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js +202 -41
  17. package/dist/src/engines/InlineRoomMiniEngine/InlineRoomMiniEngineElement.js.map +1 -1
  18. package/dist/src/pages/findReservation/FindReservation.js +15 -4
  19. package/dist/src/pages/findReservation/FindReservation.js.map +1 -1
  20. package/dist/src/pages/hotel/HotelInfo.js +1 -1
  21. package/dist/src/pages/hotel/HotelInfo.js.map +1 -1
  22. package/dist/test.bundle.js +1 -1
  23. package/dist/tests/offline/entry/config/hotelSpecDefault.js +1 -1
  24. package/dist/tests/offline/entry/config/hotelSpecDefault.js.map +1 -1
  25. package/dist/vendors.bundle.js +1 -1
  26. package/package.json +1 -1
@@ -64,7 +64,7 @@ const HotelCard = ({ hotel }) => {
64
64
  const { hotel: currentHotel } = (0, hooks_1.useCurrentHotel)();
65
65
  const basketContext = (0, contexts_1.useBasket)();
66
66
  const navigate = (0, react_router_dom_1.useNavigate)();
67
- const [images, setImages] = (0, react_1.useState)([hotel.heroImage]);
67
+ const [images, setImages] = (0, react_1.useState)([]);
68
68
  const [modalOpen, setModalOpen] = (0, react_1.useState)(false);
69
69
  const hotelCardRef = (0, react_1.useRef)(null);
70
70
  const currentPrice = (_a = hotel.lowestPrice) === null || _a === void 0 ? void 0 : _a.value;
@@ -72,7 +72,10 @@ const HotelCard = ({ hotel }) => {
72
72
  const showPrice = currentPriceLoading || (!currentPriceLoading && currentPrice > 0);
73
73
  const { t } = (0, react_i18next_1.useTranslation)();
74
74
  (0, react_1.useEffect)(() => {
75
- const newImages = [hotel.heroImage];
75
+ const newImages = [];
76
+ if (hotel.heroImage) {
77
+ newImages.push(hotel.heroImage);
78
+ }
76
79
  if (hotel.rooms) {
77
80
  for (const room of Object.values(hotel.rooms)) {
78
81
  room.images.forEach((image) => {
@@ -81,13 +84,13 @@ const HotelCard = ({ hotel }) => {
81
84
  }
82
85
  }
83
86
  setImages(newImages);
84
- }, [hotel.rooms]);
87
+ }, [hotel.rooms, hotel.heroImage, setImages]);
85
88
  (0, react_1.useEffect)(() => {
86
89
  if (!hotel.hasLoadedDetails) {
87
90
  // If we haven't fetched this hotel yet, lets trigger
88
91
  ccx.getHotel(hotel.hotelID);
89
92
  }
90
- }, [hotel.hasLoadedDetails]);
93
+ }, [hotel.hotelID, hotel.hasLoadedDetails]);
91
94
  const [openPerk, setOpenPerk] = (0, react_1.useState)((_d = (_c = hotel.perks) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.name);
92
95
  const colorProfile = hotel.colors;
93
96
  const onViewRoomsClicked = () => __awaiter(void 0, void 0, void 0, function* () {
@@ -177,7 +180,21 @@ const HotelCard = ({ hotel }) => {
177
180
  ${(0, Color_1.getAccentOverrideStyleContent)(colorProfile)}
178
181
  }`),
179
182
  content));
180
- }, [currentPrice, isLoading, currentPriceLoading, modalOpen, hotelCardRef, openPerk]);
183
+ }, [
184
+ isLoading,
185
+ images,
186
+ hotel === null || hotel === void 0 ? void 0 : hotel.hotelID,
187
+ hotel === null || hotel === void 0 ? void 0 : hotel.address,
188
+ hotel === null || hotel === void 0 ? void 0 : hotel.perks,
189
+ hotel === null || hotel === void 0 ? void 0 : hotel.lowestPrice,
190
+ hotel === null || hotel === void 0 ? void 0 : hotel.colors,
191
+ currentPrice,
192
+ currentPriceLoading,
193
+ modalOpen,
194
+ hotelCardRef,
195
+ openPerk,
196
+ showPrice,
197
+ ]);
181
198
  };
182
199
  exports.default = HotelCard;
183
200
  //# sourceMappingURL=HotelCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HotelCard.js","sourceRoot":"/","sources":["src/components/steps/hotel/HotelCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BookingEngineContext, CompanyContext, useBasket } from '@frontend/contexts';\nimport dayjs from 'dayjs';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation, useNavigate } from 'react-router-dom';\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 { IconType } from '@/components/generic/Icon/Icon';\nimport SmallSpinner from '@/components/generic/loader/SmallSpinner';\nimport Placeholder from '@/components/generic/Placeholder';\nimport Text, { TextType } from '@/components/generic/Text';\nimport Tooltip from '@/components/generic/Tooltip/Tooltip';\nimport HotelCardModal from '@/components/steps/hotel/HotelCardModal';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { useCurrentHotel } from '@/hooks';\nimport BasketRow from '@/models/BasketRow';\nimport { Hotel } from '@/models/Client/Hotel/Hotel';\nimport { Color, getAccentOverrideStyleContent, lightOrDark } from '@/util/Color';\nimport getStepRoom from '@/util/GetStepRoom';\nimport { getPerkIconElement } from '@/util/HotelPerkHelper';\nimport ScreenSize from '@/util/ScreenSize';\n\ninterface HotelCardProps {\n hotel: Hotel;\n}\n\nconst HotelCard = ({ hotel }: HotelCardProps) => {\n const beContext = useContext(BookingEngineContext);\n const ccx = useContext(CompanyContext);\n const { hotel: currentHotel } = useCurrentHotel();\n const basketContext = useBasket();\n\n const navigate = useNavigate();\n\n const [images, setImages] = useState([hotel.heroImage]);\n const [modalOpen, setModalOpen] = useState(false);\n\n const hotelCardRef = useRef<HTMLElement | null>(null);\n\n const currentPrice = hotel.lowestPrice?.value;\n const currentPriceLoading = hotel.lowestPrice?.isLoading;\n\n const showPrice = currentPriceLoading || (!currentPriceLoading && (currentPrice as number) > 0);\n\n const { t } = useTranslation();\n\n useEffect(() => {\n const newImages: string[] = [hotel.heroImage];\n\n if (hotel.rooms) {\n for (const room of Object.values(hotel.rooms)) {\n room.images.forEach((image) => {\n newImages.push(image);\n });\n }\n }\n\n setImages(newImages);\n }, [hotel.rooms]);\n\n useEffect(() => {\n if (!hotel.hasLoadedDetails) {\n // If we haven't fetched this hotel yet, lets trigger\n ccx.getHotel(hotel.hotelID);\n }\n }, [hotel.hasLoadedDetails]);\n\n const [openPerk, setOpenPerk] = useState(hotel.perks?.[0]?.name);\n const colorProfile = hotel.colors;\n\n const onViewRoomsClicked = async () => {\n if (currentHotel?.hotelID !== hotel.hotelID) {\n const appliedBasketRow = basketContext.selectedBasketRow || basketContext.currentBasketRows[basketContext.currentBasketRows.length - 1];\n const row = new BasketRow();\n row.setStartDate(appliedBasketRow?.getStartDate() || dayjs().add(1, 'day'));\n row.setEndDate(appliedBasketRow?.getEndDate() || dayjs().add(2, 'day'));\n row.setAdults(appliedBasketRow?.getAdults() || 1);\n row.setChildren(appliedBasketRow?.getChildren() || 0);\n row.setInfants(appliedBasketRow?.getInfants() || 0);\n row.setPromoCode(appliedBasketRow.getPromoCode() ?? '');\n basketContext.initBasketRows([row]);\n }\n ccx.changeHotel(hotel);\n\n navigate(getStepRoom().getStepUrl());\n };\n\n const onMoreDetailsClicked = async () => {\n setModalOpen(true);\n };\n\n const onModalClose = () => {\n setModalOpen(false);\n };\n\n const isLoading = !hotel.hasLoadedDetails;\n\n return useMemo(() => {\n const content = isLoading ? (\n <div>\n <div className=\"d-flex flex-column\">\n <Placeholder type=\"block\" blockSize=\"sm\" rounded=\"lg\" blink />\n <div className=\"u-pad\">\n <Placeholder type=\"text\" w=\"md\" h=\"md\" blink />\n <Placeholder type=\"text\" w=\"md\" h=\"md\" blink />\n <div className=\"u-marg-top\">\n <div className=\"u-flex justify-space-between\">\n <Placeholder type=\"block\" blockSize=\"xs\" rounded=\"lg\" blink />\n <Placeholder type=\"block\" blockSize=\"xs\" rounded=\"lg\" blink />\n <Placeholder type=\"block\" blockSize=\"xs\" rounded=\"lg\" blink />\n </div>\n </div>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"large-hotel-card u-rounded h-100 justify-items-between\">\n <div className=\"large-hotel-card--image\">\n <ImageGallerySlider images={images} />\n </div>\n <div className=\"large-hotel-card--body u-pad--heavy u-pad-bottom--none container\">\n <Headline bold>{hotel?.name}</Headline>\n <Text color={Color.DarkGrey} bold className=\"u-marg-bottom--light\">\n {hotel?.address?.city}\n </Text>\n <div className=\"u-flex u-marg-bottom\">\n <Text type={TextType.Small}>{[hotel?.address?.line1, hotel?.address?.line2, hotel?.address?.state].filter((line) => !!line).join(', ')}</Text>\n </div>\n <div className=\"u-marg-bottom--medium large-hotel-card--description\">\n <Text className=\"text\" type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: hotel.description || '' }}></span>\n </Text>\n </div>\n {!!hotel.perks?.length && (\n <Text className=\"u-marg-bottom\" bold type={TextType.Small} color={Color.Accent}>\n And these come free...\n </Text>\n )}\n <div className=\"u-flex u-flex-align-center u-marg-bottom--medium\">\n {!!hotel.perks?.length && (\n <div className=\"u-flex\">\n {hotel.perks.slice(0, 5).map((perk) => {\n const openPerkOnClick = () => {\n setOpenPerk(perk.name);\n };\n\n const perkIconElement = getPerkIconElement(perk);\n return (\n <div className=\"u-flex u-flex-align-center\" key={perk.name}>\n <Tooltip\n title={perk.tooltip ?? perk.name}\n overrideContainer={hotelCardRef?.current}\n dark={lightOrDark(hotel.colors.accent2) === 'dark'}\n >\n <div\n onClick={openPerkOnClick}\n style={{ backgroundColor: Color.Snow }}\n className=\"u-rounded u-pad--light u-marg-right--light d-flex justify-center\"\n >\n <div className=\"u-mw-16 d-flex justify-content-center\">{perkIconElement}</div>\n </div>\n </Tooltip>\n <div\n className={\n 'u-marg-right u-none@l- u-block@m- ' +\n (beContext.screenSize > ScreenSize.Medium ||\n beContext.screenSize <= ScreenSize.Mobile ||\n (beContext.screenSize > ScreenSize.Mobile && beContext.screenSize <= ScreenSize.Medium && openPerk !== perk.name)\n ? 'u-none-2'\n : '')\n }\n >\n <Text type={TextType.Small}>{perk.name}</Text>\n </div>\n </div>\n );\n })}\n </div>\n )}\n <BEButton icon={IconType.ArrowRight2} isText primary size=\"tiny\" iconPosition=\"right\" onClick={onMoreDetailsClicked}>\n {t(Translation.Step.Room.RoomInfo.MoreDetails)}\n </BEButton>\n </div>\n </div>\n <div className=\"u-pad--heavy u-pad-top--none h-100 justify-content-end u-flex flex-column u-flex-align-flex-start align-items-md-start no-gutters\">\n {showPrice ? (\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 className=\"u-flex\">\n {hotel.lowestPrice?.isLoading ? (\n <SmallSpinner />\n ) : (\n <Currency hideDecimals originalCurrencyCode={hotel.defaultCurrency}>\n {currentPrice}\n </Currency>\n )}\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 </>\n ) : (\n <div className=\"u-h-fill d-flex align-items-center\">\n <Text type={TextType.Small} color={Color.Alert}>\n {t(Translation.Step.Hotel.HotelCard.DatesUnavailable)}\n </Text>\n </div>\n )}\n\n <div className=\"u-marg-top--light u-flex justify-content-end u-w-100@m-\">\n <BEButton\n name=\"ViewRatesNowButton\"\n primary\n primaryActive\n filled\n icon={IconType.ArrowRight}\n iconPosition=\"right\"\n wide={beContext.screenSize <= ScreenSize.Medium}\n onClick={onViewRoomsClicked}\n >\n {t(Translation.Step.Hotel.ViewRooms)}\n </BEButton>\n </div>\n </div>\n <HotelCardModal open={modalOpen} onClose={onModalClose} hotel={hotel} container={hotelCardRef?.current} />\n </div>\n );\n\n return (\n <span ref={hotelCardRef} id={`hotel-card-${hotel.hotelID}`}>\n <style>{`#hotel-card-modal-${hotel.hotelID},\n #hotel-card-${hotel.hotelID} {\n ${getAccentOverrideStyleContent(colorProfile)}\n }`}</style>\n {content}\n </span>\n );\n }, [currentPrice, isLoading, currentPriceLoading, modalOpen, hotelCardRef, openPerk]);\n};\n\nexport default HotelCard;\n"]}
1
+ {"version":3,"file":"HotelCard.js","sourceRoot":"/","sources":["src/components/steps/hotel/HotelCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BookingEngineContext, CompanyContext, useBasket } from '@frontend/contexts';\nimport dayjs from 'dayjs';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom';\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 { IconType } from '@/components/generic/Icon/Icon';\nimport SmallSpinner from '@/components/generic/loader/SmallSpinner';\nimport Placeholder from '@/components/generic/Placeholder';\nimport Text, { TextType } from '@/components/generic/Text';\nimport Tooltip from '@/components/generic/Tooltip/Tooltip';\nimport HotelCardModal from '@/components/steps/hotel/HotelCardModal';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { useCurrentHotel } from '@/hooks';\nimport BasketRow from '@/models/BasketRow';\nimport { Hotel } from '@/models/Client/Hotel/Hotel';\nimport { Color, getAccentOverrideStyleContent, lightOrDark } from '@/util/Color';\nimport getStepRoom from '@/util/GetStepRoom';\nimport { getPerkIconElement } from '@/util/HotelPerkHelper';\nimport ScreenSize from '@/util/ScreenSize';\n\ninterface HotelCardProps {\n hotel: Hotel;\n}\n\nconst HotelCard = ({ hotel }: HotelCardProps) => {\n const beContext = useContext(BookingEngineContext);\n const ccx = useContext(CompanyContext);\n const { hotel: currentHotel } = useCurrentHotel();\n const basketContext = useBasket();\n\n const navigate = useNavigate();\n\n const [images, setImages] = useState<string[]>([]);\n const [modalOpen, setModalOpen] = useState(false);\n\n const hotelCardRef = useRef<HTMLElement | null>(null);\n\n const currentPrice = hotel.lowestPrice?.value;\n const currentPriceLoading = hotel.lowestPrice?.isLoading;\n\n const showPrice = currentPriceLoading || (!currentPriceLoading && (currentPrice as number) > 0);\n\n const { t } = useTranslation();\n\n useEffect(() => {\n const newImages: string[] = [];\n if (hotel.heroImage) {\n newImages.push(hotel.heroImage);\n }\n\n if (hotel.rooms) {\n for (const room of Object.values(hotel.rooms)) {\n room.images.forEach((image) => {\n newImages.push(image);\n });\n }\n }\n\n setImages(newImages);\n }, [hotel.rooms, hotel.heroImage, setImages]);\n\n useEffect(() => {\n if (!hotel.hasLoadedDetails) {\n // If we haven't fetched this hotel yet, lets trigger\n ccx.getHotel(hotel.hotelID);\n }\n }, [hotel.hotelID, hotel.hasLoadedDetails]);\n\n const [openPerk, setOpenPerk] = useState(hotel.perks?.[0]?.name);\n const colorProfile = hotel.colors;\n\n const onViewRoomsClicked = async () => {\n if (currentHotel?.hotelID !== hotel.hotelID) {\n const appliedBasketRow = basketContext.selectedBasketRow || basketContext.currentBasketRows[basketContext.currentBasketRows.length - 1];\n const row = new BasketRow();\n row.setStartDate(appliedBasketRow?.getStartDate() || dayjs().add(1, 'day'));\n row.setEndDate(appliedBasketRow?.getEndDate() || dayjs().add(2, 'day'));\n row.setAdults(appliedBasketRow?.getAdults() || 1);\n row.setChildren(appliedBasketRow?.getChildren() || 0);\n row.setInfants(appliedBasketRow?.getInfants() || 0);\n row.setPromoCode(appliedBasketRow.getPromoCode() ?? '');\n basketContext.initBasketRows([row]);\n }\n ccx.changeHotel(hotel);\n\n navigate(getStepRoom().getStepUrl());\n };\n\n const onMoreDetailsClicked = async () => {\n setModalOpen(true);\n };\n\n const onModalClose = () => {\n setModalOpen(false);\n };\n\n const isLoading = !hotel.hasLoadedDetails;\n\n return useMemo(() => {\n const content = isLoading ? (\n <div>\n <div className=\"d-flex flex-column\">\n <Placeholder type=\"block\" blockSize=\"sm\" rounded=\"lg\" blink />\n <div className=\"u-pad\">\n <Placeholder type=\"text\" w=\"md\" h=\"md\" blink />\n <Placeholder type=\"text\" w=\"md\" h=\"md\" blink />\n <div className=\"u-marg-top\">\n <div className=\"u-flex justify-space-between\">\n <Placeholder type=\"block\" blockSize=\"xs\" rounded=\"lg\" blink />\n <Placeholder type=\"block\" blockSize=\"xs\" rounded=\"lg\" blink />\n <Placeholder type=\"block\" blockSize=\"xs\" rounded=\"lg\" blink />\n </div>\n </div>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"large-hotel-card u-rounded h-100 justify-items-between\">\n <div className=\"large-hotel-card--image\">\n <ImageGallerySlider images={images} />\n </div>\n <div className=\"large-hotel-card--body u-pad--heavy u-pad-bottom--none container\">\n <Headline bold>{hotel?.name}</Headline>\n <Text color={Color.DarkGrey} bold className=\"u-marg-bottom--light\">\n {hotel?.address?.city}\n </Text>\n <div className=\"u-flex u-marg-bottom\">\n <Text type={TextType.Small}>{[hotel?.address?.line1, hotel?.address?.line2, hotel?.address?.state].filter((line) => !!line).join(', ')}</Text>\n </div>\n <div className=\"u-marg-bottom--medium large-hotel-card--description\">\n <Text className=\"text\" type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: hotel.description || '' }}></span>\n </Text>\n </div>\n {!!hotel.perks?.length && (\n <Text className=\"u-marg-bottom\" bold type={TextType.Small} color={Color.Accent}>\n And these come free...\n </Text>\n )}\n <div className=\"u-flex u-flex-align-center u-marg-bottom--medium\">\n {!!hotel.perks?.length && (\n <div className=\"u-flex\">\n {hotel.perks.slice(0, 5).map((perk) => {\n const openPerkOnClick = () => {\n setOpenPerk(perk.name);\n };\n\n const perkIconElement = getPerkIconElement(perk);\n return (\n <div className=\"u-flex u-flex-align-center\" key={perk.name}>\n <Tooltip\n title={perk.tooltip ?? perk.name}\n overrideContainer={hotelCardRef?.current}\n dark={lightOrDark(hotel.colors.accent2) === 'dark'}\n >\n <div\n onClick={openPerkOnClick}\n style={{ backgroundColor: Color.Snow }}\n className=\"u-rounded u-pad--light u-marg-right--light d-flex justify-center\"\n >\n <div className=\"u-mw-16 d-flex justify-content-center\">{perkIconElement}</div>\n </div>\n </Tooltip>\n <div\n className={\n 'u-marg-right u-none@l- u-block@m- ' +\n (beContext.screenSize > ScreenSize.Medium ||\n beContext.screenSize <= ScreenSize.Mobile ||\n (beContext.screenSize > ScreenSize.Mobile && beContext.screenSize <= ScreenSize.Medium && openPerk !== perk.name)\n ? 'u-none-2'\n : '')\n }\n >\n <Text type={TextType.Small}>{perk.name}</Text>\n </div>\n </div>\n );\n })}\n </div>\n )}\n <BEButton icon={IconType.ArrowRight2} isText primary size=\"tiny\" iconPosition=\"right\" onClick={onMoreDetailsClicked}>\n {t(Translation.Step.Room.RoomInfo.MoreDetails)}\n </BEButton>\n </div>\n </div>\n <div className=\"u-pad--heavy u-pad-top--none h-100 justify-content-end u-flex flex-column u-flex-align-flex-start align-items-md-start no-gutters\">\n {showPrice ? (\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 className=\"u-flex\">\n {hotel.lowestPrice?.isLoading ? (\n <SmallSpinner />\n ) : (\n <Currency hideDecimals originalCurrencyCode={hotel.defaultCurrency}>\n {currentPrice}\n </Currency>\n )}\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 </>\n ) : (\n <div className=\"u-h-fill d-flex align-items-center\">\n <Text type={TextType.Small} color={Color.Alert}>\n {t(Translation.Step.Hotel.HotelCard.DatesUnavailable)}\n </Text>\n </div>\n )}\n\n <div className=\"u-marg-top--light u-flex justify-content-end u-w-100@m-\">\n <BEButton\n name=\"ViewRatesNowButton\"\n primary\n primaryActive\n filled\n icon={IconType.ArrowRight}\n iconPosition=\"right\"\n wide={beContext.screenSize <= ScreenSize.Medium}\n onClick={onViewRoomsClicked}\n >\n {t(Translation.Step.Hotel.ViewRooms)}\n </BEButton>\n </div>\n </div>\n <HotelCardModal open={modalOpen} onClose={onModalClose} hotel={hotel} container={hotelCardRef?.current} />\n </div>\n );\n\n return (\n <span ref={hotelCardRef} id={`hotel-card-${hotel.hotelID}`}>\n <style>{`#hotel-card-modal-${hotel.hotelID},\n #hotel-card-${hotel.hotelID} {\n ${getAccentOverrideStyleContent(colorProfile)}\n }`}</style>\n {content}\n </span>\n );\n }, [\n isLoading,\n images,\n hotel?.hotelID,\n hotel?.address,\n hotel?.perks,\n hotel?.lowestPrice,\n hotel?.colors,\n currentPrice,\n currentPriceLoading,\n modalOpen,\n hotelCardRef,\n openPerk,\n showPrice,\n ]);\n};\n\nexport default HotelCard;\n"]}
@@ -39,12 +39,14 @@ const ImageProvider_1 = __importStar(require("../../../providers/ImageProvider")
39
39
  const Color_1 = require("../../../util/Color");
40
40
  const ScreenSize_1 = __importDefault(require("../../../util/ScreenSize"));
41
41
  function ImageGallerySlider(props) {
42
- var _a;
43
42
  const context = (0, react_1.useContext)(contexts_1.BookingEngineContext);
44
43
  const [{ x }, set] = (0, web_1.useSpring)(() => ({ x: 0 }));
45
44
  const [ref, bounds] = (0, react_use_measure_1.default)();
46
45
  const [prevReleasePosition, setPrevRelPos] = (0, react_1.useState)(0);
47
- const images = (_a = props.images) !== null && _a !== void 0 ? _a : [];
46
+ const images = (0, react_1.useMemo)(() => {
47
+ var _a;
48
+ return (_a = props.images) !== null && _a !== void 0 ? _a : [];
49
+ }, [props.images]);
48
50
  const [toggler, setToggler] = (0, react_1.useState)(false);
49
51
  const [lastReleaseX, setLastReleaseX] = (0, react_1.useState)(0);
50
52
  const [lastIndex, setLastIndex] = (0, react_1.useState)(0);
@@ -135,7 +137,7 @@ function ImageGallerySlider(props) {
135
137
  react_1.default.createElement(Icon_1.default, { icon: Icon_1.IconType.ArrowLeft2, color: Color_1.Color.White, size: "24px" }))),
136
138
  react_1.default.createElement(web_1.animated.div, Object.assign({ className: "room-gallery-slider__animation" }, bind(), { style: { left: x.to((perc) => `${perc * 100 * images.length}%`) }, onClick: toggleClickHandler }),
137
139
  react_1.default.createElement("ul", { className: "room-gallery-slider__track", style: { width: `${images.length * 100}%` } }, images.map((image, index) => {
138
- return (react_1.default.createElement("li", { key: index, className: "room-gallery-slider__item", style: {
140
+ return (react_1.default.createElement("li", { key: `${image}-{index}`, className: "room-gallery-slider__item", style: {
139
141
  width: `${100 / images.length}%`,
140
142
  overflow: 'hidden',
141
143
  } },
@@ -1 +1 @@
1
- {"version":3,"file":"ImageGallerySlider.js","sourceRoot":"/","sources":["src/components/steps/room/ImageGallerySlider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BookingEngineContext } from '@frontend/contexts';\nimport { animated, useSpring } from '@react-spring/web';\nimport FsLightbox from 'fslightbox-react';\nimport React, { useContext, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDrag } from 'react-use-gesture';\nimport { FullGestureState, StateKey } from 'react-use-gesture/dist/types';\nimport useMeasure from 'react-use-measure';\n\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport ImageLoader from '@/components/generic/loader/ImageLoader';\nimport ImageProvider, { ImageSize } from '@/providers/ImageProvider';\nimport { Color } from '@/util/Color';\nimport ScreenSize from '@/util/ScreenSize';\n\ninterface ImageGallerySliderProps {\n images: string[];\n\n imageSize?: ImageSize;\n hideLightboxIcon?: boolean;\n}\n\nexport default function ImageGallerySlider(props: ImageGallerySliderProps) {\n const context = useContext(BookingEngineContext);\n\n const [{ x }, set] = useSpring(() => ({ x: 0 }));\n const [ref, bounds] = useMeasure();\n const [prevReleasePosition, setPrevRelPos] = useState(0);\n const images = props.images ?? [];\n\n const [toggler, setToggler] = useState(false);\n const [lastReleaseX, setLastReleaseX] = useState(0);\n const [lastIndex, setLastIndex] = useState(0);\n\n const [isDragging, setIsDragging] = useState(false);\n\n let sliderVelocity = 0;\n\n const handleDrag = ({ down, movement: [mx], velocity }: FullGestureState<StateKey<'drag'>>) => {\n if (context.screenSize <= ScreenSize.Medium) {\n velocity = velocity * 0.5;\n sliderVelocity = velocity > 2 ? 2 : velocity < 1 ? 1 : velocity;\n } else {\n sliderVelocity = 1;\n }\n\n const cardWidth = bounds.width;\n const maxX = images.length * cardWidth;\n\n if (!down) {\n const releasePosition = lastReleaseX + mx * sliderVelocity;\n\n let restingLocation = 0;\n let last = 0;\n\n if (releasePosition > 0) {\n restingLocation = 0;\n last = 0;\n } else if (releasePosition < -(maxX - cardWidth)) {\n restingLocation = -(maxX - cardWidth);\n last = images.length - 1;\n } else {\n const magic = -releasePosition / cardWidth;\n if (releasePosition >= prevReleasePosition) {\n last = releasePosition % cardWidth > -cardWidth / 0.001 ? Math.floor(magic) : Math.ceil(magic);\n setPrevRelPos(releasePosition + (-releasePosition % cardWidth));\n restingLocation = -(last * cardWidth);\n } else {\n last = releasePosition % cardWidth > -cardWidth / 1000 ? Math.floor(magic) : Math.ceil(magic);\n setPrevRelPos(releasePosition - (cardWidth - (-releasePosition % cardWidth)));\n restingLocation = -(last * cardWidth);\n }\n }\n\n let inPercent = 0;\n if (restingLocation !== 0) {\n inPercent = restingLocation / maxX;\n }\n\n setLastIndex(last);\n set({ x: inPercent });\n setLastReleaseX(restingLocation);\n\n setTimeout(() => {\n setIsDragging(false);\n }, 50);\n } else {\n let inPercent = 0;\n const newReleasePx = lastReleaseX + mx;\n inPercent = newReleasePx / maxX;\n\n set({ x: inPercent });\n if (mx) {\n setIsDragging(true);\n }\n }\n };\n\n // Set the drag hook and define component movement based on gesture data\n const bind = useDrag((event) => {\n handleDrag(event);\n });\n\n const nextImage = () => {\n handleDrag({ down: false, movement: [-bounds.width, 0], velocity: 1 } as any);\n };\n\n const prevImage = () => {\n handleDrag({ down: false, movement: [bounds.width, 0], velocity: 1 } as any);\n };\n\n const onClickPrevImage = () => {\n return prevImage();\n };\n const toggleToggler = () => {\n return setToggler(!toggler);\n };\n const nextImageOnClick = () => {\n return nextImage();\n };\n const toggleClickHandler = () => {\n if (!isDragging) {\n setToggler(!toggler);\n }\n };\n\n return (\n <div ref={ref} className=\"room-gallery-slider\">\n {images.length > 1 && (\n <div className=\"room-gallery-slider__icon-left\" onClick={onClickPrevImage}>\n <Icon icon={IconType.ArrowLeft2} color={Color.White} size=\"24px\" />\n </div>\n )}\n <animated.div className=\"room-gallery-slider__animation\" {...bind()} style={{ left: x.to((perc) => `${perc * 100 * images.length}%`) }} onClick={toggleClickHandler}>\n <ul className=\"room-gallery-slider__track\" style={{ width: `${images.length * 100}%` }}>\n {images.map((image: any, index: number) => {\n return (\n <li\n key={index}\n className=\"room-gallery-slider__item\"\n style={{\n width: `${100 / images.length}%`,\n overflow: 'hidden',\n }}\n >\n <ImageLoader\n visible={lastIndex >= index}\n size={props.imageSize}\n draggable={false}\n src={image}\n style={{ objectFit: 'cover', objectPosition: 'center', height: '100%', width: '100%' }}\n />\n </li>\n );\n })}\n </ul>\n </animated.div>\n {!!images.length && (\n <>\n {!props.hideLightboxIcon && (\n <div className=\"room-gallery-slider__icon-lightbox\" onClick={toggleToggler}>\n <Icon icon={IconType.Fullscreen} color={Color.White} size=\"20px\" />\n </div>\n )}\n {createPortal(\n <FsLightbox toggler={toggler} sources={images.map((image) => ImageProvider.resizeImage(image, ImageSize.Original))} type=\"image\" loadOnlyCurrentSource />,\n document.body\n )}\n </>\n )}\n {images.length > 1 && (\n <div className=\"room-gallery-slider__icon-right\" onClick={nextImageOnClick}>\n <Icon icon={IconType.ArrowRight2} color={Color.White} size=\"24px\" />\n </div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ImageGallerySlider.js","sourceRoot":"/","sources":["src/components/steps/room/ImageGallerySlider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BookingEngineContext } from '@frontend/contexts';\nimport { animated, useSpring } from '@react-spring/web';\nimport FsLightbox from 'fslightbox-react';\nimport React, { useContext, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDrag } from 'react-use-gesture';\nimport { FullGestureState, StateKey } from 'react-use-gesture/dist/types';\nimport useMeasure from 'react-use-measure';\n\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport ImageLoader from '@/components/generic/loader/ImageLoader';\nimport ImageProvider, { ImageSize } from '@/providers/ImageProvider';\nimport { Color } from '@/util/Color';\nimport ScreenSize from '@/util/ScreenSize';\n\ninterface ImageGallerySliderProps {\n images: string[];\n\n imageSize?: ImageSize;\n hideLightboxIcon?: boolean;\n}\n\nexport default function ImageGallerySlider(props: ImageGallerySliderProps) {\n const context = useContext(BookingEngineContext);\n\n const [{ x }, set] = useSpring(() => ({ x: 0 }));\n const [ref, bounds] = useMeasure();\n const [prevReleasePosition, setPrevRelPos] = useState(0);\n const images = useMemo(() => {\n return props.images ?? [];\n }, [props.images]);\n\n const [toggler, setToggler] = useState(false);\n const [lastReleaseX, setLastReleaseX] = useState(0);\n const [lastIndex, setLastIndex] = useState(0);\n\n const [isDragging, setIsDragging] = useState(false);\n\n let sliderVelocity = 0;\n\n const handleDrag = ({ down, movement: [mx], velocity }: FullGestureState<StateKey<'drag'>>) => {\n if (context.screenSize <= ScreenSize.Medium) {\n velocity = velocity * 0.5;\n sliderVelocity = velocity > 2 ? 2 : velocity < 1 ? 1 : velocity;\n } else {\n sliderVelocity = 1;\n }\n\n const cardWidth = bounds.width;\n const maxX = images.length * cardWidth;\n\n if (!down) {\n const releasePosition = lastReleaseX + mx * sliderVelocity;\n\n let restingLocation = 0;\n let last = 0;\n\n if (releasePosition > 0) {\n restingLocation = 0;\n last = 0;\n } else if (releasePosition < -(maxX - cardWidth)) {\n restingLocation = -(maxX - cardWidth);\n last = images.length - 1;\n } else {\n const magic = -releasePosition / cardWidth;\n if (releasePosition >= prevReleasePosition) {\n last = releasePosition % cardWidth > -cardWidth / 0.001 ? Math.floor(magic) : Math.ceil(magic);\n setPrevRelPos(releasePosition + (-releasePosition % cardWidth));\n restingLocation = -(last * cardWidth);\n } else {\n last = releasePosition % cardWidth > -cardWidth / 1000 ? Math.floor(magic) : Math.ceil(magic);\n setPrevRelPos(releasePosition - (cardWidth - (-releasePosition % cardWidth)));\n restingLocation = -(last * cardWidth);\n }\n }\n\n let inPercent = 0;\n if (restingLocation !== 0) {\n inPercent = restingLocation / maxX;\n }\n\n setLastIndex(last);\n set({ x: inPercent });\n setLastReleaseX(restingLocation);\n\n setTimeout(() => {\n setIsDragging(false);\n }, 50);\n } else {\n let inPercent = 0;\n const newReleasePx = lastReleaseX + mx;\n inPercent = newReleasePx / maxX;\n\n set({ x: inPercent });\n if (mx) {\n setIsDragging(true);\n }\n }\n };\n\n // Set the drag hook and define component movement based on gesture data\n const bind = useDrag((event) => {\n handleDrag(event);\n });\n\n const nextImage = () => {\n handleDrag({ down: false, movement: [-bounds.width, 0], velocity: 1 } as any);\n };\n\n const prevImage = () => {\n handleDrag({ down: false, movement: [bounds.width, 0], velocity: 1 } as any);\n };\n\n const onClickPrevImage = () => {\n return prevImage();\n };\n const toggleToggler = () => {\n return setToggler(!toggler);\n };\n const nextImageOnClick = () => {\n return nextImage();\n };\n const toggleClickHandler = () => {\n if (!isDragging) {\n setToggler(!toggler);\n }\n };\n\n return (\n <div ref={ref} className=\"room-gallery-slider\">\n {images.length > 1 && (\n <div className=\"room-gallery-slider__icon-left\" onClick={onClickPrevImage}>\n <Icon icon={IconType.ArrowLeft2} color={Color.White} size=\"24px\" />\n </div>\n )}\n <animated.div className=\"room-gallery-slider__animation\" {...bind()} style={{ left: x.to((perc) => `${perc * 100 * images.length}%`) }} onClick={toggleClickHandler}>\n <ul className=\"room-gallery-slider__track\" style={{ width: `${images.length * 100}%` }}>\n {images.map((image: any, index: number) => {\n return (\n <li\n key={`${image}-{index}`}\n className=\"room-gallery-slider__item\"\n style={{\n width: `${100 / images.length}%`,\n overflow: 'hidden',\n }}\n >\n <ImageLoader\n visible={lastIndex >= index}\n size={props.imageSize}\n draggable={false}\n src={image}\n style={{ objectFit: 'cover', objectPosition: 'center', height: '100%', width: '100%' }}\n />\n </li>\n );\n })}\n </ul>\n </animated.div>\n {!!images.length && (\n <>\n {!props.hideLightboxIcon && (\n <div className=\"room-gallery-slider__icon-lightbox\" onClick={toggleToggler}>\n <Icon icon={IconType.Fullscreen} color={Color.White} size=\"20px\" />\n </div>\n )}\n {createPortal(\n <FsLightbox toggler={toggler} sources={images.map((image) => ImageProvider.resizeImage(image, ImageSize.Original))} type=\"image\" loadOnlyCurrentSource />,\n document.body\n )}\n </>\n )}\n {images.length > 1 && (\n <div className=\"room-gallery-slider__icon-right\" onClick={nextImageOnClick}>\n <Icon icon={IconType.ArrowRight2} color={Color.White} size=\"24px\" />\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -1,8 +1,10 @@
1
+ import { InlineRoomMiniEngineConfig } from '../../../../../engines/InlineRoomMiniEngine/InlineRoomMiniEngine';
1
2
  import { RoomRate } from '../../../../../models/Room/RoomRate';
2
- export interface RoomRateRowProps {
3
+ export interface RoomRateRowProps extends Pick<InlineRoomMiniEngineConfig, 'policy' | 'priceDescription'> {
3
4
  rate: RoomRate;
4
5
  getButtonLabel?: (isRoomSelectedAndEditing: boolean, isThisSelectedRow: boolean) => string;
5
6
  onAddToBasketOverride?: (rate: RoomRate) => void;
6
7
  isPromoRate?: boolean;
8
+ isCardLayout?: boolean;
7
9
  }
8
10
  export default function RoomRateRow(props: RoomRateRowProps): JSX.Element;
@@ -33,7 +33,7 @@ const react_1 = __importStar(require("react"));
33
33
  const react_i18next_1 = require("react-i18next");
34
34
  const Translation_1 = require("translations/Translation");
35
35
  const BEButton_1 = __importDefault(require("../../../../generic/BEButton"));
36
- const Icon_1 = require("../../../../generic/Icon/Icon");
36
+ const Icon_1 = __importStar(require("../../../../generic/Icon/Icon"));
37
37
  const Pill_1 = __importStar(require("../../../../generic/Pill"));
38
38
  const PlanpayPrice_1 = require("../../../../generic/PlanpayPrice/PlanpayPrice");
39
39
  const Text_1 = __importStar(require("../../../../generic/Text"));
@@ -49,6 +49,7 @@ const RoomRate_1 = require("../../../../../models/Room/RoomRate");
49
49
  const Color_1 = require("../../../../../util/Color");
50
50
  const DataLayer_1 = __importStar(require("../../../../../util/DataLayer"));
51
51
  const TextAlignment_1 = require("../../../../../util/TextAlignment");
52
+ const RoomRateRow_module_scss_1 = __importDefault(require("./RoomRateRow.module.scss"));
52
53
  function RoomRateRow(props) {
53
54
  var _a, _b, _c;
54
55
  const ccx = (0, react_1.useContext)(contexts_1.CompanyContext);
@@ -61,7 +62,7 @@ function RoomRateRow(props) {
61
62
  const { t } = (0, react_i18next_1.useTranslation)();
62
63
  const { isAccent2ColorDark } = (0, hooks_1.useCurrentHotel)();
63
64
  const { isMobile } = (0, WindowSize_1.useWindowSize)();
64
- const { rate } = props;
65
+ const { rate, isCardLayout } = props;
65
66
  const selectedRow = basketContext.selectedBasketRow;
66
67
  const isRoomSelectedAndEditing = selectedRow === null || selectedRow === void 0 ? void 0 : selectedRow.isValid();
67
68
  const isThisSelectedRow = selectedRow && rate.name === ((_a = selectedRow.getRate()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = rate.getRoom()) === null || _b === void 0 ? void 0 : _b.name) === ((_c = selectedRow.getRoom()) === null || _c === void 0 ? void 0 : _c.name);
@@ -129,41 +130,66 @@ function RoomRateRow(props) {
129
130
  children: rate.getAveragePrice(true),
130
131
  });
131
132
  const { hasPricePreview } = (0, Planpay_1.default)();
133
+ const RoomDetailsPriceBlockSection = () => (react_1.default.createElement("div", { className: "u-flex flex-column align-items-start align-items-lg-end" },
134
+ react_1.default.createElement(RoomDetailsPriceBlock_1.default, { isLocked: isLocked, averagePreDiscount: rate.getAveragePriceBeforeDiscount(true), averagePrice: rate.getAveragePrice(true), isMemberOnly: props.rate.isMemberOnly, useLightText: shouldTextBeWhite }),
135
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Label, color: textWhiteOr(Color_1.Color.DarkGrey), align: isMobile ? TextAlignment_1.TextAlign.Left : TextAlignment_1.TextAlign.Right },
136
+ react_1.default.createElement("span", { dangerouslySetInnerHTML: {
137
+ __html: rate.getPriceType() === RoomRate_1.RoomRatePriceInclusion.IncludingFeesAndTaxes
138
+ ? t(Translation_1.Translation.Step.Room.RoomInfo.IncludesTaxes)
139
+ : t(Translation_1.Translation.Step.Room.ExcludingTaxes),
140
+ } }))));
141
+ const RateTitle = () => {
142
+ if (isLocked) {
143
+ return (react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Body, color: Color_1.Color.Success },
144
+ react_1.default.createElement("strong", null, t(Translation_1.Translation.Step.Room.RoomInfo.MemberOnlyDeal))));
145
+ }
146
+ return (react_1.default.createElement("div", { className: (0, classnames_1.default)(RoomRateRow_module_scss_1.default['card-layout-rate-title']) },
147
+ props.isPromoRate && isCardLayout ? react_1.default.createElement(Icon_1.default, { icon: Icon_1.IconType.Star }) : null,
148
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Body, color: textWhiteOr(), bold: true }, rateName)));
149
+ };
132
150
  return (react_1.default.createElement("div", { className: classes, ref: currentRow },
133
151
  react_1.default.createElement("div", { className: "row" },
134
152
  react_1.default.createElement("div", { className: (0, classnames_1.default)({
135
- 'col-lg-6': hasPricePreview,
136
- 'col-lg-8': !hasPricePreview,
153
+ 'col-lg-6': hasPricePreview && !isCardLayout,
154
+ 'col-lg-8': !hasPricePreview && !isCardLayout,
155
+ 'col-lg-12': isCardLayout,
137
156
  }) },
138
157
  react_1.default.createElement("div", { className: "u-flex flex-column h-100" },
139
158
  react_1.default.createElement("div", null,
140
- react_1.default.createElement("div", { className: "u-marg-bottom-half" }, isLocked ? (react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Body, color: Color_1.Color.Success },
141
- react_1.default.createElement("strong", null, t(Translation_1.Translation.Step.Room.RoomInfo.MemberOnlyDeal)))) : (react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Body, color: textWhiteOr(), bold: true }, rateName))),
159
+ react_1.default.createElement("div", { className: "u-marg-bottom-half" },
160
+ react_1.default.createElement(RateTitle, null)),
142
161
  react_1.default.createElement("div", { className: "u-marg-bottom u-h-ml-5 text-small u-clear-font-weight rdcaf", style: { color: textWhiteOr() } },
143
162
  react_1.default.createElement("div", { dangerouslySetInnerHTML: { __html: shortDescription !== null && shortDescription !== void 0 ? shortDescription : '' } })),
144
163
  isLocked && (react_1.default.createElement("div", { className: "u-marg" },
145
164
  react_1.default.createElement("span", { onClick: openMemberSignupModalOnClick },
146
165
  react_1.default.createElement(Pill_1.default, { icon: Icon_1.IconType.Money, type: Pill_1.PillType.Success }, t(Translation_1.Translation.Step.Room.RoomInfo.SignUpToSee))))),
147
- react_1.default.createElement(RoomRatePills_1.default, { rate: props.rate, rateDescription: true })),
148
- react_1.default.createElement("div", { className: "u-flex justify-content-start u-marg-top-bottom@l-" },
166
+ !isCardLayout ? react_1.default.createElement(RoomRatePills_1.default, { rate: props.rate, rateDescription: true }) : null),
167
+ isCardLayout ? (react_1.default.createElement("div", { className: (0, classnames_1.default)(RoomRateRow_module_scss_1.default['card-layout-price-wrapper']) },
168
+ props.policy ? (react_1.default.createElement("div", { className: (0, classnames_1.default)(RoomRateRow_module_scss_1.default['card-layout-price-policy']) },
169
+ react_1.default.createElement(Icon_1.default, { icon: Icon_1.IconType.Info }),
170
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.DarkGrey }, props.policy))) : null,
171
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(RoomRateRow_module_scss_1.default['card-layout-price-row']) },
172
+ props.priceDescription ? (react_1.default.createElement("div", { className: (0, classnames_1.default)(RoomRateRow_module_scss_1.default['card-layout-price-notes']) },
173
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Accent }, props.priceDescription))) : null,
174
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(RoomRateRow_module_scss_1.default['card-layout-price-info']) },
175
+ react_1.default.createElement(RoomDetailsPriceBlockSection, null))))) : null,
176
+ react_1.default.createElement("div", { className: (0, classnames_1.default)('u-flex justify-content-start u-marg-top-bottom@l- room-rate-row-navigation-button', {
177
+ [RoomRateRow_module_scss_1.default['room-rate-row-navigation-button']]: isCardLayout,
178
+ }) },
149
179
  react_1.default.createElement("div", { className: "u-marg-right u-inline-flex" },
150
- react_1.default.createElement(BEButton_1.default, { icon: Icon_1.IconType.ArrowRight2, isText: true, primary: true, size: "small", iconPosition: "right", onClick: rateDetailsOnClick, textColor: textWhiteOr(Color_1.Color.Accent) }, t(Translation_1.Translation.Step.Room.ReadMore))),
151
- react_1.default.createElement(BEButton_1.default, { icon: Icon_1.IconType.ArrowRight2, isText: true, textColor: textWhiteOr(Color_1.Color.Navy), size: "small", iconPosition: "right", onClick: openTabOnClick, disabled: isLocked }, t(Translation_1.Translation.Step.Room.RoomInfo.ViewPriceBreakdown))))),
180
+ react_1.default.createElement(BEButton_1.default, { icon: isCardLayout ? undefined : Icon_1.IconType.ArrowRight2, isText: true, primary: true, size: "small", iconPosition: "right", onClick: rateDetailsOnClick, textColor: isCardLayout ? Color_1.Color.Accent : textWhiteOr(Color_1.Color.Accent) }, t(Translation_1.Translation.Step.Room.ReadMore))),
181
+ react_1.default.createElement(BEButton_1.default, { icon: isCardLayout ? undefined : Icon_1.IconType.ArrowRight2, isText: true, textColor: isCardLayout ? Color_1.Color.Accent : textWhiteOr(Color_1.Color.Navy), size: "small", iconPosition: "right", onClick: openTabOnClick, disabled: isLocked }, t(Translation_1.Translation.Step.Room.RoomInfo.ViewPriceBreakdown))))),
152
182
  react_1.default.createElement("div", { className: (0, classnames_1.default)({
153
- 'col-lg-6': hasPricePreview,
154
- 'col-lg-4': !hasPricePreview,
183
+ 'col-lg-6': hasPricePreview && !isCardLayout,
184
+ 'col-lg-4': !hasPricePreview && !isCardLayout,
185
+ 'col-lg-12': isCardLayout,
155
186
  }, 'u-flex flex-column align-items-start align-items-md-start align-items-lg-end justify-content-start') },
156
- react_1.default.createElement("div", { className: "u-flex flex-column align-items-start align-items-lg-end" },
157
- react_1.default.createElement(RoomDetailsPriceBlock_1.default, { isLocked: isLocked, averagePreDiscount: rate.getAveragePriceBeforeDiscount(true), averagePrice: rate.getAveragePrice(true), isMemberOnly: props.rate.isMemberOnly, useLightText: shouldTextBeWhite }),
158
- react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Label, color: textWhiteOr(Color_1.Color.DarkGrey), align: isMobile ? TextAlignment_1.TextAlign.Left : TextAlignment_1.TextAlign.Right },
159
- react_1.default.createElement("span", { dangerouslySetInnerHTML: {
160
- __html: rate.getPriceType() === RoomRate_1.RoomRatePriceInclusion.IncludingFeesAndTaxes
161
- ? t(Translation_1.Translation.Step.Room.RoomInfo.IncludesTaxes)
162
- : t(Translation_1.Translation.Step.Room.ExcludingTaxes),
163
- } }))),
187
+ !isCardLayout ? react_1.default.createElement(RoomDetailsPriceBlockSection, null) : null,
164
188
  !isLoading && hasPricePreview ? (react_1.default.createElement("div", { className: "u-marg-top--light" },
165
189
  react_1.default.createElement(PlanpayPrice_1.PlanpayPrice, { price: price, checkin: ((selectedRow === null || selectedRow === void 0 ? void 0 : selectedRow.getStartDate()) || basketContext.endDate).format('YYYY-MM-DD'), currency: ccx.currentCurrency }))) : null,
166
- react_1.default.createElement("div", { className: "u-marg-top--light" }, isLocked ? (react_1.default.createElement(BEButton_1.default, { filled: true, success: true, wide: true, onClick: openMemberSignupModalOnClick }, t(Translation_1.Translation.Step.Room.RoomInfo.RevealPrice))) : (react_1.default.createElement(BookNowButton_1.default, { rate: rate, buttonLabel: bookNowLabel, onAddToBasketOverride: props.onAddToBasketOverride, isFilled: !isThisSelectedRow }))))),
190
+ react_1.default.createElement("div", { className: (0, classnames_1.default)('u-marg-top--light', {
191
+ [RoomRateRow_module_scss_1.default['room-rate-row-booknow-button']]: isCardLayout,
192
+ }) }, isLocked ? (react_1.default.createElement(BEButton_1.default, { filled: true, success: true, wide: true, onClick: openMemberSignupModalOnClick }, t(Translation_1.Translation.Step.Room.RoomInfo.RevealPrice))) : (react_1.default.createElement(BookNowButton_1.default, { rate: rate, buttonLabel: bookNowLabel, onAddToBasketOverride: props.onAddToBasketOverride, isFilled: !isThisSelectedRow }))))),
167
193
  react_1.default.createElement(RoomRateDetailsAndPriceBreakdownModal_1.default, { isOpen: viewingModal.open, currentTab: viewingModal.currentTab, rate: props.rate, getButtonLabel: props.getButtonLabel, onAddToBasketOverride: props.onAddToBasketOverride, onClose: updateModalOnClose })));
168
194
  }
169
195
  exports.default = RoomRateRow;
@@ -1 +1 @@
1
- {"version":3,"file":"RoomRateRow.js","sourceRoot":"/","sources":["src/components/steps/room/roomDetails/roomRates/RoomRateRow.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext, CompanyContext, HotelOverridesContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport classNames from 'classnames';\nimport React, { useContext, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport BEButton from '@/components/generic/BEButton';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport Pill, { PillType } from '@/components/generic/Pill';\nimport { PlanpayPrice } from '@/components/generic/PlanpayPrice/PlanpayPrice';\nimport Text, { TextType } from '@/components/generic/Text';\nimport RoomDetailsPriceBlock from '@/components/steps/room/roomDetails/RoomDetailsPriceBlock';\nimport BookNowButton from '@/components/steps/room/roomDetails/roomRates/BookNowButton';\nimport RoomRateDetailsAndPriceBreakdownModal, {\n RoomRateDetailsAndPriceBreakdownModalTabs,\n} from '@/components/steps/room/roomDetails/roomRates/RoomRateDetailsAndPriceBreakdownModal';\nimport RoomRatePills from '@/components/steps/room/roomDetails/roomRates/RoomRatePills';\nimport useCurrency from '@/hooks/Currency';\nimport usePlanpay from '@/hooks/Planpay';\nimport { useRateDetails } from '@/hooks/useRateDetails';\nimport { useWindowSize } from '@/hooks/WindowSize';\nimport { RoomRate, RoomRatePriceInclusion } from '@/models/Room/RoomRate';\nimport { Color } from '@/util/Color';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport { TextAlign } from '@/util/TextAlignment';\n\nexport interface RoomRateRowProps {\n rate: RoomRate;\n\n getButtonLabel?: (isRoomSelectedAndEditing: boolean, isThisSelectedRow: boolean) => string;\n onAddToBasketOverride?: (rate: RoomRate) => void;\n\n isPromoRate?: boolean;\n}\n\nexport default function RoomRateRow(props: RoomRateRowProps) {\n const ccx = useContext(CompanyContext);\n const basketContext = useContext(BasketContext);\n const hotelOverridesContext = useContext(HotelOverridesContext);\n\n const [viewingModal, setViewingModal] = useState({\n open: false,\n currentTab: RoomRateDetailsAndPriceBreakdownModalTabs.RoomDetails,\n });\n\n const { t } = useTranslation();\n const { isAccent2ColorDark } = useCurrentHotel();\n const { isMobile } = useWindowSize();\n const { rate } = props;\n const selectedRow = basketContext.selectedBasketRow;\n const isRoomSelectedAndEditing = selectedRow?.isValid();\n\n const isThisSelectedRow = selectedRow && rate.name === selectedRow.getRate()?.name && rate.getRoom()?.name === selectedRow.getRoom()?.name;\n\n const currentRow = useRef<HTMLDivElement | null>(null);\n\n const classes = classNames('room-info', {\n '--default': !rate.isMemberOnly,\n '--locked': rate.isMemberOnly,\n '--current': isThisSelectedRow && isRoomSelectedAndEditing,\n '--is-promo': props.isPromoRate,\n });\n\n let isLocked = false;\n\n if (rate.isMemberOnly && !ccx.signedInUser) {\n isLocked = true;\n }\n\n useEffect(() => {\n if (!isLocked) {\n const basketRow = basketContext.selectedBasketRow;\n if (!basketRow) {\n return;\n }\n\n DataLayer.instance.addRoomRateImpression(rate.getRoom(), rate, { to: basketRow.getStartDate(), from: basketRow.getEndDate() }, basketRow.getPromoCode());\n }\n }, [isThisSelectedRow]);\n\n const { rateName, shortDescription } = useRateDetails(rate, isLocked);\n\n const openTab = (tab: RoomRateDetailsAndPriceBreakdownModalTabs) => {\n setViewingModal({ open: true, currentTab: tab });\n };\n\n let bookNowLabel = '';\n if (props.getButtonLabel) {\n bookNowLabel = props.getButtonLabel(isRoomSelectedAndEditing, isThisSelectedRow);\n } else {\n if (isRoomSelectedAndEditing) {\n bookNowLabel = isThisSelectedRow ? t(Translation.Step.Room.RoomInfo.Selected) : (bookNowLabel = t(Translation.Step.Room.RoomInfo.Update));\n } else {\n bookNowLabel = t(Translation.Misc.BookNow);\n }\n }\n\n const openMemberSignupModalOnClick = () => {\n DataLayer.instance.sendInteraction('Member Signup Modal', InteractionType.LINK, InteractionStep.ROOMS);\n ccx.openMemberSignupModal();\n };\n\n const rateDetailsOnClick = () => {\n DataLayer.instance.sendInteraction('More Rate Details', InteractionType.LINK, InteractionStep.ROOMS);\n openTab(RoomRateDetailsAndPriceBreakdownModalTabs.RoomDetails);\n };\n\n const updateModalOnClose = () => {\n setViewingModal((old) => {\n old.open = false;\n return { ...old };\n });\n };\n\n const openTabOnClick = () => {\n DataLayer.instance.sendInteraction('Rate Breakdown', InteractionType.LINK, InteractionStep.ROOMS);\n openTab(RoomRateDetailsAndPriceBreakdownModalTabs.PriceBreakdown);\n };\n\n const shouldTextBeWhite = isAccent2ColorDark && ((isThisSelectedRow && isRoomSelectedAndEditing) || props.isPromoRate);\n const textWhiteOr = (color = Color.Graphite) => {\n return shouldTextBeWhite ? Color.White : color;\n };\n\n const { value: price, isLoading } = useCurrency({\n disableLoading: true,\n hideDecimals: true,\n children: rate.getAveragePrice(true),\n });\n\n const { hasPricePreview } = usePlanpay();\n\n return (\n <div className={classes} ref={currentRow}>\n <div className=\"row\">\n <div\n className={classNames({\n 'col-lg-6': hasPricePreview,\n 'col-lg-8': !hasPricePreview,\n })}\n >\n <div className=\"u-flex flex-column h-100\">\n <div>\n <div className=\"u-marg-bottom-half\">\n {isLocked ? (\n <Text type={TextType.Body} color={Color.Success}>\n <strong>{t(Translation.Step.Room.RoomInfo.MemberOnlyDeal)}</strong>\n </Text>\n ) : (\n <Text type={TextType.Body} color={textWhiteOr()} bold>\n {rateName}\n </Text>\n )}\n </div>\n <div className=\"u-marg-bottom u-h-ml-5 text-small u-clear-font-weight rdcaf\" style={{ color: textWhiteOr() }}>\n <div dangerouslySetInnerHTML={{ __html: shortDescription ?? '' }} />\n </div>\n {isLocked && (\n <div className=\"u-marg\">\n <span onClick={openMemberSignupModalOnClick}>\n <Pill icon={IconType.Money} type={PillType.Success}>\n {t(Translation.Step.Room.RoomInfo.SignUpToSee)}\n </Pill>\n </span>\n </div>\n )}\n <RoomRatePills rate={props.rate} rateDescription />\n </div>\n <div className=\"u-flex justify-content-start u-marg-top-bottom@l-\">\n <div className=\"u-marg-right u-inline-flex\">\n <BEButton\n icon={IconType.ArrowRight2}\n isText\n primary\n size=\"small\"\n iconPosition=\"right\"\n onClick={rateDetailsOnClick}\n textColor={textWhiteOr(Color.Accent)}\n >\n {t(Translation.Step.Room.ReadMore)}\n </BEButton>\n </div>\n <BEButton\n icon={IconType.ArrowRight2}\n isText\n textColor={textWhiteOr(Color.Navy)}\n size=\"small\"\n iconPosition=\"right\"\n onClick={openTabOnClick}\n disabled={isLocked}\n >\n {t(Translation.Step.Room.RoomInfo.ViewPriceBreakdown)}\n </BEButton>\n </div>\n </div>\n </div>\n <div\n className={classNames(\n {\n 'col-lg-6': hasPricePreview,\n 'col-lg-4': !hasPricePreview,\n },\n 'u-flex flex-column align-items-start align-items-md-start align-items-lg-end justify-content-start'\n )}\n >\n <div className=\"u-flex flex-column align-items-start align-items-lg-end\">\n <RoomDetailsPriceBlock\n isLocked={isLocked}\n averagePreDiscount={rate.getAveragePriceBeforeDiscount(true)}\n averagePrice={rate.getAveragePrice(true)}\n isMemberOnly={props.rate.isMemberOnly}\n useLightText={shouldTextBeWhite}\n />\n <Text type={TextType.Label} color={textWhiteOr(Color.DarkGrey)} align={isMobile ? TextAlign.Left : TextAlign.Right}>\n <span\n dangerouslySetInnerHTML={{\n __html:\n 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 {!isLoading && hasPricePreview ? (\n <div className=\"u-marg-top--light\">\n <PlanpayPrice price={price} checkin={(selectedRow?.getStartDate() || basketContext.endDate).format('YYYY-MM-DD')} currency={ccx.currentCurrency} />\n </div>\n ) : null}\n <div className=\"u-marg-top--light\">\n {isLocked ? (\n <BEButton filled success wide onClick={openMemberSignupModalOnClick}>\n {t(Translation.Step.Room.RoomInfo.RevealPrice)}\n </BEButton>\n ) : (\n <BookNowButton rate={rate} buttonLabel={bookNowLabel} onAddToBasketOverride={props.onAddToBasketOverride} isFilled={!isThisSelectedRow} />\n )}\n </div>\n </div>\n </div>\n <RoomRateDetailsAndPriceBreakdownModal\n isOpen={viewingModal.open}\n currentTab={viewingModal.currentTab}\n rate={props.rate}\n getButtonLabel={props.getButtonLabel}\n onAddToBasketOverride={props.onAddToBasketOverride}\n onClose={updateModalOnClose}\n />\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"RoomRateRow.js","sourceRoot":"/","sources":["src/components/steps/room/roomDetails/roomRates/RoomRateRow.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext, CompanyContext, HotelOverridesContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport classNames from 'classnames';\nimport React, { useContext, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport BEButton from '@/components/generic/BEButton';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport Pill, { PillType } from '@/components/generic/Pill';\nimport { PlanpayPrice } from '@/components/generic/PlanpayPrice/PlanpayPrice';\nimport Text, { TextType } from '@/components/generic/Text';\nimport RoomDetailsPriceBlock from '@/components/steps/room/roomDetails/RoomDetailsPriceBlock';\nimport BookNowButton from '@/components/steps/room/roomDetails/roomRates/BookNowButton';\nimport RoomRateDetailsAndPriceBreakdownModal, {\n RoomRateDetailsAndPriceBreakdownModalTabs,\n} from '@/components/steps/room/roomDetails/roomRates/RoomRateDetailsAndPriceBreakdownModal';\nimport RoomRatePills from '@/components/steps/room/roomDetails/roomRates/RoomRatePills';\nimport { InlineRoomMiniEngineConfig } from '@/engines/InlineRoomMiniEngine/InlineRoomMiniEngine';\nimport useCurrency from '@/hooks/Currency';\nimport usePlanpay from '@/hooks/Planpay';\nimport { useRateDetails } from '@/hooks/useRateDetails';\nimport { useWindowSize } from '@/hooks/WindowSize';\nimport { RoomRate, RoomRatePriceInclusion } from '@/models/Room/RoomRate';\nimport { Color } from '@/util/Color';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport { TextAlign } from '@/util/TextAlignment';\n\nimport styles from './RoomRateRow.module.scss';\nexport interface RoomRateRowProps extends Pick<InlineRoomMiniEngineConfig, 'policy' | 'priceDescription'> {\n rate: RoomRate;\n\n getButtonLabel?: (isRoomSelectedAndEditing: boolean, isThisSelectedRow: boolean) => string;\n onAddToBasketOverride?: (rate: RoomRate) => void;\n\n isPromoRate?: boolean;\n isCardLayout?: boolean;\n}\n\nexport default function RoomRateRow(props: RoomRateRowProps) {\n const ccx = useContext(CompanyContext);\n const basketContext = useContext(BasketContext);\n const hotelOverridesContext = useContext(HotelOverridesContext);\n\n const [viewingModal, setViewingModal] = useState({\n open: false,\n currentTab: RoomRateDetailsAndPriceBreakdownModalTabs.RoomDetails,\n });\n\n const { t } = useTranslation();\n const { isAccent2ColorDark } = useCurrentHotel();\n const { isMobile } = useWindowSize();\n const { rate, isCardLayout } = props;\n const selectedRow = basketContext.selectedBasketRow;\n const isRoomSelectedAndEditing = selectedRow?.isValid();\n\n const isThisSelectedRow = selectedRow && rate.name === selectedRow.getRate()?.name && rate.getRoom()?.name === selectedRow.getRoom()?.name;\n\n const currentRow = useRef<HTMLDivElement | null>(null);\n\n const classes = classNames('room-info', {\n '--default': !rate.isMemberOnly,\n '--locked': rate.isMemberOnly,\n '--current': isThisSelectedRow && isRoomSelectedAndEditing,\n '--is-promo': props.isPromoRate,\n });\n\n let isLocked = false;\n\n if (rate.isMemberOnly && !ccx.signedInUser) {\n isLocked = true;\n }\n\n useEffect(() => {\n if (!isLocked) {\n const basketRow = basketContext.selectedBasketRow;\n if (!basketRow) {\n return;\n }\n\n DataLayer.instance.addRoomRateImpression(rate.getRoom(), rate, { to: basketRow.getStartDate(), from: basketRow.getEndDate() }, basketRow.getPromoCode());\n }\n }, [isThisSelectedRow]);\n\n const { rateName, shortDescription } = useRateDetails(rate, isLocked);\n\n const openTab = (tab: RoomRateDetailsAndPriceBreakdownModalTabs) => {\n setViewingModal({ open: true, currentTab: tab });\n };\n\n let bookNowLabel = '';\n if (props.getButtonLabel) {\n bookNowLabel = props.getButtonLabel(isRoomSelectedAndEditing, isThisSelectedRow);\n } else {\n if (isRoomSelectedAndEditing) {\n bookNowLabel = isThisSelectedRow ? t(Translation.Step.Room.RoomInfo.Selected) : (bookNowLabel = t(Translation.Step.Room.RoomInfo.Update));\n } else {\n bookNowLabel = t(Translation.Misc.BookNow);\n }\n }\n\n const openMemberSignupModalOnClick = () => {\n DataLayer.instance.sendInteraction('Member Signup Modal', InteractionType.LINK, InteractionStep.ROOMS);\n ccx.openMemberSignupModal();\n };\n\n const rateDetailsOnClick = () => {\n DataLayer.instance.sendInteraction('More Rate Details', InteractionType.LINK, InteractionStep.ROOMS);\n openTab(RoomRateDetailsAndPriceBreakdownModalTabs.RoomDetails);\n };\n\n const updateModalOnClose = () => {\n setViewingModal((old) => {\n old.open = false;\n return { ...old };\n });\n };\n\n const openTabOnClick = () => {\n DataLayer.instance.sendInteraction('Rate Breakdown', InteractionType.LINK, InteractionStep.ROOMS);\n openTab(RoomRateDetailsAndPriceBreakdownModalTabs.PriceBreakdown);\n };\n\n const shouldTextBeWhite = isAccent2ColorDark && ((isThisSelectedRow && isRoomSelectedAndEditing) || props.isPromoRate);\n const textWhiteOr = (color = Color.Graphite) => {\n return shouldTextBeWhite ? Color.White : color;\n };\n\n const { value: price, isLoading } = useCurrency({\n disableLoading: true,\n hideDecimals: true,\n children: rate.getAveragePrice(true),\n });\n\n const { hasPricePreview } = usePlanpay();\n\n const RoomDetailsPriceBlockSection = () => (\n <div className=\"u-flex flex-column align-items-start align-items-lg-end\">\n <RoomDetailsPriceBlock\n isLocked={isLocked}\n averagePreDiscount={rate.getAveragePriceBeforeDiscount(true)}\n averagePrice={rate.getAveragePrice(true)}\n isMemberOnly={props.rate.isMemberOnly}\n useLightText={shouldTextBeWhite}\n />\n <Text type={TextType.Label} color={textWhiteOr(Color.DarkGrey)} align={isMobile ? TextAlign.Left : TextAlign.Right}>\n <span\n dangerouslySetInnerHTML={{\n __html:\n 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\n const RateTitle = () => {\n if (isLocked) {\n return (\n <Text type={TextType.Body} color={Color.Success}>\n <strong>{t(Translation.Step.Room.RoomInfo.MemberOnlyDeal)}</strong>\n </Text>\n );\n }\n return (\n <div className={classNames(styles['card-layout-rate-title'])}>\n {props.isPromoRate && isCardLayout ? <Icon icon={IconType.Star} /> : null}\n <Text type={TextType.Body} color={textWhiteOr()} bold>\n {rateName}\n </Text>\n </div>\n );\n };\n\n return (\n <div className={classes} ref={currentRow}>\n <div className=\"row\">\n <div\n className={classNames({\n 'col-lg-6': hasPricePreview && !isCardLayout,\n 'col-lg-8': !hasPricePreview && !isCardLayout,\n 'col-lg-12': isCardLayout,\n })}\n >\n <div className=\"u-flex flex-column h-100\">\n <div>\n <div className=\"u-marg-bottom-half\">\n <RateTitle />\n </div>\n <div className=\"u-marg-bottom u-h-ml-5 text-small u-clear-font-weight rdcaf\" style={{ color: textWhiteOr() }}>\n <div dangerouslySetInnerHTML={{ __html: shortDescription ?? '' }} />\n </div>\n {isLocked && (\n <div className=\"u-marg\">\n <span onClick={openMemberSignupModalOnClick}>\n <Pill icon={IconType.Money} type={PillType.Success}>\n {t(Translation.Step.Room.RoomInfo.SignUpToSee)}\n </Pill>\n </span>\n </div>\n )}\n {!isCardLayout ? <RoomRatePills rate={props.rate} rateDescription /> : null}\n </div>\n\n {isCardLayout ? (\n <div className={classNames(styles['card-layout-price-wrapper'])}>\n {props.policy ? (\n <div className={classNames(styles['card-layout-price-policy'])}>\n <Icon icon={IconType.Info} />\n <Text type={TextType.Small} color={Color.DarkGrey}>\n {props.policy}\n </Text>\n </div>\n ) : null}\n <div className={classNames(styles['card-layout-price-row'])}>\n {props.priceDescription ? (\n <div className={classNames(styles['card-layout-price-notes'])}>\n <Text type={TextType.Small} color={Color.Accent}>\n {props.priceDescription}\n </Text>\n </div>\n ) : null}\n <div className={classNames(styles['card-layout-price-info'])}>\n <RoomDetailsPriceBlockSection />\n </div>\n </div>\n </div>\n ) : null}\n\n <div\n className={classNames('u-flex justify-content-start u-marg-top-bottom@l- room-rate-row-navigation-button', {\n [styles['room-rate-row-navigation-button']]: isCardLayout,\n })}\n >\n <div className=\"u-marg-right u-inline-flex\">\n <BEButton\n icon={isCardLayout ? undefined : IconType.ArrowRight2}\n isText\n primary\n size=\"small\"\n iconPosition=\"right\"\n onClick={rateDetailsOnClick}\n textColor={isCardLayout ? Color.Accent : textWhiteOr(Color.Accent)}\n >\n {t(Translation.Step.Room.ReadMore)}\n </BEButton>\n </div>\n <BEButton\n icon={isCardLayout ? undefined : IconType.ArrowRight2}\n isText\n textColor={isCardLayout ? Color.Accent : textWhiteOr(Color.Navy)}\n size=\"small\"\n iconPosition=\"right\"\n onClick={openTabOnClick}\n disabled={isLocked}\n >\n {t(Translation.Step.Room.RoomInfo.ViewPriceBreakdown)}\n </BEButton>\n </div>\n </div>\n </div>\n <div\n className={classNames(\n {\n 'col-lg-6': hasPricePreview && !isCardLayout,\n 'col-lg-4': !hasPricePreview && !isCardLayout,\n 'col-lg-12': isCardLayout,\n },\n 'u-flex flex-column align-items-start align-items-md-start align-items-lg-end justify-content-start'\n )}\n >\n {!isCardLayout ? <RoomDetailsPriceBlockSection /> : null}\n {!isLoading && hasPricePreview ? (\n <div className=\"u-marg-top--light\">\n <PlanpayPrice price={price} checkin={(selectedRow?.getStartDate() || basketContext.endDate).format('YYYY-MM-DD')} currency={ccx.currentCurrency} />\n </div>\n ) : null}\n <div\n className={classNames('u-marg-top--light', {\n [styles['room-rate-row-booknow-button']]: isCardLayout,\n })}\n >\n {isLocked ? (\n <BEButton filled success wide onClick={openMemberSignupModalOnClick}>\n {t(Translation.Step.Room.RoomInfo.RevealPrice)}\n </BEButton>\n ) : (\n <BookNowButton rate={rate} buttonLabel={bookNowLabel} onAddToBasketOverride={props.onAddToBasketOverride} isFilled={!isThisSelectedRow} />\n )}\n </div>\n </div>\n </div>\n <RoomRateDetailsAndPriceBreakdownModal\n isOpen={viewingModal.open}\n currentTab={viewingModal.currentTab}\n rate={props.rate}\n getButtonLabel={props.getButtonLabel}\n onAddToBasketOverride={props.onAddToBasketOverride}\n onClose={updateModalOnClose}\n />\n </div>\n );\n}\n"]}
@@ -1,5 +1,6 @@
1
+ import { InlineRoomMiniEngineConfig } from '../../../../../engines/InlineRoomMiniEngine/InlineRoomMiniEngine';
1
2
  import { RoomRate } from '../../../../../models/Room/RoomRate';
2
- export interface RoomRatesProps {
3
+ export interface RoomRatesProps extends Pick<InlineRoomMiniEngineConfig, 'policy' | 'priceDescription'> {
3
4
  roomCode: string;
4
5
  rates: RoomRate[];
5
6
  featuredRates?: RoomRate[];
@@ -7,5 +8,6 @@ export interface RoomRatesProps {
7
8
  hideMemberOnlyRow?: boolean;
8
9
  getButtonLabel?: (isRoomSelectedAndEditing: boolean, isThisSelectedRow: boolean) => string;
9
10
  onAddToBasketOverride?: (rate: RoomRate) => void;
11
+ isCardLayout?: boolean;
10
12
  }
11
13
  export default function RoomRates(props: RoomRatesProps): JSX.Element;
@@ -28,6 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const contexts_1 = require("../../../../../contexts/index.js");
30
30
  const hooks_1 = require("../../../../../hooks/index.js");
31
+ const classnames_1 = __importDefault(require("classnames"));
31
32
  const react_1 = __importStar(require("react"));
32
33
  const react_i18next_1 = require("react-i18next");
33
34
  const Translation_1 = require("translations/Translation");
@@ -49,7 +50,7 @@ function RoomRates(props) {
49
50
  const beContext = (0, react_1.useContext)(contexts_1.BookingEngineContext);
50
51
  const ccx = (0, react_1.useContext)(contexts_1.CompanyContext);
51
52
  const { hotel } = (0, hooks_1.useCurrentHotel)();
52
- const { rates } = props;
53
+ const { rates, isCardLayout } = props;
53
54
  const numOfRatesToShowFirst = beContext.screenSize <= ScreenSize_1.default.Medium ? 2 : 3;
54
55
  const sortBy = beContext.currentRoomSort;
55
56
  (0, react_1.useEffect)(() => {
@@ -62,7 +63,7 @@ function RoomRates(props) {
62
63
  DataLayer_1.default.instance.sendRoomImpressions();
63
64
  }, [showingMoreOpen]);
64
65
  return (0, react_1.useMemo)(() => {
65
- var _a, _b, _c;
66
+ var _a, _b;
66
67
  const featuredRates = (_a = props.featuredRates) === null || _a === void 0 ? void 0 : _a.filter((rate) => !!rate);
67
68
  const hasFeaturedRates = !!featuredRates && featuredRates.length > 0;
68
69
  let sortedRates;
@@ -89,7 +90,7 @@ function RoomRates(props) {
89
90
  if (RoomRateReadMoreVersionFeature_1.default.isActive()) {
90
91
  return (react_1.default.createElement(ReadMoreRoomRateRow_1.default, { key: rate.name, rate: rate, getButtonLabel: props.getButtonLabel, onAddToBasketOverride: props.onAddToBasketOverride, isPromoRate: isPromo }));
91
92
  }
92
- return react_1.default.createElement(RoomRateRow_1.default, { key: rate.name, rate: rate, getButtonLabel: props.getButtonLabel, onAddToBasketOverride: props.onAddToBasketOverride, isPromoRate: isPromo });
93
+ return (react_1.default.createElement(RoomRateRow_1.default, { key: rate.name, rate: rate, getButtonLabel: props.getButtonLabel, onAddToBasketOverride: props.onAddToBasketOverride, isPromoRate: isPromo, isCardLayout: isCardLayout, policy: props.policy, priceDescription: props.priceDescription }));
93
94
  };
94
95
  const maxRows = hasFeaturedRates && !showingMoreOpen ? featuredRates.length : numOfRatesToShowFirst;
95
96
  let rowsLeftToOpen = 0;
@@ -107,7 +108,7 @@ function RoomRates(props) {
107
108
  }
108
109
  // Then we add the remaining rates to the render list - stop adding if we hit `maxRows`
109
110
  sortedRates.forEach((rate) => {
110
- if (itemsToRender.length < maxRows || showingMoreOpen) {
111
+ if (isCardLayout || itemsToRender.length < maxRows || showingMoreOpen) {
111
112
  itemsToRender.push(renderRoomRateRow(rate));
112
113
  }
113
114
  else {
@@ -115,7 +116,7 @@ function RoomRates(props) {
115
116
  }
116
117
  });
117
118
  // Then we do a tricky check to see if MOD intent should be displayed
118
- if (!hasFeaturedRates || showingMoreOpen) {
119
+ if (!isCardLayout && (!hasFeaturedRates || showingMoreOpen)) {
119
120
  if (!props.hideMemberOnlyRow &&
120
121
  !!(hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyPromoCode) &&
121
122
  (!ccx.signedInUser || (hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyPromoCode) === ((_b = basketContext === null || basketContext === void 0 ? void 0 : basketContext.selectedBasketRow) === null || _b === void 0 ? void 0 : _b.getPromoCode()))) {
@@ -127,7 +128,7 @@ function RoomRates(props) {
127
128
  }
128
129
  }
129
130
  }
130
- return (react_1.default.createElement("div", { className: (_c = props.classNames) !== null && _c !== void 0 ? _c : '' },
131
+ return (react_1.default.createElement("div", { className: (0, classnames_1.default)(props.classNames) },
131
132
  itemsToRender.map((item, index) => {
132
133
  return react_1.default.createElement(react_1.default.Fragment, { key: index }, item);
133
134
  }),