@roomstay/frontend 2.5.11 → 2.5.12

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 (42) hide show
  1. package/dist/468.bundle.js +1 -1
  2. package/dist/535.bundle.js +1 -1
  3. package/dist/537.bundle.js +1 -1
  4. package/dist/572.bundle.js +1 -1
  5. package/dist/736.bundle.js +1 -1
  6. package/dist/903.bundle.js +1 -1
  7. package/dist/main.bundle.js +1 -1
  8. package/dist/src/components/steps/room/LargeRoomCard.js +16 -8
  9. package/dist/src/components/steps/room/LargeRoomCard.js.map +1 -1
  10. package/dist/src/components/steps/room/RoomList.js +2 -2
  11. package/dist/src/components/steps/room/RoomList.js.map +1 -1
  12. package/dist/src/components/steps/room/RoomModal.js +17 -13
  13. package/dist/src/components/steps/room/RoomModal.js.map +1 -1
  14. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRooms.js +2 -2
  15. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRooms.js.map +1 -1
  16. package/dist/src/components/steps/room/roomDetails/RoomDetails.js +6 -10
  17. package/dist/src/components/steps/room/roomDetails/RoomDetails.js.map +1 -1
  18. package/dist/src/components/steps/room/roomDetails/RoomDetailsPerkBlock.js +7 -1
  19. package/dist/src/components/steps/room/roomDetails/RoomDetailsPerkBlock.js.map +1 -1
  20. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +22 -4
  21. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  22. package/dist/src/hooks/RoomRateAvailabilityListFromApi.d.ts +1 -0
  23. package/dist/src/hooks/RoomRateAvailabilityListFromApi.js +3 -1
  24. package/dist/src/hooks/RoomRateAvailabilityListFromApi.js.map +1 -1
  25. package/dist/src/index.d.ts +1 -0
  26. package/dist/src/index.js +4 -1
  27. package/dist/src/index.js.map +1 -1
  28. package/dist/src/models/Client/Hotel/Hotel.d.ts +1 -2
  29. package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
  30. package/dist/src/models/Client/Hotel/HotelPerk.d.ts +6 -0
  31. package/dist/src/models/Client/Hotel/HotelPerk.js.map +1 -1
  32. package/dist/src/models/Client/Hotel/HotelRoomOverwrite.d.ts +3 -0
  33. package/dist/src/models/Client/Hotel/HotelRoomOverwrite.js.map +1 -1
  34. package/dist/src/models/Room/Room.d.ts +10 -1
  35. package/dist/src/models/Room/Room.js +18 -0
  36. package/dist/src/models/Room/Room.js.map +1 -1
  37. package/dist/test.bundle.js +1 -1
  38. package/dist/tests/offline/entry/OfflineEngineDefaults.d.ts +1 -0
  39. package/dist/tests/offline/entry/OfflineEngineDefaults.js +91 -1
  40. package/dist/tests/offline/entry/OfflineEngineDefaults.js.map +1 -1
  41. package/dist/vendors.bundle.js +1 -1
  42. package/package.json +1 -1
@@ -41,16 +41,19 @@ const ImageGallerySlider_1 = __importDefault(require("./ImageGallerySlider"));
41
41
  const Color_1 = require("../../../util/Color");
42
42
  const ScreenSize_1 = __importDefault(require("../../../util/ScreenSize"));
43
43
  const LargeRoomCard = (props) => {
44
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
44
+ var _a, _b, _c, _d, _e, _f, _g, _h;
45
45
  const beContext = (0, react_1.useContext)(contexts_1.BookingEngineContext);
46
46
  const { hotel } = (0, hooks_1.useCurrentHotel)();
47
47
  const { t } = (0, react_i18next_1.useTranslation)();
48
48
  const extraRoomData = hotel === null || hotel === void 0 ? void 0 : hotel.rooms[(_a = props.rate) === null || _a === void 0 ? void 0 : _a.getRoom().code];
49
49
  const roomSize = (_b = hotel === null || hotel === void 0 ? void 0 : hotel.overwrites) === null || _b === void 0 ? void 0 : _b[(_c = props.rate) === null || _c === void 0 ? void 0 : _c.getRoom().code];
50
50
  const trimmedDescription = (_d = props.rate) === null || _d === void 0 ? void 0 : _d.getRoom().getShortDescription();
51
- const roomOverride = (_e = hotel === null || hotel === void 0 ? void 0 : hotel.overwrites) === null || _e === void 0 ? void 0 : _e[(_f = props.rate) === null || _f === void 0 ? void 0 : _f.getRoom().code];
52
- const roomPerks = ((_g = roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.perks) === null || _g === void 0 ? void 0 : _g.length) ? roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.perks.slice(0, 4) : hotel === null || hotel === void 0 ? void 0 : hotel.perks.slice(0, 4);
53
- const prePerkDisclaimer = (roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.prePerkDisclaimer) ? roomOverride.prePerkDisclaimer : extraRoomData === null || extraRoomData === void 0 ? void 0 : extraRoomData.prePerkDisclaimer;
51
+ const room = props.rate.getRoom();
52
+ const { roomPerks, prePerkDisclaimer } = room.getRoomPerks({
53
+ hotel: hotel,
54
+ room: room,
55
+ perksLimitNumber: 4,
56
+ });
54
57
  const updateRate = () => {
55
58
  props.onSelectRate();
56
59
  };
@@ -72,9 +75,9 @@ const LargeRoomCard = (props) => {
72
75
  ];
73
76
  return (react_1.default.createElement("div", { className: "large-room-card u-border-rounded" },
74
77
  react_1.default.createElement("div", { className: "large-room-card --image" },
75
- react_1.default.createElement(ImageGallerySlider_1.default, { images: (_h = props.rate) === null || _h === void 0 ? void 0 : _h.getRoom().getImages() })),
78
+ react_1.default.createElement(ImageGallerySlider_1.default, { images: (_e = props.rate) === null || _e === void 0 ? void 0 : _e.getRoom().getImages() })),
76
79
  react_1.default.createElement("div", { className: "u-pad container" },
77
- react_1.default.createElement(Text_1.default, { bold: true }, (_j = props.rate) === null || _j === void 0 ? void 0 : _j.getRoom().name),
80
+ react_1.default.createElement(Text_1.default, { bold: true }, (_f = props.rate) === null || _f === void 0 ? void 0 : _f.getRoom().name),
78
81
  react_1.default.createElement("div", { className: "u-flex u-marg-top-bottom" }, roomInfo.map((item, index) => {
79
82
  return (react_1.default.createElement("div", { className: "u-flex", key: index },
80
83
  react_1.default.createElement(Icon_1.default, { icon: item.icon }),
@@ -96,7 +99,12 @@ const LargeRoomCard = (props) => {
96
99
  react_1.default.createElement(Tooltip_1.default, { title: perk.name },
97
100
  react_1.default.createElement("div", null, perk.iconElement ? perk.iconElement : react_1.default.createElement(Icon_1.default, { icon: perk.icon, backgroundColor: Color_1.Color.Snow }))),
98
101
  react_1.default.createElement("div", { className: `u-marg-left u-marg-right ${isAllPerksOpened ? '' : 'u-none'}` },
99
- react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small }, perk.name))));
102
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small }, (perk === null || perk === void 0 ? void 0 : perk.perkNameRenderer)
103
+ ? perk.perkNameRenderer({
104
+ hotel,
105
+ room,
106
+ })
107
+ : perk.name))));
100
108
  }))),
101
109
  react_1.default.createElement("div", { className: "u-flex flex-column no-gutters" },
102
110
  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)),
@@ -104,7 +112,7 @@ const LargeRoomCard = (props) => {
104
112
  react_1.default.createElement(Headline_1.default, { bold: true },
105
113
  react_1.default.createElement("span", { className: "u-flex align-items-center" },
106
114
  "+",
107
- react_1.default.createElement(Currency_1.default, { hideDecimals: true }, ((_k = props.rate) === null || _k === void 0 ? void 0 : _k.getAveragePrice()) - ((_l = props.selectedRate) === null || _l === void 0 ? void 0 : _l.getAveragePrice())))),
115
+ react_1.default.createElement(Currency_1.default, { hideDecimals: true }, ((_g = props.rate) === null || _g === void 0 ? void 0 : _g.getAveragePrice()) - ((_h = props.selectedRate) === null || _h === void 0 ? void 0 : _h.getAveragePrice())))),
108
116
  react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, inline: true },
109
117
  "/",
110
118
  t(Translation_1.Translation.Misc.Night))),
@@ -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 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\n const roomOverride = hotel?.overwrites?.[props.rate?.getRoom().code as string];\n const roomPerks = roomOverride?.perks?.length ? roomOverride?.perks.slice(0, 4) : hotel?.perks.slice(0, 4);\n const prePerkDisclaimer = roomOverride?.prePerkDisclaimer ? roomOverride.prePerkDisclaimer : extraRoomData?.prePerkDisclaimer;\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 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\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>{perk.iconElement ? perk.iconElement : <Icon icon={perk.icon as IconType} backgroundColor={Color.Snow} />}</div>\n </Tooltip>\n <div className={`u-marg-left u-marg-right ${isAllPerksOpened ? '' : 'u-none'}`}>\n <Text type={TextType.Small}>{perk.name}</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":"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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 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\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 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\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>{perk.iconElement ? perk.iconElement : <Icon icon={perk.icon as IconType} backgroundColor={Color.Snow} />}</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"]}
@@ -44,7 +44,7 @@ function RoomList() {
44
44
  const basketContext = (0, react_1.useContext)(contexts_1.BasketContext);
45
45
  const beContext = (0, react_1.useContext)(contexts_1.BookingEngineContext);
46
46
  const { hotel } = (0, hooks_1.useCurrentHotel)();
47
- const { rooms, isLoading, openRoom, apiHasError, retargetingRoom } = (0, RoomRateAvailabilityListFromApi_1.useRoomRateAvailabilityListFromApi)();
47
+ const { rooms, loadingAttempted, isLoading, openRoom, apiHasError, retargetingRoom } = (0, RoomRateAvailabilityListFromApi_1.useRoomRateAvailabilityListFromApi)();
48
48
  const roomListRef = (0, react_1.useRef)(null);
49
49
  const sortBy = beContext.currentRoomSort;
50
50
  let listWhenLastScrolled = null;
@@ -67,7 +67,7 @@ function RoomList() {
67
67
  setTimeout(() => {
68
68
  scrollIntoView();
69
69
  }, 100);
70
- const elements = (react_1.default.createElement("div", { ref: roomListRef }, isLoading ? (react_1.default.createElement(LargeLoader_1.default, null)) : sortedRooms.length ? (sortedRooms.map((room, index) => react_1.default.createElement(RoomDetails_1.default, { key: room.code, room: room, disableMarginBottom: index === sortedRooms.length - 1 }))) : (react_1.default.createElement(react_1.default.Fragment, null,
70
+ const elements = (react_1.default.createElement("div", { ref: roomListRef }, isLoading || !loadingAttempted ? (react_1.default.createElement(LargeLoader_1.default, null)) : sortedRooms.length ? (sortedRooms.map((room, index) => react_1.default.createElement(RoomDetails_1.default, { key: room.code, room: room, disableMarginBottom: index === sortedRooms.length - 1 }))) : (react_1.default.createElement(react_1.default.Fragment, null,
71
71
  apiHasError ? react_1.default.createElement(StepRoomErrorForm_1.StepRoomErrorForm, null) : react_1.default.createElement(NoRoomsFoundBlock_1.default, null), (_a = hotel === null || hotel === void 0 ? void 0 : hotel.crossSellHotelIds) === null || _a === void 0 ? void 0 :
72
72
  _a.map((hotelId) => (react_1.default.createElement(RoomListCrossSellBlock_1.default, { key: hotelId, hotelId: hotelId })))))));
73
73
  DataLayer_1.default.instance.sendRoomImpressions();
@@ -1 +1 @@
1
- {"version":3,"file":"RoomList.js","sourceRoot":"/","sources":["src/components/steps/room/RoomList.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport React, { useContext, useMemo, useRef } from 'react';\n\nimport LargeLoader from '@/components/generic/loader/LargeLoader';\nimport RoomDetails from '@/components/steps/room/roomDetails/RoomDetails';\nimport RoomListCrossSellBlock from '@/components/steps/room/RoomListCrossSellBlock';\nimport { useRoomRateAvailabilityListFromApi } from '@/hooks/RoomRateAvailabilityListFromApi';\nimport { Room } from '@/models/Room/Room';\nimport RoomSortProvider from '@/providers/RoomSortProvider';\nimport DataLayer from '@/util/DataLayer';\nimport ScreenSize from '@/util/ScreenSize';\n\nimport NoRoomsFoundBlock from './NoRoomsFoundBlock';\nimport { RoomDetailsRetargeting } from './roomDetails/RoomDetailsRetargeting';\nimport { RoomListAlert } from './RoomListAlert';\nimport { StepRoomErrorForm } from './StepRoomErrorForm';\n\nexport default function RoomList() {\n const basketContext = useContext(BasketContext);\n const beContext = useContext(BookingEngineContext);\n\n const { hotel } = useCurrentHotel();\n const { rooms, isLoading, openRoom, apiHasError, retargetingRoom } = useRoomRateAvailabilityListFromApi();\n const roomListRef = useRef<HTMLDivElement | null>(null);\n const sortBy = beContext.currentRoomSort;\n let listWhenLastScrolled: Room[] | null = null;\n\n const scrollIntoView = () => {\n if (roomListRef.current && listWhenLastScrolled !== rooms) {\n listWhenLastScrolled = rooms;\n const offset = beContext.screenSize <= ScreenSize.Medium ? 185 : 350;\n\n window.scrollTo({\n top: window.scrollY + (roomListRef.current.getBoundingClientRect().top - offset),\n behavior: 'smooth',\n });\n }\n };\n\n return useMemo(() => {\n const sortedRooms = [...rooms];\n if (sortedRooms.length !== 0) {\n sortedRooms.sort(RoomSortProvider.getSortByFunction(sortBy));\n }\n\n setTimeout(() => {\n scrollIntoView();\n }, 100);\n\n const elements = (\n <div ref={roomListRef}>\n {isLoading ? (\n <LargeLoader />\n ) : sortedRooms.length ? (\n sortedRooms.map((room, index) => <RoomDetails key={room.code} room={room} disableMarginBottom={index === sortedRooms.length - 1} />)\n ) : (\n <>\n {apiHasError ? <StepRoomErrorForm /> : <NoRoomsFoundBlock />}\n {hotel?.crossSellHotelIds?.map((hotelId) => (\n <RoomListCrossSellBlock key={hotelId} hotelId={hotelId} />\n ))}\n </>\n )}\n </div>\n );\n\n DataLayer.instance.sendRoomImpressions();\n\n return (\n <>\n <RoomListAlert>{!isLoading && retargetingRoom ? <RoomDetailsRetargeting key={retargetingRoom.code} room={retargetingRoom} /> : null}</RoomListAlert>\n {elements}\n </>\n );\n }, [rooms, isLoading, openRoom, sortBy, beContext.currentFilters, basketContext.loadedPromotion]);\n}\n"]}
1
+ {"version":3,"file":"RoomList.js","sourceRoot":"/","sources":["src/components/steps/room/RoomList.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport React, { useContext, useMemo, useRef } from 'react';\n\nimport LargeLoader from '@/components/generic/loader/LargeLoader';\nimport RoomDetails from '@/components/steps/room/roomDetails/RoomDetails';\nimport RoomListCrossSellBlock from '@/components/steps/room/RoomListCrossSellBlock';\nimport { useRoomRateAvailabilityListFromApi } from '@/hooks/RoomRateAvailabilityListFromApi';\nimport { Room } from '@/models/Room/Room';\nimport RoomSortProvider from '@/providers/RoomSortProvider';\nimport DataLayer from '@/util/DataLayer';\nimport ScreenSize from '@/util/ScreenSize';\n\nimport NoRoomsFoundBlock from './NoRoomsFoundBlock';\nimport { RoomDetailsRetargeting } from './roomDetails/RoomDetailsRetargeting';\nimport { RoomListAlert } from './RoomListAlert';\nimport { StepRoomErrorForm } from './StepRoomErrorForm';\n\nexport default function RoomList() {\n const basketContext = useContext(BasketContext);\n const beContext = useContext(BookingEngineContext);\n\n const { hotel } = useCurrentHotel();\n const { rooms, loadingAttempted, isLoading, openRoom, apiHasError, retargetingRoom } = useRoomRateAvailabilityListFromApi();\n const roomListRef = useRef<HTMLDivElement | null>(null);\n const sortBy = beContext.currentRoomSort;\n let listWhenLastScrolled: Room[] | null = null;\n\n const scrollIntoView = () => {\n if (roomListRef.current && listWhenLastScrolled !== rooms) {\n listWhenLastScrolled = rooms;\n const offset = beContext.screenSize <= ScreenSize.Medium ? 185 : 350;\n\n window.scrollTo({\n top: window.scrollY + (roomListRef.current.getBoundingClientRect().top - offset),\n behavior: 'smooth',\n });\n }\n };\n\n return useMemo(() => {\n const sortedRooms = [...rooms];\n if (sortedRooms.length !== 0) {\n sortedRooms.sort(RoomSortProvider.getSortByFunction(sortBy));\n }\n\n setTimeout(() => {\n scrollIntoView();\n }, 100);\n\n const elements = (\n <div ref={roomListRef}>\n {isLoading || !loadingAttempted ? (\n <LargeLoader />\n ) : sortedRooms.length ? (\n sortedRooms.map((room, index) => <RoomDetails key={room.code} room={room} disableMarginBottom={index === sortedRooms.length - 1} />)\n ) : (\n <>\n {apiHasError ? <StepRoomErrorForm /> : <NoRoomsFoundBlock />}\n {hotel?.crossSellHotelIds?.map((hotelId) => (\n <RoomListCrossSellBlock key={hotelId} hotelId={hotelId} />\n ))}\n </>\n )}\n </div>\n );\n\n DataLayer.instance.sendRoomImpressions();\n\n return (\n <>\n <RoomListAlert>{!isLoading && retargetingRoom ? <RoomDetailsRetargeting key={retargetingRoom.code} room={retargetingRoom} /> : null}</RoomListAlert>\n {elements}\n </>\n );\n }, [rooms, isLoading, openRoom, sortBy, beContext.currentFilters, basketContext.loadedPromotion]);\n}\n"]}
@@ -40,21 +40,20 @@ const RoomDetailsBedsBlock_1 = require("./roomDetails/RoomDetailsBedsBlock");
40
40
  const RoomRates_1 = __importDefault(require("./roomDetails/roomRates/RoomRates"));
41
41
  const Color_1 = require("../../../util/Color");
42
42
  function RoomModal(props) {
43
- var _a, _b, _c, _d;
43
+ var _a;
44
44
  const { t } = (0, react_i18next_1.useTranslation)();
45
45
  const { hotel } = (0, hooks_1.useCurrentHotel)();
46
46
  const { rooms } = hotel;
47
- const roomOverride = (_a = hotel === null || hotel === void 0 ? void 0 : hotel.overwrites) === null || _a === void 0 ? void 0 : _a[props.room.code];
48
- const roomPerks = ((_b = roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.perks) === null || _b === void 0 ? void 0 : _b.length) ? roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.perks : hotel === null || hotel === void 0 ? void 0 : hotel.perks;
49
- const prePerkDisclaimer = (roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.prePerkDisclaimer) ? roomOverride.prePerkDisclaimer : (_c = props.room) === null || _c === void 0 ? void 0 : _c.prePerkDisclaimer;
47
+ const { roomPerks, prePerkDisclaimer } = props.room.getRoomPerks({ hotel: hotel, room: props.room });
50
48
  const extraRoomData = rooms === null || rooms === void 0 ? void 0 : rooms[props.room.code];
51
49
  // Explode otherwise original data gets overwritten.
52
50
  const amenities = (extraRoomData === null || extraRoomData === void 0 ? void 0 : extraRoomData.amenities) ? [...extraRoomData.amenities] : [];
53
- if ((_d = extraRoomData === null || extraRoomData === void 0 ? void 0 : extraRoomData.features) === null || _d === void 0 ? void 0 : _d.length) {
51
+ if ((_a = extraRoomData === null || extraRoomData === void 0 ? void 0 : extraRoomData.features) === null || _a === void 0 ? void 0 : _a.length) {
54
52
  extraRoomData.features.forEach((feature) => {
55
53
  amenities.push(feature);
56
54
  });
57
55
  }
56
+ const cleanPerkDisclaimer = (prePerkDisclaimer === null || prePerkDisclaimer === void 0 ? void 0 : prePerkDisclaimer.replace(/<br(\/|)>/g, '')) || '';
58
57
  return (react_1.default.createElement(SimpleModal_1.default, { title: props.room.name + ' ' + t(Translation_1.Translation.Step.Room.RoomInfo.Information), open: props.open, size: SimpleModal_1.SimpleModalSize.Small, onClose: props.onClose },
59
58
  react_1.default.createElement("div", null,
60
59
  react_1.default.createElement("div", { style: { height: '350px' } },
@@ -65,18 +64,18 @@ function RoomModal(props) {
65
64
  react_1.default.createElement(RoomDetailsBedsBlock_1.RoomDetailsBedsBlock, { room: props.room }),
66
65
  react_1.default.createElement("div", { className: "u-marg-bottom--heavy" },
67
66
  react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, type: Text_1.TextType.Small },
68
- react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: props.room.getShortDescription(false) || '' } })),
69
- (prePerkDisclaimer === null || prePerkDisclaimer === void 0 ? void 0 : prePerkDisclaimer.replace(/<br(\/|)>/g, '')) && (react_1.default.createElement("div", { className: "u-marg-top" },
70
- react_1.default.createElement(Text_1.default, { color: Color_1.Color.Accent, type: Text_1.TextType.Small },
71
- react_1.default.createElement("strong", null, t(Translation_1.Translation.Step.Room.RoomInfo.Disclaimer))),
72
- react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, type: Text_1.TextType.Small },
73
- react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: (prePerkDisclaimer === null || prePerkDisclaimer === void 0 ? void 0 : prePerkDisclaimer.replace(/<br(\/|)>/g, '')) || '' } }))))),
67
+ react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: props.room.getShortDescription(false) || '' } }))),
74
68
  !(hotel === null || hotel === void 0 ? void 0 : hotel.perksHideOnRoomDetail) && roomPerks && (react_1.default.createElement("div", { className: "u-marg-bottom--heavy" },
75
69
  react_1.default.createElement("div", { className: "row" }, roomPerks.map((perk, index) => {
76
70
  return (react_1.default.createElement("div", { key: index, className: "u-marg-bottom col-6 col-md-4 u-flex align-items-center justify-content-start" },
77
71
  react_1.default.createElement("div", { className: "room-perk-icon --has-bg" }, perk.iconElement ? perk.iconElement : react_1.default.createElement(Icon_1.default, { icon: perk.icon })),
78
72
  react_1.default.createElement("div", { className: "u-marg-left--light" },
79
- react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small }, perk.name))));
73
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small }, (perk === null || perk === void 0 ? void 0 : perk.perkNameRenderer)
74
+ ? perk.perkNameRenderer({
75
+ hotel,
76
+ room: props.room,
77
+ })
78
+ : perk.name))));
80
79
  })),
81
80
  (hotel === null || hotel === void 0 ? void 0 : hotel.perksShowDisclaimer) && (react_1.default.createElement("div", { className: "row u-marg-top--lighter" },
82
81
  react_1.default.createElement("small", { className: "col-12" }, t(Translation_1.Translation.Misc.PerksDisclaimer)))))),
@@ -93,7 +92,12 @@ function RoomModal(props) {
93
92
  react_1.default.createElement(LineBreak_1.default, null),
94
93
  react_1.default.createElement("div", { className: "u-marg-bottom--heavy" },
95
94
  react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small, color: Color_1.Color.Graphite },
96
- react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: props.room.getLongDescription() || '' } })))),
95
+ react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: props.room.getLongDescription() || '' } }))),
96
+ !!cleanPerkDisclaimer && (react_1.default.createElement("div", { className: "u-marg-bottom--heavy" },
97
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small },
98
+ react_1.default.createElement("strong", null, t(Translation_1.Translation.Step.Room.RoomInfo.Disclaimer))),
99
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small },
100
+ react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: cleanPerkDisclaimer } }))))),
97
101
  react_1.default.createElement(RoomRates_1.default, { featuredRates: props.featuredRates, rates: props.rates, roomCode: props.room.code }))));
98
102
  }
99
103
  exports.default = RoomModal;
@@ -1 +1 @@
1
- {"version":3,"file":"RoomModal.js","sourceRoot":"/","sources":["src/components/steps/room/RoomModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCurrentHotel } from '@frontend/hooks';\nimport { Hotel } from 'models/Client/Hotel/Hotel';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport Headline from '@/components/generic/Headline';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport LineBreak from '@/components/generic/LineBreak';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { RoomDetailsBedsBlock } from '@/components/steps/room/roomDetails/RoomDetailsBedsBlock';\nimport RoomRates from '@/components/steps/room/roomDetails/roomRates/RoomRates';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport { Color } from '@/util/Color';\n\ninterface RoomModalProps {\n room: Room;\n\n rates: RoomRate[];\n featuredRates: RoomRate[];\n\n open: boolean;\n onClose?: () => void;\n}\n\nexport default function RoomModal(props: RoomModalProps) {\n const { t } = useTranslation();\n const { hotel } = useCurrentHotel();\n\n const { rooms } = hotel as Hotel;\n\n const roomOverride = hotel?.overwrites?.[props.room.code as string];\n const roomPerks = roomOverride?.perks?.length ? roomOverride?.perks : hotel?.perks;\n const prePerkDisclaimer = roomOverride?.prePerkDisclaimer ? roomOverride.prePerkDisclaimer : props.room?.prePerkDisclaimer;\n const extraRoomData = rooms?.[props.room.code as string];\n\n // Explode otherwise original data gets overwritten.\n const amenities = extraRoomData?.amenities ? [...extraRoomData.amenities] : [];\n\n if (extraRoomData?.features?.length) {\n extraRoomData.features.forEach((feature) => {\n amenities.push(feature);\n });\n }\n\n return (\n <SimpleModal title={props.room.name + ' ' + t(Translation.Step.Room.RoomInfo.Information)} open={props.open} size={SimpleModalSize.Small} onClose={props.onClose}>\n <div>\n <div style={{ height: '350px' }}>\n <ImageGallerySlider images={props.room.getImages()} />\n </div>\n\n <div className=\"u-marg-heavy u-marg@m-\">\n <div className=\"u-marg-bottom--light\">\n <Headline bold size=\"large\">\n {props.room.name}\n </Headline>\n </div>\n <RoomDetailsBedsBlock room={props.room} />\n <div className=\"u-marg-bottom--heavy\">\n <Text color={Color.DarkGrey} type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: props.room.getShortDescription(false) || '' }} />\n </Text>\n {prePerkDisclaimer?.replace(/<br(\\/|)>/g, '') && (\n <div className=\"u-marg-top\">\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 dangerouslySetInnerHTML={{ __html: prePerkDisclaimer?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n )}\n </div>\n\n {!hotel?.perksHideOnRoomDetail && roomPerks && (\n <div className=\"u-marg-bottom--heavy\">\n <div className=\"row\">\n {roomPerks.map((perk, index) => {\n return (\n <div key={index} className=\"u-marg-bottom col-6 col-md-4 u-flex align-items-center justify-content-start\">\n <div className=\"room-perk-icon --has-bg\">{perk.iconElement ? perk.iconElement : <Icon icon={perk.icon as IconType} />}</div>\n <div className=\"u-marg-left--light\">\n <Text type={TextType.Small}>{perk.name}</Text>\n </div>\n </div>\n );\n })}\n </div>\n {hotel?.perksShowDisclaimer && (\n <div className=\"row u-marg-top--lighter\">\n <small className=\"col-12\">{t(Translation.Misc.PerksDisclaimer)}</small>\n </div>\n )}\n </div>\n )}\n {!!amenities?.length && (\n <>\n <div className=\"u-marg-bottom\">\n <Text color={Color.Accent} type={TextType.Small}>\n <strong>{t(Translation.Step.Room.RoomInfo.RoomAmenities)}</strong>\n </Text>\n </div>\n <div className=\"row\">\n {amenities.map((amenity) => {\n return (\n <div key={amenity.description} className=\"col-sm-6 u-marg-bottom--light u-flex justify-content-start\">\n <Icon icon={IconType.Check} color={Color.White} backgroundColor={Color.Navy} borderRadius=\"round\" noPadding size=\"16px\" />\n <div className=\"u-marg-left--light u-flex\">\n <Text type={TextType.Small} inline>\n {amenity.description}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n </>\n )}\n <LineBreak />\n <div className=\"u-marg-bottom--heavy\">\n <Text type={TextType.Small} color={Color.Graphite}>\n <span dangerouslySetInnerHTML={{ __html: props.room.getLongDescription() || '' }} />\n </Text>\n </div>\n </div>\n <RoomRates featuredRates={props.featuredRates} rates={props.rates} roomCode={props.room.code as string} />\n </div>\n </SimpleModal>\n );\n}\n"]}
1
+ {"version":3,"file":"RoomModal.js","sourceRoot":"/","sources":["src/components/steps/room/RoomModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCurrentHotel } from '@frontend/hooks';\nimport { Hotel } from 'models/Client/Hotel/Hotel';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Translation } from 'translations/Translation';\n\nimport Currency from '@/components/generic/Currency';\nimport Headline from '@/components/generic/Headline';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport LineBreak from '@/components/generic/LineBreak';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { RoomDetailsBedsBlock } from '@/components/steps/room/roomDetails/RoomDetailsBedsBlock';\nimport RoomRates from '@/components/steps/room/roomDetails/roomRates/RoomRates';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate } from '@/models/Room/RoomRate';\nimport { Color } from '@/util/Color';\n\ninterface RoomModalProps {\n room: Room;\n\n rates: RoomRate[];\n featuredRates: RoomRate[];\n\n open: boolean;\n onClose?: () => void;\n}\n\nexport default function RoomModal(props: RoomModalProps) {\n const { t } = useTranslation();\n const { hotel } = useCurrentHotel();\n const { rooms } = hotel as Hotel;\n\n const { roomPerks, prePerkDisclaimer } = props.room.getRoomPerks({ hotel: hotel, room: props.room });\n\n const extraRoomData = rooms?.[props.room.code as string];\n\n // Explode otherwise original data gets overwritten.\n const amenities = extraRoomData?.amenities ? [...extraRoomData.amenities] : [];\n\n if (extraRoomData?.features?.length) {\n extraRoomData.features.forEach((feature) => {\n amenities.push(feature);\n });\n }\n\n const cleanPerkDisclaimer = prePerkDisclaimer?.replace(/<br(\\/|)>/g, '') || '';\n\n return (\n <SimpleModal title={props.room.name + ' ' + t(Translation.Step.Room.RoomInfo.Information)} open={props.open} size={SimpleModalSize.Small} onClose={props.onClose}>\n <div>\n <div style={{ height: '350px' }}>\n <ImageGallerySlider images={props.room.getImages()} />\n </div>\n\n <div className=\"u-marg-heavy u-marg@m-\">\n <div className=\"u-marg-bottom--light\">\n <Headline bold size=\"large\">\n {props.room.name}\n </Headline>\n </div>\n <RoomDetailsBedsBlock room={props.room} />\n <div className=\"u-marg-bottom--heavy\">\n <Text color={Color.DarkGrey} type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: props.room.getShortDescription(false) || '' }} />\n </Text>\n </div>\n\n {!hotel?.perksHideOnRoomDetail && roomPerks && (\n <div className=\"u-marg-bottom--heavy\">\n <div className=\"row\">\n {roomPerks.map((perk, index) => {\n return (\n <div key={index} className=\"u-marg-bottom col-6 col-md-4 u-flex align-items-center justify-content-start\">\n <div className=\"room-perk-icon --has-bg\">{perk.iconElement ? perk.iconElement : <Icon icon={perk.icon as IconType} />}</div>\n <div className=\"u-marg-left--light\">\n <Text type={TextType.Small}>\n {perk?.perkNameRenderer\n ? perk.perkNameRenderer({\n hotel,\n room: props.room,\n })\n : perk.name}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n {hotel?.perksShowDisclaimer && (\n <div className=\"row u-marg-top--lighter\">\n <small className=\"col-12\">{t(Translation.Misc.PerksDisclaimer)}</small>\n </div>\n )}\n </div>\n )}\n {!!amenities?.length && (\n <>\n <div className=\"u-marg-bottom\">\n <Text color={Color.Accent} type={TextType.Small}>\n <strong>{t(Translation.Step.Room.RoomInfo.RoomAmenities)}</strong>\n </Text>\n </div>\n <div className=\"row\">\n {amenities.map((amenity) => {\n return (\n <div key={amenity.description} className=\"col-sm-6 u-marg-bottom--light u-flex justify-content-start\">\n <Icon icon={IconType.Check} color={Color.White} backgroundColor={Color.Navy} borderRadius=\"round\" noPadding size=\"16px\" />\n <div className=\"u-marg-left--light u-flex\">\n <Text type={TextType.Small} inline>\n {amenity.description}\n </Text>\n </div>\n </div>\n );\n })}\n </div>\n </>\n )}\n <LineBreak />\n <div className=\"u-marg-bottom--heavy\">\n <Text type={TextType.Small} color={Color.Graphite}>\n <span dangerouslySetInnerHTML={{ __html: props.room.getLongDescription() || '' }} />\n </Text>\n </div>\n {!!cleanPerkDisclaimer && (\n <div className=\"u-marg-bottom--heavy\">\n <Text type={TextType.Small}>\n <strong>{t(Translation.Step.Room.RoomInfo.Disclaimer)}</strong>\n </Text>\n <Text type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: cleanPerkDisclaimer }} />\n </Text>\n </div>\n )}\n </div>\n\n <RoomRates featuredRates={props.featuredRates} rates={props.rates} roomCode={props.room.code as string} />\n </div>\n </SimpleModal>\n );\n}\n"]}
@@ -43,7 +43,7 @@ const DataLayer_1 = __importDefault(require("../../../../util/DataLayer"));
43
43
  const TabGroupedRooms = () => {
44
44
  var _a;
45
45
  const { hotel } = (0, hooks_1.useCurrentHotel)();
46
- const { rooms, isLoading, openRoom, apiHasError } = (0, RoomRateAvailabilityListFromApi_1.useRoomRateAvailabilityListFromApi)();
46
+ const { rooms, isLoading, loadingAttempted, openRoom, apiHasError } = (0, RoomRateAvailabilityListFromApi_1.useRoomRateAvailabilityListFromApi)();
47
47
  const params = (0, Query_1.useHashQuery)();
48
48
  const groupedRooms = (0, react_1.useMemo)(() => {
49
49
  if (!hotel) {
@@ -83,7 +83,7 @@ const TabGroupedRooms = () => {
83
83
  var _a;
84
84
  return (_a = params.get('defaultTab')) !== null && _a !== void 0 ? _a : undefined;
85
85
  }, []);
86
- if (isLoading) {
86
+ if (isLoading || !loadingAttempted) {
87
87
  return react_1.default.createElement(LargeLoader_1.default, null);
88
88
  }
89
89
  if (groupedRooms.length > 0 && groupedRooms.length <= 2) {
@@ -1 +1 @@
1
- {"version":3,"file":"TabGroupedRooms.js","sourceRoot":"/","sources":["src/components/steps/room/TabGroupedRooms/TabGroupedRooms.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCurrentHotel } from '@frontend/hooks';\nimport React, { useMemo } from 'react';\n\nimport LargeLoader from '@/components/generic/loader/LargeLoader';\nimport { Tab } from '@/components/generic/Tabs/Tab';\nimport Tabs from '@/components/generic/Tabs/Tabs';\nimport NoRoomsFoundBlock from '@/components/steps/room/NoRoomsFoundBlock';\nimport RoomListCrossSellBlock from '@/components/steps/room/RoomListCrossSellBlock';\nimport { StepRoomErrorForm } from '@/components/steps/room/StepRoomErrorForm';\nimport { TabGroupedRoomList } from '@/components/steps/room/TabGroupedRooms/TabGroupedRoomList';\nimport { useHashQuery } from '@/hooks/Query';\nimport { useRoomRateAvailabilityListFromApi } from '@/hooks/RoomRateAvailabilityListFromApi';\nimport { HotelRoomGroupsDTO } from '@/models/Api/HotelDTO';\nimport { Room } from '@/models/Room/Room';\nimport StepGroupedRoom from '@/pages/steps/StepGroupedRoom/StepGroupedRoom';\nimport DataLayer from '@/util/DataLayer';\n\nexport const TabGroupedRooms = () => {\n const { hotel } = useCurrentHotel();\n\n const { rooms, isLoading, openRoom, apiHasError } = useRoomRateAvailabilityListFromApi();\n const params = useHashQuery();\n\n const groupedRooms: (HotelRoomGroupsDTO[number] & { rooms: Room[] })[] = useMemo(() => {\n if (!hotel) {\n return [];\n }\n\n const sortingGroup: { [id: string]: HotelRoomGroupsDTO[number] & { rooms: Room[] } } = {\n 'list-all': {\n id: 'list-all',\n groupName: 'All Accommodations',\n filters: {},\n rooms: [],\n },\n };\n\n for (const room of rooms) {\n let groupId = !!room.roomGroupId ? room.roomGroupId : 'list-all';\n\n if (!sortingGroup[groupId]) {\n const foundGroup = hotel.roomGroups.find((group) => group.id === groupId);\n\n if (foundGroup) {\n sortingGroup[groupId] = {\n ...foundGroup,\n rooms: [],\n };\n } else {\n // Can't find the specific room, defaulting to \"unsorted\" rooms\n groupId = 'list-all';\n }\n }\n\n // Actual bit that puts the right room in the right location\n sortingGroup[groupId].rooms.push(room);\n }\n\n const valuedSortedGroups = Object.values(sortingGroup);\n\n if (valuedSortedGroups.length === 1 && valuedSortedGroups[0].rooms.length === 0) {\n valuedSortedGroups.splice(0, 1);\n }\n\n DataLayer.instance.sendRoomImpressions();\n\n return valuedSortedGroups;\n }, [rooms, hotel?.roomGroups]);\n\n const defaultTab = useMemo(() => {\n return params.get('defaultTab') ?? undefined;\n }, []);\n\n if (isLoading) {\n return <LargeLoader />;\n }\n\n if (groupedRooms.length > 0 && groupedRooms.length <= 2) {\n let groupObject = { groupName: '', filters: {}, id: '' };\n let rooms = [];\n if (groupedRooms.length === 2) {\n groupObject = groupedRooms[1];\n rooms = groupedRooms[1].rooms;\n } else {\n rooms = groupedRooms[0].rooms;\n }\n\n return <TabGroupedRoomList group={groupObject} rooms={rooms} />;\n } else if (groupedRooms.length > 2) {\n const onlyGroups = [...groupedRooms];\n // Update onlyGroups to be the same as groupedRooms, but without the first element\n onlyGroups.splice(0, 1);\n\n return (\n <div style={{ maxWidth: '100%', overflow: 'hidden' }}>\n <Tabs fullBleedOnLineBreak={false} activeKey={defaultTab}>\n <Tab title=\"All Accommodation\" navPath={StepGroupedRoom.getStepUrl() + 'list-all'} key=\"list-all\" preventScrollTop>\n {/* We're not starting at 1 here as we want to display these rooms, even if they're not ordered */}\n {groupedRooms\n ?.filter((item) => item.rooms.length)\n .map((group) => {\n return <TabGroupedRoomList group={group} rooms={group.rooms} key={group.id} />;\n })}\n </Tab>\n {/* Reason we've got to splice here is 0 index will always be unsorted rooms */}\n {onlyGroups.map((group) => (\n <Tab title={group.groupName} navPath={StepGroupedRoom.getStepUrl() + group.groupName} key={group.id} preventScrollTop>\n <TabGroupedRoomList group={group} rooms={group.rooms} />\n </Tab>\n ))}\n </Tabs>\n </div>\n );\n }\n\n // No rooms found, so let's display the crossell block, or no rooms found\n return (\n <>\n {apiHasError ? <StepRoomErrorForm /> : <NoRoomsFoundBlock />}\n {hotel?.crossSellHotelIds?.map((hotelId) => (\n <RoomListCrossSellBlock key={hotelId} hotelId={hotelId} />\n ))}\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"TabGroupedRooms.js","sourceRoot":"/","sources":["src/components/steps/room/TabGroupedRooms/TabGroupedRooms.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAkD;AAClD,+CAAuC;AAEvC,0FAAkE;AAClE,uDAAoD;AACpD,0EAAkD;AAClD,kGAA0E;AAC1E,4GAAoF;AACpF,iFAA8E;AAC9E,mGAAgG;AAChG,yCAA6C;AAC7C,6FAA6F;AAG7F,oGAA4E;AAC5E,iEAAyC;AAElC,MAAM,eAAe,GAAG,GAAG,EAAE;;IAChC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,uBAAe,GAAE,CAAC;IAEpC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAA,oEAAkC,GAAE,CAAC;IAC3G,MAAM,MAAM,GAAG,IAAA,oBAAY,GAAE,CAAC;IAE9B,MAAM,YAAY,GAAuD,IAAA,eAAO,EAAC,GAAG,EAAE;QAClF,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,EAAE,CAAC;SACb;QAED,MAAM,YAAY,GAAqE;YACnF,UAAU,EAAE;gBACR,EAAE,EAAE,UAAU;gBACd,SAAS,EAAE,oBAAoB;gBAC/B,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,EAAE;aACZ;SACJ,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACtB,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;YAEjE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;gBACxB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;gBAE1E,IAAI,UAAU,EAAE;oBACZ,YAAY,CAAC,OAAO,CAAC,mCACd,UAAU,KACb,KAAK,EAAE,EAAE,GACZ,CAAC;iBACL;qBAAM;oBACH,+DAA+D;oBAC/D,OAAO,GAAG,UAAU,CAAC;iBACxB;aACJ;YAED,4DAA4D;YAC5D,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC1C;QAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAEvD,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7E,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACnC;QAED,mBAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QAEzC,OAAO,kBAAkB,CAAC;IAC9B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,CAAC,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;;QAC5B,OAAO,MAAA,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,mCAAI,SAAS,CAAC;IACjD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,SAAS,IAAI,CAAC,gBAAgB,EAAE;QAChC,OAAO,8BAAC,qBAAW,OAAG,CAAC;KAC1B;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;QACrD,IAAI,WAAW,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACzD,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3B,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SACjC;aAAM;YACH,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SACjC;QAED,OAAO,8BAAC,uCAAkB,IAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;KACnE;SAAM,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;QAChC,MAAM,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QACrC,kFAAkF;QAClF,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAExB,OAAO,CACH,uCAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAChD,8BAAC,cAAI,IAAC,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU;gBACpD,8BAAC,SAAG,IAAC,KAAK,EAAC,mBAAmB,EAAC,OAAO,EAAE,yBAAe,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,EAAC,UAAU,EAAC,gBAAgB,UAE7G,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CACP,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EACnC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACX,OAAO,8BAAC,uCAAkB,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAI,CAAC;gBACnF,CAAC,CAAC,CACJ;gBAEL,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACvB,8BAAC,SAAG,IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,yBAAe,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,gBAAgB;oBACjH,8BAAC,uCAAkB,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAI,CACtD,CACT,CAAC,CACC,CACL,CACT,CAAC;KACL;IAED,yEAAyE;IACzE,OAAO,CACH;QACK,WAAW,CAAC,CAAC,CAAC,8BAAC,qCAAiB,OAAG,CAAC,CAAC,CAAC,8BAAC,2BAAiB,OAAG,EAC3D,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,iBAAiB;WAAE,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACxC,8BAAC,gCAAsB,IAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAI,CAC7D,CAAC,CACH,CACN,CAAC;AACN,CAAC,CAAC;AA3GW,QAAA,eAAe,mBA2G1B","sourcesContent":["import { useCurrentHotel } from '@frontend/hooks';\nimport React, { useMemo } from 'react';\n\nimport LargeLoader from '@/components/generic/loader/LargeLoader';\nimport { Tab } from '@/components/generic/Tabs/Tab';\nimport Tabs from '@/components/generic/Tabs/Tabs';\nimport NoRoomsFoundBlock from '@/components/steps/room/NoRoomsFoundBlock';\nimport RoomListCrossSellBlock from '@/components/steps/room/RoomListCrossSellBlock';\nimport { StepRoomErrorForm } from '@/components/steps/room/StepRoomErrorForm';\nimport { TabGroupedRoomList } from '@/components/steps/room/TabGroupedRooms/TabGroupedRoomList';\nimport { useHashQuery } from '@/hooks/Query';\nimport { useRoomRateAvailabilityListFromApi } from '@/hooks/RoomRateAvailabilityListFromApi';\nimport { HotelRoomGroupsDTO } from '@/models/Api/HotelDTO';\nimport { Room } from '@/models/Room/Room';\nimport StepGroupedRoom from '@/pages/steps/StepGroupedRoom/StepGroupedRoom';\nimport DataLayer from '@/util/DataLayer';\n\nexport const TabGroupedRooms = () => {\n const { hotel } = useCurrentHotel();\n\n const { rooms, isLoading, loadingAttempted, openRoom, apiHasError } = useRoomRateAvailabilityListFromApi();\n const params = useHashQuery();\n\n const groupedRooms: (HotelRoomGroupsDTO[number] & { rooms: Room[] })[] = useMemo(() => {\n if (!hotel) {\n return [];\n }\n\n const sortingGroup: { [id: string]: HotelRoomGroupsDTO[number] & { rooms: Room[] } } = {\n 'list-all': {\n id: 'list-all',\n groupName: 'All Accommodations',\n filters: {},\n rooms: [],\n },\n };\n\n for (const room of rooms) {\n let groupId = !!room.roomGroupId ? room.roomGroupId : 'list-all';\n\n if (!sortingGroup[groupId]) {\n const foundGroup = hotel.roomGroups.find((group) => group.id === groupId);\n\n if (foundGroup) {\n sortingGroup[groupId] = {\n ...foundGroup,\n rooms: [],\n };\n } else {\n // Can't find the specific room, defaulting to \"unsorted\" rooms\n groupId = 'list-all';\n }\n }\n\n // Actual bit that puts the right room in the right location\n sortingGroup[groupId].rooms.push(room);\n }\n\n const valuedSortedGroups = Object.values(sortingGroup);\n\n if (valuedSortedGroups.length === 1 && valuedSortedGroups[0].rooms.length === 0) {\n valuedSortedGroups.splice(0, 1);\n }\n\n DataLayer.instance.sendRoomImpressions();\n\n return valuedSortedGroups;\n }, [rooms, hotel?.roomGroups]);\n\n const defaultTab = useMemo(() => {\n return params.get('defaultTab') ?? undefined;\n }, []);\n\n if (isLoading || !loadingAttempted) {\n return <LargeLoader />;\n }\n\n if (groupedRooms.length > 0 && groupedRooms.length <= 2) {\n let groupObject = { groupName: '', filters: {}, id: '' };\n let rooms = [];\n if (groupedRooms.length === 2) {\n groupObject = groupedRooms[1];\n rooms = groupedRooms[1].rooms;\n } else {\n rooms = groupedRooms[0].rooms;\n }\n\n return <TabGroupedRoomList group={groupObject} rooms={rooms} />;\n } else if (groupedRooms.length > 2) {\n const onlyGroups = [...groupedRooms];\n // Update onlyGroups to be the same as groupedRooms, but without the first element\n onlyGroups.splice(0, 1);\n\n return (\n <div style={{ maxWidth: '100%', overflow: 'hidden' }}>\n <Tabs fullBleedOnLineBreak={false} activeKey={defaultTab}>\n <Tab title=\"All Accommodation\" navPath={StepGroupedRoom.getStepUrl() + 'list-all'} key=\"list-all\" preventScrollTop>\n {/* We're not starting at 1 here as we want to display these rooms, even if they're not ordered */}\n {groupedRooms\n ?.filter((item) => item.rooms.length)\n .map((group) => {\n return <TabGroupedRoomList group={group} rooms={group.rooms} key={group.id} />;\n })}\n </Tab>\n {/* Reason we've got to splice here is 0 index will always be unsorted rooms */}\n {onlyGroups.map((group) => (\n <Tab title={group.groupName} navPath={StepGroupedRoom.getStepUrl() + group.groupName} key={group.id} preventScrollTop>\n <TabGroupedRoomList group={group} rooms={group.rooms} />\n </Tab>\n ))}\n </Tabs>\n </div>\n );\n }\n\n // No rooms found, so let's display the crossell block, or no rooms found\n return (\n <>\n {apiHasError ? <StepRoomErrorForm /> : <NoRoomsFoundBlock />}\n {hotel?.crossSellHotelIds?.map((hotelId) => (\n <RoomListCrossSellBlock key={hotelId} hotelId={hotelId} />\n ))}\n </>\n );\n};\n"]}
@@ -56,7 +56,6 @@ const currencyHelper = __importStar(require("../../../../util/CurrencyHelper"));
56
56
  const DataLayer_1 = __importStar(require("../../../../util/DataLayer"));
57
57
  const ScreenSize_1 = __importDefault(require("../../../../util/ScreenSize"));
58
58
  function RoomDetails(props) {
59
- var _a, _b, _c, _d;
60
59
  const [featuredRates, setFeaturedRates] = (0, react_1.useState)([]);
61
60
  const [standardRates, setStandardRates] = (0, react_1.useState)([]);
62
61
  const [viewingRates, setViewingRates] = (0, react_1.useState)(null);
@@ -100,9 +99,6 @@ function RoomDetails(props) {
100
99
  }
101
100
  setStandardRates(nonPromoRates);
102
101
  }, [room.getRates()]);
103
- const roomOverride = (_a = hotel === null || hotel === void 0 ? void 0 : hotel.overwrites) === null || _a === void 0 ? void 0 : _a[room.code];
104
- const roomPerks = ((_b = roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.perks) === null || _b === void 0 ? void 0 : _b.length) ? (_c = roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.perks) === null || _c === void 0 ? void 0 : _c.slice(0, 5) : (_d = hotel === null || hotel === void 0 ? void 0 : hotel.perks) === null || _d === void 0 ? void 0 : _d.slice(0, 5);
105
- const prePerkDisclaimer = (roomOverride === null || roomOverride === void 0 ? void 0 : roomOverride.prePerkDisclaimer) ? roomOverride.prePerkDisclaimer : room === null || room === void 0 ? void 0 : room.prePerkDisclaimer;
106
102
  const trimmedDescription = room.getShortDescription();
107
103
  const isMobile = context.screenSize <= ScreenSize_1.default.Large;
108
104
  const ratesOpen = viewingRates || (context.screenSize <= ScreenSize_1.default.Medium && viewingRates === null);
@@ -128,6 +124,11 @@ function RoomDetails(props) {
128
124
  });
129
125
  const selectedRow = basketContext.selectedBasketRow;
130
126
  const { hasPricePreview } = (0, Planpay_1.default)();
127
+ const { roomPerks } = room.getRoomPerks({
128
+ hotel: hotel,
129
+ room: room,
130
+ perksLimitNumber: 5,
131
+ });
131
132
  return (react_1.default.createElement("div", { className: `room-details-container ${props.disableMarginBottom ? '' : 'u-marg-bottom'}` },
132
133
  react_1.default.createElement("div", { className: classes },
133
134
  react_1.default.createElement("div", { className: "room-details--image" },
@@ -142,12 +143,7 @@ function RoomDetails(props) {
142
143
  react_1.default.createElement(RoomDetailsBedsBlock_1.RoomDetailsBedsBlock, { room: room }),
143
144
  (trimmedDescription === null || trimmedDescription === void 0 ? void 0 : trimmedDescription.replace(/<br(\/|)>/g, '')) && (react_1.default.createElement("div", { className: "room-details--content-description u-marg-bottom--light" },
144
145
  react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, type: Text_1.TextType.Small },
145
- react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: (trimmedDescription === null || trimmedDescription === void 0 ? void 0 : trimmedDescription.replace(/<br(\/|)>/g, '')) || '' } })))),
146
- (prePerkDisclaimer === null || prePerkDisclaimer === void 0 ? void 0 : prePerkDisclaimer.replace(/<br(\/|)>/g, '')) && (react_1.default.createElement("div", { className: "room-details--content-description u-marg-bottom--light" },
147
- react_1.default.createElement(Text_1.default, { color: Color_1.Color.Accent, type: Text_1.TextType.Small },
148
- react_1.default.createElement("strong", null, t(Translation_1.Translation.Step.Room.RoomInfo.Disclaimer))),
149
- react_1.default.createElement(Text_1.default, { color: Color_1.Color.DarkGrey, type: Text_1.TextType.Small },
150
- react_1.default.createElement("span", { className: "u-text-overflow-ellipsis-2", dangerouslySetInnerHTML: { __html: (prePerkDisclaimer === null || prePerkDisclaimer === void 0 ? void 0 : prePerkDisclaimer.replace(/<br(\/|)>/g, '')) || '' } }))))),
146
+ react_1.default.createElement("span", { dangerouslySetInnerHTML: { __html: (trimmedDescription === null || trimmedDescription === void 0 ? void 0 : trimmedDescription.replace(/<br(\/|)>/g, '')) || '' } }))))),
151
147
  react_1.default.createElement("div", { className: "row" },
152
148
  !(hotel === null || hotel === void 0 ? void 0 : hotel.perksHideOnRoomRow) && (react_1.default.createElement("div", { className: "col-12 u-flex u-marg-bottom@m- flex-column align-items-start" },
153
149
  react_1.default.createElement("div", { className: "room-details--content-perks u-marg-bottom@m-" },
@@ -1 +1 @@
1
- {"version":3,"file":"RoomDetails.js","sourceRoot":"/","sources":["src/components/steps/room/roomDetails/RoomDetails.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext, BookingEngineContext, CompanyContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport classNames from 'classnames';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport AutoAutoHeight from '@/animations/AutoAutoHeight';\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 LineBreak from '@/components/generic/LineBreak';\nimport { PlanpayPrice } from '@/components/generic/PlanpayPrice/PlanpayPrice';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { RoomDetailsBedsBlock } from '@/components/steps/room/roomDetails/RoomDetailsBedsBlock';\nimport { RoomDetailsPerkBlock } from '@/components/steps/room/roomDetails/RoomDetailsPerkBlock';\nimport RoomRatePills from '@/components/steps/room/roomDetails/roomRates/RoomRatePills';\nimport RoomRates from '@/components/steps/room/roomDetails/roomRates/RoomRates';\nimport RoomModal from '@/components/steps/room/RoomModal';\nimport useCurrency from '@/hooks/Currency';\nimport usePlanpay from '@/hooks/Planpay';\nimport { HotelPerk } from '@/models/Client/Hotel/HotelPerk';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate, RoomRatePriceInclusion } from '@/models/Room/RoomRate';\nimport FeaturedPromoFeature from '@/providers/feature/FeaturedPromoFeature';\nimport { ImageSize } from '@/providers/ImageProvider';\nimport { Translation } from '@/translations/Translation';\nimport { Color, getContrastTextColor } from '@/util/Color';\nimport * as currencyHelper from '@/util/CurrencyHelper';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport ScreenSize from '@/util/ScreenSize';\n\nexport interface RoomDetailsProps {\n room: Room;\n disableMarginBottom?: boolean;\n}\n\nexport default function RoomDetails(props: RoomDetailsProps) {\n const [featuredRates, setFeaturedRates] = useState<RoomRate[]>([]);\n const [standardRates, setStandardRates] = useState<RoomRate[]>([]);\n\n const [viewingRates, setViewingRates] = useState<boolean | number | null>(null);\n const [viewingDescription, setViewingDescription] = useState(false);\n\n const { t } = useTranslation();\n\n const context = useContext(BookingEngineContext);\n const basketContext = useContext(BasketContext);\n const ccx = useContext(CompanyContext);\n const { hotel } = useCurrentHotel();\n\n const { room } = props;\n\n const classes = classNames('room-details', {\n ['+is-open']: viewingRates,\n });\n\n useEffect(() => {\n if (basketContext.selectedBasketRow?.getRoom() && basketContext.selectedBasketRow.getRoom().code === props.room.code) {\n setViewingRates(true);\n }\n\n DataLayer.instance.addRoomImpression(room);\n }, [basketContext.selectedBasketRow]);\n\n useEffect(() => {\n let nonPromoRates: RoomRate[] = [];\n const toSetFeaturedRate: RoomRate[] = [];\n\n if (FeaturedPromoFeature.isActive()) {\n for (const currentRate of room.getRates()) {\n if (currentRate.promoCode?.toLowerCase() === basketContext.selectedBasketRow?.getPromoCode()?.toLowerCase()) {\n toSetFeaturedRate.unshift(currentRate);\n } else {\n nonPromoRates.push(currentRate);\n }\n }\n\n if (toSetFeaturedRate.length > 0) {\n setViewingRates(true);\n setFeaturedRates(toSetFeaturedRate);\n }\n } else {\n nonPromoRates = room.getRates();\n }\n\n setStandardRates(nonPromoRates);\n }, [room.getRates()]);\n\n const roomOverride = hotel?.overwrites?.[room.code as string];\n const roomPerks = roomOverride?.perks?.length ? roomOverride?.perks?.slice(0, 5) : hotel?.perks?.slice(0, 5);\n const prePerkDisclaimer = roomOverride?.prePerkDisclaimer ? roomOverride.prePerkDisclaimer : room?.prePerkDisclaimer;\n\n const trimmedDescription = room.getShortDescription();\n\n const isMobile = context.screenSize <= ScreenSize.Large;\n\n const ratesOpen = viewingRates || (context.screenSize <= ScreenSize.Medium && viewingRates === null);\n const moreDetailsOnClick = () => {\n DataLayer.instance.sendInteraction('More Room Details', InteractionType.LINK, InteractionStep.ROOMS);\n setViewingDescription(true);\n };\n const sendRoomClickOnClick = () => {\n if (!ratesOpen) {\n DataLayer.instance.sendRoomClick(room, basketContext.startDate, basketContext.endDate);\n }\n setViewingRates(!ratesOpen);\n };\n const closeDescriptionOnClose = () => {\n setViewingDescription(false);\n };\n\n const lowestPrice = Math.round(room.getLowestPrice(false, true));\n const currencySize = context.screenSize > ScreenSize.Medium && lowestPrice.toLocaleString().length < 7 ? 'large' : 'normal';\n\n const convertCurrencyPrice = (value: number) => Math.round(currencyHelper.convertPrice(value, true, ccx.currentCurrency, hotel?.defaultCurrency as string));\n\n const { value: price, isLoading } = useCurrency({\n hideDecimals: true,\n children: lowestPrice,\n });\n\n const selectedRow = basketContext.selectedBasketRow;\n\n const { hasPricePreview } = usePlanpay();\n\n return (\n <div className={`room-details-container ${props.disableMarginBottom ? '' : 'u-marg-bottom'}`}>\n <div className={classes}>\n <div className=\"room-details--image\">\n <ImageGallerySlider images={props.room.getImages()} imageSize={ImageSize.Medium} />\n </div>\n <div className=\"room-details--content u-pad--heavy u-pad@l-\">\n <div className=\"u-marg-bottom\">\n {context.screenSize > ScreenSize.Large && (\n <>\n <div className=\"u-marg-bottom\">\n <RoomRatePills room={room} limit={2} />\n </div>\n </>\n )}\n <div className=\"room-details--content-title u-marg-bottom--light\">\n <Headline bold>{room.name}</Headline>\n </div>\n <RoomDetailsBedsBlock room={room} />\n {trimmedDescription?.replace(/<br(\\/|)>/g, '') && (\n <div className=\"room-details--content-description u-marg-bottom--light\">\n <Text color={Color.DarkGrey} type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: trimmedDescription?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n )}\n {prePerkDisclaimer?.replace(/<br(\\/|)>/g, '') && (\n <div className=\"room-details--content-description u-marg-bottom--light\">\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 </div>\n\n <div className=\"row\">\n {!hotel?.perksHideOnRoomRow && (\n <div className=\"col-12 u-flex u-marg-bottom@m- flex-column align-items-start\">\n <div className=\"room-details--content-perks u-marg-bottom@m-\">\n {isMobile && (\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} bold color={Color.Accent}>\n {t(Translation.Misc.Perks.AndYouGetAll)}\n </Text>\n </div>\n )}\n <RoomDetailsPerkBlock perks={roomPerks as HotelPerk[]} />\n </div>\n </div>\n )}\n {hotel?.showDescriptionOnRoomDetails && (\n <div className=\"col-12\">\n <LineBreak noMargins />\n <div className=\"u-marg-top u-text-overflow-ellipsis-3 u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Graphite}>\n <span dangerouslySetInnerHTML={{ __html: props.room.getLongDescription() || '' }} />\n </Text>\n </div>\n </div>\n )}\n <div className=\"col-md-6 u-flex u-marg-bottom@m- flex-column align-items-start\">\n <BEButton icon={IconType.ArrowRight2} isText primary size=\"tiny\" iconPosition=\"right\" onClick={moreDetailsOnClick}>\n {t(Translation.Step.Room.RoomInfo.MoreDetails)}\n </BEButton>\n </div>\n <div className=\"col-md-6 u-flex justify-content-end flex-column align-items-start align-items-md-end\">\n <Text type={TextType.Small} color={Color.Navy} inline>\n {t(Translation.Misc.From)}\n </Text>\n <div className=\"room-details--content-price flex-row align-items-end\">\n <Headline size={currencySize} bold>\n <Currency hideDecimals>{lowestPrice}</Currency>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n <Text type={TextType.Small} color={Color.Grey} inline className=\"u-nowrap\">\n {room.getLowestPriceType() === RoomRatePriceInclusion.IncludingFeesAndTaxes\n ? t(Translation.Step.Room.RoomInfo.IncludesTaxes)\n : t(Translation.Step.Room.ExcludingTaxes)}\n </Text>\n </div>\n </div>\n <div className=\"u-flex-direction-column u-flex u-flex-align-flex-end u-flex-align-flex-start@m- u-w-100@m-\">\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 <BEButton\n className=\"u-marg-top--light\"\n name=\"ViewRatesNowButton\"\n primary\n primaryActive={!!ratesOpen}\n filled\n stopIconAnimation\n icon={ratesOpen ? IconType.ArrowUp2 : IconType.ArrowDown2}\n iconPosition=\"right\"\n onClick={sendRoomClickOnClick}\n wide={context.screenSize <= ScreenSize.Large}\n textColor={getContrastTextColor(ratesOpen ? hotel?.colors.accent3 : hotel?.colors.accent)}\n >\n {ratesOpen ? t(Translation.Step.Room.RoomInfo.CloseRates) : t(Translation.Step.Room.RoomInfo.ViewRates)}\n </BEButton>\n </div>\n </div>\n </div>\n <AutoAutoHeight open={!!ratesOpen}>\n <RoomRates roomCode={room.code as string} rates={standardRates} featuredRates={featuredRates} />\n </AutoAutoHeight>\n <RoomModal open={viewingDescription} room={props.room} rates={standardRates} featuredRates={featuredRates} onClose={closeDescriptionOnClose} />\n {room.getRates().map((rate) => {\n return (\n <script key={room.code + '-' + rate.code} type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'http://schema.org/',\n '@type': 'Offer',\n itemOffered: {\n '@type': 'HotelRoom',\n name: room.name,\n },\n name: rate.name,\n identifier: rate.code,\n priceSpecification: {\n '@type': 'UnitPriceSpecification',\n price: convertCurrencyPrice(rate.getAveragePrice(true)),\n basePrice: convertCurrencyPrice(rate.getTotalPrice(true)),\n totalPrice: convertCurrencyPrice(rate.getAveragePrice()),\n priceCurrency: ccx.currentCurrency,\n unitText: 'Nightly',\n },\n })}\n </script>\n );\n })}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"RoomDetails.js","sourceRoot":"/","sources":["src/components/steps/room/roomDetails/RoomDetails.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BasketContext, BookingEngineContext, CompanyContext } from '@frontend/contexts';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport classNames from 'classnames';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport AutoAutoHeight from '@/animations/AutoAutoHeight';\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 LineBreak from '@/components/generic/LineBreak';\nimport { PlanpayPrice } from '@/components/generic/PlanpayPrice/PlanpayPrice';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { RoomDetailsBedsBlock } from '@/components/steps/room/roomDetails/RoomDetailsBedsBlock';\nimport { RoomDetailsPerkBlock } from '@/components/steps/room/roomDetails/RoomDetailsPerkBlock';\nimport RoomRatePills from '@/components/steps/room/roomDetails/roomRates/RoomRatePills';\nimport RoomRates from '@/components/steps/room/roomDetails/roomRates/RoomRates';\nimport RoomModal from '@/components/steps/room/RoomModal';\nimport useCurrency from '@/hooks/Currency';\nimport usePlanpay from '@/hooks/Planpay';\nimport { HotelPerk } from '@/models/Client/Hotel/HotelPerk';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate, RoomRatePriceInclusion } from '@/models/Room/RoomRate';\nimport FeaturedPromoFeature from '@/providers/feature/FeaturedPromoFeature';\nimport { ImageSize } from '@/providers/ImageProvider';\nimport { Translation } from '@/translations/Translation';\nimport { Color, getContrastTextColor } from '@/util/Color';\nimport * as currencyHelper from '@/util/CurrencyHelper';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport ScreenSize from '@/util/ScreenSize';\nexport interface RoomDetailsProps {\n room: Room;\n disableMarginBottom?: boolean;\n}\n\nexport default function RoomDetails(props: RoomDetailsProps) {\n const [featuredRates, setFeaturedRates] = useState<RoomRate[]>([]);\n const [standardRates, setStandardRates] = useState<RoomRate[]>([]);\n\n const [viewingRates, setViewingRates] = useState<boolean | number | null>(null);\n const [viewingDescription, setViewingDescription] = useState(false);\n\n const { t } = useTranslation();\n\n const context = useContext(BookingEngineContext);\n const basketContext = useContext(BasketContext);\n const ccx = useContext(CompanyContext);\n const { hotel } = useCurrentHotel();\n\n const { room } = props;\n\n const classes = classNames('room-details', {\n ['+is-open']: viewingRates,\n });\n\n useEffect(() => {\n if (basketContext.selectedBasketRow?.getRoom() && basketContext.selectedBasketRow.getRoom().code === props.room.code) {\n setViewingRates(true);\n }\n\n DataLayer.instance.addRoomImpression(room);\n }, [basketContext.selectedBasketRow]);\n\n useEffect(() => {\n let nonPromoRates: RoomRate[] = [];\n const toSetFeaturedRate: RoomRate[] = [];\n\n if (FeaturedPromoFeature.isActive()) {\n for (const currentRate of room.getRates()) {\n if (currentRate.promoCode?.toLowerCase() === basketContext.selectedBasketRow?.getPromoCode()?.toLowerCase()) {\n toSetFeaturedRate.unshift(currentRate);\n } else {\n nonPromoRates.push(currentRate);\n }\n }\n\n if (toSetFeaturedRate.length > 0) {\n setViewingRates(true);\n setFeaturedRates(toSetFeaturedRate);\n }\n } else {\n nonPromoRates = room.getRates();\n }\n\n setStandardRates(nonPromoRates);\n }, [room.getRates()]);\n\n const trimmedDescription = room.getShortDescription();\n\n const isMobile = context.screenSize <= ScreenSize.Large;\n\n const ratesOpen = viewingRates || (context.screenSize <= ScreenSize.Medium && viewingRates === null);\n const moreDetailsOnClick = () => {\n DataLayer.instance.sendInteraction('More Room Details', InteractionType.LINK, InteractionStep.ROOMS);\n setViewingDescription(true);\n };\n const sendRoomClickOnClick = () => {\n if (!ratesOpen) {\n DataLayer.instance.sendRoomClick(room, basketContext.startDate, basketContext.endDate);\n }\n setViewingRates(!ratesOpen);\n };\n const closeDescriptionOnClose = () => {\n setViewingDescription(false);\n };\n\n const lowestPrice = Math.round(room.getLowestPrice(false, true));\n const currencySize = context.screenSize > ScreenSize.Medium && lowestPrice.toLocaleString().length < 7 ? 'large' : 'normal';\n\n const convertCurrencyPrice = (value: number) => Math.round(currencyHelper.convertPrice(value, true, ccx.currentCurrency, hotel?.defaultCurrency as string));\n\n const { value: price, isLoading } = useCurrency({\n hideDecimals: true,\n children: lowestPrice,\n });\n\n const selectedRow = basketContext.selectedBasketRow;\n\n const { hasPricePreview } = usePlanpay();\n\n const { roomPerks } = room.getRoomPerks({\n hotel: hotel,\n room: room,\n perksLimitNumber: 5,\n });\n\n return (\n <div className={`room-details-container ${props.disableMarginBottom ? '' : 'u-marg-bottom'}`}>\n <div className={classes}>\n <div className=\"room-details--image\">\n <ImageGallerySlider images={props.room.getImages()} imageSize={ImageSize.Medium} />\n </div>\n <div className=\"room-details--content u-pad--heavy u-pad@l-\">\n <div className=\"u-marg-bottom\">\n {context.screenSize > ScreenSize.Large && (\n <>\n <div className=\"u-marg-bottom\">\n <RoomRatePills room={room} limit={2} />\n </div>\n </>\n )}\n <div className=\"room-details--content-title u-marg-bottom--light\">\n <Headline bold>{room.name}</Headline>\n </div>\n <RoomDetailsBedsBlock room={room} />\n {trimmedDescription?.replace(/<br(\\/|)>/g, '') && (\n <div className=\"room-details--content-description u-marg-bottom--light\">\n <Text color={Color.DarkGrey} type={TextType.Small}>\n <span dangerouslySetInnerHTML={{ __html: trimmedDescription?.replace(/<br(\\/|)>/g, '') || '' }} />\n </Text>\n </div>\n )}\n </div>\n\n <div className=\"row\">\n {!hotel?.perksHideOnRoomRow && (\n <div className=\"col-12 u-flex u-marg-bottom@m- flex-column align-items-start\">\n <div className=\"room-details--content-perks u-marg-bottom@m-\">\n {isMobile && (\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Small} bold color={Color.Accent}>\n {t(Translation.Misc.Perks.AndYouGetAll)}\n </Text>\n </div>\n )}\n <RoomDetailsPerkBlock perks={roomPerks as HotelPerk[]} />\n </div>\n </div>\n )}\n {hotel?.showDescriptionOnRoomDetails && (\n <div className=\"col-12\">\n <LineBreak noMargins />\n <div className=\"u-marg-top u-text-overflow-ellipsis-3 u-marg-bottom\">\n <Text type={TextType.Small} color={Color.Graphite}>\n <span dangerouslySetInnerHTML={{ __html: props.room.getLongDescription() || '' }} />\n </Text>\n </div>\n </div>\n )}\n <div className=\"col-md-6 u-flex u-marg-bottom@m- flex-column align-items-start\">\n <BEButton icon={IconType.ArrowRight2} isText primary size=\"tiny\" iconPosition=\"right\" onClick={moreDetailsOnClick}>\n {t(Translation.Step.Room.RoomInfo.MoreDetails)}\n </BEButton>\n </div>\n <div className=\"col-md-6 u-flex justify-content-end flex-column align-items-start align-items-md-end\">\n <Text type={TextType.Small} color={Color.Navy} inline>\n {t(Translation.Misc.From)}\n </Text>\n <div className=\"room-details--content-price flex-row align-items-end\">\n <Headline size={currencySize} bold>\n <Currency hideDecimals>{lowestPrice}</Currency>\n </Headline>\n <Text color={Color.DarkGrey} inline>\n /{t(Translation.Misc.Night)}\n </Text>\n </div>\n <Text type={TextType.Small} color={Color.Grey} inline className=\"u-nowrap\">\n {room.getLowestPriceType() === RoomRatePriceInclusion.IncludingFeesAndTaxes\n ? t(Translation.Step.Room.RoomInfo.IncludesTaxes)\n : t(Translation.Step.Room.ExcludingTaxes)}\n </Text>\n </div>\n </div>\n <div className=\"u-flex-direction-column u-flex u-flex-align-flex-end u-flex-align-flex-start@m- u-w-100@m-\">\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 <BEButton\n className=\"u-marg-top--light\"\n name=\"ViewRatesNowButton\"\n primary\n primaryActive={!!ratesOpen}\n filled\n stopIconAnimation\n icon={ratesOpen ? IconType.ArrowUp2 : IconType.ArrowDown2}\n iconPosition=\"right\"\n onClick={sendRoomClickOnClick}\n wide={context.screenSize <= ScreenSize.Large}\n textColor={getContrastTextColor(ratesOpen ? hotel?.colors.accent3 : hotel?.colors.accent)}\n >\n {ratesOpen ? t(Translation.Step.Room.RoomInfo.CloseRates) : t(Translation.Step.Room.RoomInfo.ViewRates)}\n </BEButton>\n </div>\n </div>\n </div>\n <AutoAutoHeight open={!!ratesOpen}>\n <RoomRates roomCode={room.code as string} rates={standardRates} featuredRates={featuredRates} />\n </AutoAutoHeight>\n <RoomModal open={viewingDescription} room={props.room} rates={standardRates} featuredRates={featuredRates} onClose={closeDescriptionOnClose} />\n {room.getRates().map((rate) => {\n return (\n <script key={room.code + '-' + rate.code} type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'http://schema.org/',\n '@type': 'Offer',\n itemOffered: {\n '@type': 'HotelRoom',\n name: room.name,\n },\n name: rate.name,\n identifier: rate.code,\n priceSpecification: {\n '@type': 'UnitPriceSpecification',\n price: convertCurrencyPrice(rate.getAveragePrice(true)),\n basePrice: convertCurrencyPrice(rate.getTotalPrice(true)),\n totalPrice: convertCurrencyPrice(rate.getAveragePrice()),\n priceCurrency: ccx.currentCurrency,\n unitText: 'Nightly',\n },\n })}\n </script>\n );\n })}\n </div>\n );\n}\n"]}
@@ -28,6 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.RoomDetailsPerkBlock = void 0;
30
30
  const contexts_1 = require("../../../../contexts/index.js");
31
+ const hooks_1 = require("../../../../hooks/index.js");
31
32
  const classnames_1 = __importDefault(require("classnames"));
32
33
  const react_1 = __importStar(require("react"));
33
34
  const Icon_1 = __importDefault(require("../../../generic/Icon/Icon"));
@@ -36,6 +37,7 @@ const ScreenSize_1 = __importDefault(require("../../../../util/ScreenSize"));
36
37
  function RoomDetailsPerkBlock(props) {
37
38
  var _a;
38
39
  const context = (0, react_1.useContext)(contexts_1.BookingEngineContext);
40
+ const { hotel } = (0, hooks_1.useCurrentHotel)();
39
41
  const perks = props.perks;
40
42
  const isMobile = context.screenSize <= ScreenSize_1.default.Large;
41
43
  const [openPerk, setOpenPerk] = (0, react_1.useState)((_a = perks[0]) === null || _a === void 0 ? void 0 : _a.name);
@@ -51,7 +53,11 @@ function RoomDetailsPerkBlock(props) {
51
53
  return (react_1.default.createElement("li", { key: index, onClick: setPerkOnClick },
52
54
  react_1.default.createElement("div", { className: perkIconClasses }, perk.iconElement ? perk.iconElement : react_1.default.createElement(Icon_1.default, { icon: perk.icon })),
53
55
  react_1.default.createElement("div", { className: 'u-marg-right u-none@l- u-block@m- ' + ((isMobile && openPerk !== perk.name) || context.screenSize === ScreenSize_1.default.Tiny ? 'u-none-2' : '') },
54
- react_1.default.createElement(Text_1.Text, { type: Text_1.TextType.Small }, perk.name))));
56
+ react_1.default.createElement(Text_1.Text, { type: Text_1.TextType.Small }, (perk === null || perk === void 0 ? void 0 : perk.perkNameRenderer)
57
+ ? perk.perkNameRenderer({
58
+ hotel,
59
+ })
60
+ : perk.name))));
55
61
  })))));
56
62
  }
57
63
  exports.RoomDetailsPerkBlock = RoomDetailsPerkBlock;