@roomstay/frontend 2.8.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/177.bundle.js +1 -1
  2. package/dist/279.bundle.js +1 -1
  3. package/dist/288.bundle.js +1 -1
  4. package/dist/370.bundle.js +1 -1
  5. package/dist/449.bundle.js +1 -1
  6. package/dist/537.bundle.js +1 -1
  7. package/dist/596.bundle.js +1 -0
  8. package/dist/625.bundle.js +1 -1
  9. package/dist/686.bundle.js +1 -1
  10. package/dist/836.bundle.js +1 -1
  11. package/dist/978.bundle.js +1 -1
  12. package/dist/main.bundle.js +1 -1
  13. package/dist/src/api/AvailabilityAPI.d.ts +2 -4
  14. package/dist/src/api/AvailabilityAPI.js.map +1 -1
  15. package/dist/src/components/generic/Alert.d.ts +7 -1
  16. package/dist/src/components/generic/Alert.js +6 -0
  17. package/dist/src/components/generic/Alert.js.map +1 -1
  18. package/dist/src/components/generic/AuxiliaryFilterControls/AuxiliaryFilterControls.d.ts +11 -0
  19. package/dist/src/components/generic/AuxiliaryFilterControls/AuxiliaryFilterControls.js +24 -0
  20. package/dist/src/components/generic/AuxiliaryFilterControls/AuxiliaryFilterControls.js.map +1 -0
  21. package/dist/src/components/generic/RecentSearchesCard.js +4 -2
  22. package/dist/src/components/generic/RecentSearchesCard.js.map +1 -1
  23. package/dist/src/components/generic/date/DatePicker.d.ts +5 -0
  24. package/dist/src/components/generic/date/DatePicker.js +2 -1
  25. package/dist/src/components/generic/date/DatePicker.js.map +1 -1
  26. package/dist/src/components/reservation/ReservationItem.js +3 -2
  27. package/dist/src/components/reservation/ReservationItem.js.map +1 -1
  28. package/dist/src/components/steps/DaysSelectedInformer.js +6 -4
  29. package/dist/src/components/steps/DaysSelectedInformer.js.map +1 -1
  30. package/dist/src/components/steps/confirmation/RoomContactDetails.js +14 -12
  31. package/dist/src/components/steps/confirmation/RoomContactDetails.js.map +1 -1
  32. package/dist/src/components/steps/confirmation/StepConfirmationCountrySelector.js +8 -6
  33. package/dist/src/components/steps/confirmation/StepConfirmationCountrySelector.js.map +1 -1
  34. package/dist/src/components/steps/date/StepOneDateRange.js +5 -3
  35. package/dist/src/components/steps/date/StepOneDateRange.js.map +1 -1
  36. package/dist/src/components/steps/date/StepOneDateRangePicker.d.ts +2 -1
  37. package/dist/src/components/steps/date/StepOneDateRangePicker.js +3 -3
  38. package/dist/src/components/steps/date/StepOneDateRangePicker.js.map +1 -1
  39. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRoomList.js +55 -58
  40. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRoomList.js.map +1 -1
  41. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.js +4 -3
  42. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.js.map +1 -1
  43. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js +4 -3
  44. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgressRow.js.map +1 -1
  45. package/dist/src/components/steps/room/roomDetails/AuxiliaryPickerModal/AuxiliaryPickerModal.d.ts +17 -0
  46. package/dist/src/components/steps/room/roomDetails/AuxiliaryPickerModal/AuxiliaryPickerModal.js +117 -0
  47. package/dist/src/components/steps/room/roomDetails/AuxiliaryPickerModal/AuxiliaryPickerModal.js.map +1 -0
  48. package/dist/src/components/steps/room/roomDetails/RoomDetails.d.ts +0 -1
  49. package/dist/src/components/steps/room/roomDetails/RoomDetails.js +9 -2
  50. package/dist/src/components/steps/room/roomDetails/RoomDetails.js.map +1 -1
  51. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateRow.d.ts +0 -1
  52. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateRow.js +1 -4
  53. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRateRow.js.map +1 -1
  54. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.d.ts +0 -1
  55. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.js +2 -11
  56. package/dist/src/components/steps/room/roomDetails/roomRates/RoomRates.js.map +1 -1
  57. package/dist/src/components/summary/BEMobileSummary.js +3 -2
  58. package/dist/src/components/summary/BEMobileSummary.js.map +1 -1
  59. package/dist/src/components/summary/BEMobileSummaryModal.js +3 -2
  60. package/dist/src/components/summary/BEMobileSummaryModal.js.map +1 -1
  61. package/dist/src/components/summary/BESummaryAddonRow.js +2 -1
  62. package/dist/src/components/summary/BESummaryAddonRow.js.map +1 -1
  63. package/dist/src/components/summary/BESummaryRoomRow.js +3 -2
  64. package/dist/src/components/summary/BESummaryRoomRow.js.map +1 -1
  65. package/dist/src/contexts/BasketContext/BasketContextType.d.ts +2 -1
  66. package/dist/src/contexts/BasketContext/BasketContextType.js.map +1 -1
  67. package/dist/src/contexts/BasketContext/BasketContextWrapper.js +9 -4
  68. package/dist/src/contexts/BasketContext/BasketContextWrapper.js.map +1 -1
  69. package/dist/src/contexts/BookingEngineContext/BookingEngineContextType.types.d.ts +14 -5
  70. package/dist/src/contexts/BookingEngineContext/BookingEngineContextType.types.js.map +1 -1
  71. package/dist/src/contexts/BookingEngineContext/BookingEngineContextWrapper.js.map +1 -1
  72. package/dist/src/contexts/HotelOverridesContext.js +4 -0
  73. package/dist/src/contexts/HotelOverridesContext.js.map +1 -1
  74. package/dist/src/hooks/AutoFocusOnSelect.d.ts +11 -1
  75. package/dist/src/hooks/AutoFocusOnSelect.js +7 -7
  76. package/dist/src/hooks/AutoFocusOnSelect.js.map +1 -1
  77. package/dist/src/hooks/index.d.ts +1 -0
  78. package/dist/src/hooks/index.js +1 -0
  79. package/dist/src/hooks/index.js.map +1 -1
  80. package/dist/src/hooks/useAreaAvailability.d.ts +10 -1
  81. package/dist/src/hooks/useAreaAvailability.js +67 -30
  82. package/dist/src/hooks/useAreaAvailability.js.map +1 -1
  83. package/dist/src/hooks/useAuxiliaryFilters.d.ts +8 -0
  84. package/dist/src/hooks/useAuxiliaryFilters.js +55 -0
  85. package/dist/src/hooks/useAuxiliaryFilters.js.map +1 -0
  86. package/dist/src/hooks/useGuestDateFormat.d.ts +11 -0
  87. package/dist/src/hooks/useGuestDateFormat.js +22 -0
  88. package/dist/src/hooks/useGuestDateFormat.js.map +1 -0
  89. package/dist/src/index.d.ts +1 -1
  90. package/dist/src/index.js +2 -1
  91. package/dist/src/index.js.map +1 -1
  92. package/dist/src/models/Api/HotelOverrideDTO.d.ts +1 -0
  93. package/dist/src/models/Api/HotelOverrideDTO.js.map +1 -1
  94. package/dist/src/models/BasketRow.d.ts +6 -11
  95. package/dist/src/models/BasketRow.js +4 -4
  96. package/dist/src/models/BasketRow.js.map +1 -1
  97. package/dist/src/pages/findReservation/ReservationRow.js +3 -2
  98. package/dist/src/pages/findReservation/ReservationRow.js.map +1 -1
  99. package/dist/src/pages/findReservation/ReservationRowModal.js +5 -4
  100. package/dist/src/pages/findReservation/ReservationRowModal.js.map +1 -1
  101. package/dist/src/pages/steps/StepDate/StepDateComponent.js +13 -7
  102. package/dist/src/pages/steps/StepDate/StepDateComponent.js.map +1 -1
  103. package/dist/src/providers/RoomstayThemeEngine.js +2 -0
  104. package/dist/src/providers/RoomstayThemeEngine.js.map +1 -1
  105. package/dist/src/providers/feature/StepDateNextButtonAboveDatepickerFeature.d.ts +13 -1
  106. package/dist/src/providers/feature/StepDateNextButtonAboveDatepickerFeature.js +20 -0
  107. package/dist/src/providers/feature/StepDateNextButtonAboveDatepickerFeature.js.map +1 -1
  108. package/dist/src/translations/Translation.d.ts +12 -0
  109. package/dist/src/translations/Translation.js +12 -0
  110. package/dist/src/translations/Translation.js.map +1 -1
  111. package/dist/src/translations/languages/en-gb.js +12 -0
  112. package/dist/src/translations/languages/en-gb.js.map +1 -1
  113. package/dist/test.bundle.js +1 -1
  114. package/dist/vendors.bundle.js +1 -1
  115. package/package.json +2 -2
  116. package/dist/422.bundle.js +0 -1
@@ -0,0 +1,17 @@
1
+ import { AuxiliaryFilterSelections } from '../../../../../contexts/index.js';
2
+ import React from 'react';
3
+ import { HotelRoomGroupsDTO } from '../../../../../models/Api/HotelDTO';
4
+ type GroupFilters = HotelRoomGroupsDTO[number]['filters'];
5
+ export interface AuxiliaryPickerModalProps {
6
+ open: boolean;
7
+ groupFilters: GroupFilters;
8
+ currentSelections: AuxiliaryFilterSelections;
9
+ showErrorInitially?: boolean;
10
+ /** Returns true if areas are available, false if not */
11
+ onUpdate: (selections: AuxiliaryFilterSelections) => Promise<boolean>;
12
+ /** Called with current local selections before closing, so they persist in the filter bar */
13
+ saveAuxiliaryFiltersSelections?: (selections: AuxiliaryFilterSelections) => void;
14
+ onClose: () => void;
15
+ }
16
+ export declare function AuxiliaryPickerModal({ open, groupFilters, currentSelections, showErrorInitially, onUpdate, saveAuxiliaryFiltersSelections, onClose, }: AuxiliaryPickerModalProps): React.JSX.Element;
17
+ export {};
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.AuxiliaryPickerModal = AuxiliaryPickerModal;
49
+ const ui_1 = require("@roomstay/ui");
50
+ const classnames_1 = __importDefault(require("classnames"));
51
+ const react_1 = __importStar(require("react"));
52
+ const react_i18next_1 = require("react-i18next");
53
+ const Alert_1 = __importStar(require("../../../../generic/Alert"));
54
+ const AuxiliaryFilterControls_1 = require("../../../../generic/AuxiliaryFilterControls/AuxiliaryFilterControls");
55
+ const BEButton_1 = __importDefault(require("../../../../generic/BEButton"));
56
+ const Headline_1 = __importDefault(require("../../../../generic/Headline"));
57
+ const SimpleModal_1 = __importStar(require("../../../../generic/modal/SimpleModal"));
58
+ const Text_1 = __importStar(require("../../../../generic/Text"));
59
+ const Translation_1 = require("../../../../../translations/Translation");
60
+ const Color_1 = require("../../../../../util/Color");
61
+ const AuxiliaryPickerModal_module_scss_1 = __importDefault(require("./AuxiliaryPickerModal.module.scss"));
62
+ function AuxiliaryPickerModal({ open, groupFilters, currentSelections, showErrorInitially = false, onUpdate, saveAuxiliaryFiltersSelections, onClose, }) {
63
+ const { t } = (0, react_i18next_1.useTranslation)();
64
+ const [localSelections, setLocalSelections] = (0, react_1.useState)(currentSelections);
65
+ const [showError, setShowError] = (0, react_1.useState)(showErrorInitially);
66
+ const [isChecking, setIsChecking] = (0, react_1.useState)(false);
67
+ (0, react_1.useEffect)(() => {
68
+ if (open) {
69
+ setLocalSelections(currentSelections);
70
+ setShowError(showErrorInitially);
71
+ }
72
+ }, [open]);
73
+ const groupFilterKeys = Object.keys(groupFilters !== null && groupFilters !== void 0 ? groupFilters : {});
74
+ const isAuxiliaryFiltersDirty = (0, react_1.useMemo)(() => groupFilterKeys.some((key) => { var _a, _b; return ((_a = localSelections[key]) !== null && _a !== void 0 ? _a : null) !== ((_b = currentSelections[key]) !== null && _b !== void 0 ? _b : null); }), [localSelections, currentSelections, groupFilterKeys]);
75
+ const onAuxiliaryFiltersSelectionChange = (filterKey, value) => {
76
+ setLocalSelections((prev) => (Object.assign(Object.assign({}, prev), { [filterKey]: value })));
77
+ };
78
+ const handleUpdate = () => __awaiter(this, void 0, void 0, function* () {
79
+ const hasUnselectedRequired = groupFilterKeys.some((key) => { var _a; return ((_a = groupFilters[key]) === null || _a === void 0 ? void 0 : _a.requireSelection) && !localSelections[key]; });
80
+ if (hasUnselectedRequired) {
81
+ setShowError(true);
82
+ return;
83
+ }
84
+ setIsChecking(true);
85
+ const available = yield onUpdate(localSelections);
86
+ setIsChecking(false);
87
+ if (available) {
88
+ onClose();
89
+ }
90
+ else {
91
+ setShowError(true);
92
+ }
93
+ });
94
+ const handleBackToList = () => {
95
+ saveAuxiliaryFiltersSelections === null || saveAuxiliaryFiltersSelections === void 0 ? void 0 : saveAuxiliaryFiltersSelections(localSelections);
96
+ onClose();
97
+ };
98
+ return (react_1.default.createElement(SimpleModal_1.default, { size: SimpleModal_1.SimpleModalSize.ExtraSmall, open: open, onClose: onClose, alignCenter: true, className: "auxiliary-picker-modal", bodyClassName: AuxiliaryPickerModal_module_scss_1.default['auxiliary-picker-modal-body'] },
99
+ react_1.default.createElement("div", { className: AuxiliaryPickerModal_module_scss_1.default['auxiliary-picker-modal-content'] },
100
+ react_1.default.createElement("div", { className: AuxiliaryPickerModal_module_scss_1.default.content },
101
+ !showError && (react_1.default.createElement("div", { className: "u-marg-bottom--light" },
102
+ react_1.default.createElement(ui_1.Icon, { icon: ui_1.IconType.Info, color: Color_1.Color.Accent, size: "16px" }))),
103
+ react_1.default.createElement("div", { className: "u-marg-bottom--light" },
104
+ react_1.default.createElement(Headline_1.default, null, t(Translation_1.Translation.Step.Room.AuxiliaryPickerModal.Title))),
105
+ react_1.default.createElement("div", { className: "u-marg-bottom" },
106
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Body }, t(Translation_1.Translation.Step.Room.AuxiliaryPickerModal.Body))),
107
+ showError && (react_1.default.createElement("div", { className: "u-marg-bottom" },
108
+ react_1.default.createElement(Alert_1.default, { type: Alert_1.AlertType.Accent1, icon: ui_1.IconType.Info, variant: Alert_1.AlertVariant.Outlined },
109
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Small }, t(Translation_1.Translation.Step.Room.AuxiliaryPickerModal.NoAvailabilityWarming))))),
110
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(AuxiliaryPickerModal_module_scss_1.default.controls, 'u-marg-bottom') },
111
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(AuxiliaryPickerModal_module_scss_1.default.dropdownsRow, 'u-flex-gap', { [AuxiliaryPickerModal_module_scss_1.default.dropdownsRowError]: showError }) },
112
+ react_1.default.createElement(AuxiliaryFilterControls_1.AuxiliaryFilterSelects, { groupFilters: groupFilters, values: localSelections, onChange: onAuxiliaryFiltersSelectionChange }),
113
+ showError && (react_1.default.createElement(BEButton_1.default, { size: "normal", isText: true, isLoading: isChecking, onClick: handleUpdate, textColor: Color_1.Color.Navy, className: "text-small", disabled: !isAuxiliaryFiltersDirty },
114
+ react_1.default.createElement("u", null, t(Translation_1.Translation.Step.Room.AuxiliaryPickerModal.Update))))),
115
+ showError ? (react_1.default.createElement(BEButton_1.default, { primary: true, filled: true, className: AuxiliaryPickerModal_module_scss_1.default.backToList, onClick: handleBackToList }, t(Translation_1.Translation.Step.Room.AuxiliaryPickerModal.BackToList))) : (react_1.default.createElement(BEButton_1.default, { primary: true, filled: true, className: AuxiliaryPickerModal_module_scss_1.default.updateBtn, isLoading: isChecking, onClick: handleUpdate, disabled: !isAuxiliaryFiltersDirty }, t(Translation_1.Translation.Step.Room.AuxiliaryPickerModal.Update))))))));
116
+ }
117
+ //# sourceMappingURL=AuxiliaryPickerModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuxiliaryPickerModal.js","sourceRoot":"/","sources":["src/components/steps/room/roomDetails/AuxiliaryPickerModal/AuxiliaryPickerModal.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,oDAsHC;AArJD,qCAA8C;AAC9C,4DAAoC;AACpC,+CAA4D;AAC5D,iDAA+C;AAE/C,oEAA4E;AAC5E,kHAA8G;AAC9G,6EAAqD;AACrD,6EAAqD;AACrD,sFAAsF;AACtF,kEAA2D;AAE3D,4DAAyD;AACzD,wCAAqC;AAErC,0GAAwD;AAgBxD,SAAgB,oBAAoB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,GAAG,KAAK,EAC1B,QAAQ,EACR,8BAA8B,EAC9B,OAAO,GACiB;IACxB,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAC/B,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,EAA4B,iBAAiB,CAAC,CAAC;IACrG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAC,kBAAkB,CAAC,CAAC;IAC/D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAEpD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,IAAI,IAAI,EAAE,CAAC;YACP,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;YACtC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACrC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,EAAE,CAAC,CAAC;IAExD,MAAM,uBAAuB,GAAG,IAAA,eAAO,EACnC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,eAAC,OAAA,CAAC,MAAA,eAAe,CAAC,GAAG,CAAC,mCAAI,IAAI,CAAC,KAAK,CAAC,MAAA,iBAAiB,CAAC,GAAG,CAAC,mCAAI,IAAI,CAAC,CAAA,EAAA,CAAC,EACxG,CAAC,eAAe,EAAE,iBAAiB,EAAE,eAAe,CAAC,CACxD,CAAC;IAEF,MAAM,iCAAiC,GAAG,CAAC,SAAiB,EAAE,KAAa,EAAE,EAAE;QAC3E,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iCAAM,IAAI,KAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAG,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAS,EAAE;QAC5B,MAAM,qBAAqB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,YAAY,CAAC,GAAG,CAAC,0CAAE,gBAAgB,KAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA,EAAA,CAAC,CAAC;QAC1H,IAAI,qBAAqB,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO;QACX,CAAC;QAED,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAC;QAClD,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACd,CAAC;aAAM,CAAC;YACJ,YAAY,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACL,CAAC,CAAA,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC1B,8BAA8B,aAA9B,8BAA8B,uBAA9B,8BAA8B,CAAG,eAAe,CAAC,CAAC;QAClD,OAAO,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,CACH,8BAAC,qBAAW,IACR,IAAI,EAAE,6BAAe,CAAC,UAAU,EAChC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,WAAW,QACX,SAAS,EAAC,wBAAwB,EAClC,aAAa,EAAE,0CAAM,CAAC,6BAA6B,CAAC;QAEpD,uCAAK,SAAS,EAAE,0CAAM,CAAC,gCAAgC,CAAC;YACpD,uCAAK,SAAS,EAAE,0CAAM,CAAC,OAAO;gBACzB,CAAC,SAAS,IAAI,CACX,uCAAK,SAAS,EAAC,sBAAsB;oBACjC,8BAAC,SAAI,IAAC,IAAI,EAAE,aAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,aAAK,CAAC,MAAM,EAAE,IAAI,EAAC,MAAM,GAAG,CAC5D,CACT;gBACD,uCAAK,SAAS,EAAC,sBAAsB;oBACjC,8BAAC,kBAAQ,QAAE,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAY,CACxE;gBACN,uCAAK,SAAS,EAAC,eAAe;oBAC1B,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,IAAI,IAAG,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAQ,CACpF;gBAEL,SAAS,IAAI,CACV,uCAAK,SAAS,EAAC,eAAe;oBAC1B,8BAAC,eAAK,IAAC,IAAI,EAAE,iBAAS,CAAC,OAAO,EAAE,IAAI,EAAE,aAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAY,CAAC,QAAQ;wBAC/E,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,IAAG,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAQ,CACpG,CACN,CACT;gBAED,uCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,0CAAM,CAAC,QAAQ,EAAE,eAAe,CAAC;oBACxD,uCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,0CAAM,CAAC,YAAY,EAAE,YAAY,EAAE,EAAE,CAAC,0CAAM,CAAC,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC;wBACpG,8BAAC,gDAAsB,IAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,iCAAiC,GAAI;wBAE3H,SAAS,IAAI,CACV,8BAAC,kBAAQ,IACL,IAAI,EAAC,QAAQ,EACb,MAAM,QACN,SAAS,EAAE,UAAU,EACrB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,aAAK,CAAC,IAAI,EACrB,SAAS,EAAC,YAAY,EACtB,QAAQ,EAAE,CAAC,uBAAuB;4BAElC,yCAAI,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAK,CACtD,CACd,CACC;oBAEL,SAAS,CAAC,CAAC,CAAC,CACT,8BAAC,kBAAQ,IAAC,OAAO,QAAC,MAAM,QAAC,SAAS,EAAE,0CAAM,CAAC,UAAU,EAAE,OAAO,EAAE,gBAAgB,IAC3E,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAClD,CACd,CAAC,CAAC,CAAC,CACA,8BAAC,kBAAQ,IAAC,OAAO,QAAC,MAAM,QAAC,SAAS,EAAE,0CAAM,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,uBAAuB,IACjI,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAC9C,CACd,CACC,CACJ,CACJ,CACI,CACjB,CAAC;AACN,CAAC","sourcesContent":["import { AuxiliaryFilterSelections } from '@frontend/contexts';\nimport { Icon, IconType } from '@roomstay/ui';\nimport classNames from 'classnames';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport Alert, { AlertType, AlertVariant } from '@/components/generic/Alert';\nimport { AuxiliaryFilterSelects } from '@/components/generic/AuxiliaryFilterControls/AuxiliaryFilterControls';\nimport BEButton from '@/components/generic/BEButton';\nimport Headline from '@/components/generic/Headline';\nimport SimpleModal, { SimpleModalSize } from '@/components/generic/modal/SimpleModal';\nimport Text, { TextType } from '@/components/generic/Text';\nimport { HotelRoomGroupsDTO } from '@/models/Api/HotelDTO';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\n\nimport styles from './AuxiliaryPickerModal.module.scss';\n\ntype GroupFilters = HotelRoomGroupsDTO[number]['filters'];\n\nexport interface AuxiliaryPickerModalProps {\n open: boolean;\n groupFilters: GroupFilters;\n currentSelections: AuxiliaryFilterSelections;\n showErrorInitially?: boolean;\n /** Returns true if areas are available, false if not */\n onUpdate: (selections: AuxiliaryFilterSelections) => Promise<boolean>;\n /** Called with current local selections before closing, so they persist in the filter bar */\n saveAuxiliaryFiltersSelections?: (selections: AuxiliaryFilterSelections) => void;\n onClose: () => void;\n}\n\nexport function AuxiliaryPickerModal({\n open,\n groupFilters,\n currentSelections,\n showErrorInitially = false,\n onUpdate,\n saveAuxiliaryFiltersSelections,\n onClose,\n}: AuxiliaryPickerModalProps) {\n const { t } = useTranslation();\n const [localSelections, setLocalSelections] = useState<AuxiliaryFilterSelections>(currentSelections);\n const [showError, setShowError] = useState(showErrorInitially);\n const [isChecking, setIsChecking] = useState(false);\n\n useEffect(() => {\n if (open) {\n setLocalSelections(currentSelections);\n setShowError(showErrorInitially);\n }\n }, [open]);\n\n const groupFilterKeys = Object.keys(groupFilters ?? {});\n\n const isAuxiliaryFiltersDirty = useMemo(\n () => groupFilterKeys.some((key) => (localSelections[key] ?? null) !== (currentSelections[key] ?? null)),\n [localSelections, currentSelections, groupFilterKeys]\n );\n\n const onAuxiliaryFiltersSelectionChange = (filterKey: string, value: string) => {\n setLocalSelections((prev) => ({ ...prev, [filterKey]: value }));\n };\n\n const handleUpdate = async () => {\n const hasUnselectedRequired = groupFilterKeys.some((key) => groupFilters[key]?.requireSelection && !localSelections[key]);\n if (hasUnselectedRequired) {\n setShowError(true);\n return;\n }\n\n setIsChecking(true);\n const available = await onUpdate(localSelections);\n setIsChecking(false);\n if (available) {\n onClose();\n } else {\n setShowError(true);\n }\n };\n\n const handleBackToList = () => {\n saveAuxiliaryFiltersSelections?.(localSelections);\n onClose();\n };\n\n return (\n <SimpleModal\n size={SimpleModalSize.ExtraSmall}\n open={open}\n onClose={onClose}\n alignCenter\n className=\"auxiliary-picker-modal\"\n bodyClassName={styles['auxiliary-picker-modal-body']}\n >\n <div className={styles['auxiliary-picker-modal-content']}>\n <div className={styles.content}>\n {!showError && (\n <div className=\"u-marg-bottom--light\">\n <Icon icon={IconType.Info} color={Color.Accent} size=\"16px\" />\n </div>\n )}\n <div className=\"u-marg-bottom--light\">\n <Headline>{t(Translation.Step.Room.AuxiliaryPickerModal.Title)}</Headline>\n </div>\n <div className=\"u-marg-bottom\">\n <Text type={TextType.Body}>{t(Translation.Step.Room.AuxiliaryPickerModal.Body)}</Text>\n </div>\n\n {showError && (\n <div className=\"u-marg-bottom\">\n <Alert type={AlertType.Accent1} icon={IconType.Info} variant={AlertVariant.Outlined}>\n <Text type={TextType.Small}>{t(Translation.Step.Room.AuxiliaryPickerModal.NoAvailabilityWarming)}</Text>\n </Alert>\n </div>\n )}\n\n <div className={classNames(styles.controls, 'u-marg-bottom')}>\n <div className={classNames(styles.dropdownsRow, 'u-flex-gap', { [styles.dropdownsRowError]: showError })}>\n <AuxiliaryFilterSelects groupFilters={groupFilters} values={localSelections} onChange={onAuxiliaryFiltersSelectionChange} />\n\n {showError && (\n <BEButton\n size=\"normal\"\n isText\n isLoading={isChecking}\n onClick={handleUpdate}\n textColor={Color.Navy}\n className=\"text-small\"\n disabled={!isAuxiliaryFiltersDirty}\n >\n <u>{t(Translation.Step.Room.AuxiliaryPickerModal.Update)}</u>\n </BEButton>\n )}\n </div>\n\n {showError ? (\n <BEButton primary filled className={styles.backToList} onClick={handleBackToList}>\n {t(Translation.Step.Room.AuxiliaryPickerModal.BackToList)}\n </BEButton>\n ) : (\n <BEButton primary filled className={styles.updateBtn} isLoading={isChecking} onClick={handleUpdate} disabled={!isAuxiliaryFiltersDirty}>\n {t(Translation.Step.Room.AuxiliaryPickerModal.Update)}\n </BEButton>\n )}\n </div>\n </div>\n </div>\n </SimpleModal>\n );\n}\n"]}
@@ -3,6 +3,5 @@ import { Room } from '../../../../models/Room/Room';
3
3
  export interface RoomDetailsProps {
4
4
  room: Room;
5
5
  disableMarginBottom?: boolean;
6
- bookNowButtonDisabledReason?: string;
7
6
  }
8
7
  export default function RoomDetails(props: RoomDetailsProps): React.JSX.Element;
@@ -52,6 +52,7 @@ const PlanpayPrice_1 = require("../../../generic/PlanpayPrice/PlanpayPrice");
52
52
  const TaxInclusionNotice_1 = require("../../../generic/TaxInclusionNotice/TaxInclusionNotice");
53
53
  const Text_1 = __importStar(require("../../../generic/Text"));
54
54
  const ImageGallerySlider_1 = __importDefault(require("../ImageGallerySlider"));
55
+ const AuxiliaryPickerModal_1 = require("./AuxiliaryPickerModal/AuxiliaryPickerModal");
55
56
  const RoomDetailsBedsBlock_1 = require("./RoomDetailsBedsBlock");
56
57
  const RoomDetailsPerkBlock_1 = require("./RoomDetailsPerkBlock");
57
58
  const RoomRatePills_1 = __importDefault(require("./roomRates/RoomRatePills"));
@@ -61,6 +62,7 @@ const RoomModal_1 = __importDefault(require("../RoomModal"));
61
62
  const Currency_2 = __importDefault(require("../../../../hooks/Currency"));
62
63
  const Planpay_1 = __importDefault(require("../../../../hooks/Planpay"));
63
64
  const useAreaAvailability_1 = require("../../../../hooks/useAreaAvailability");
65
+ const useAuxiliaryFilters_1 = require("../../../../hooks/useAuxiliaryFilters");
64
66
  const WindowSize_1 = require("../../../../hooks/WindowSize");
65
67
  const FeaturedPromoFeature_1 = __importDefault(require("../../../../providers/feature/FeaturedPromoFeature"));
66
68
  const ImageProvider_1 = require("../../../../providers/ImageProvider");
@@ -71,6 +73,7 @@ const DataLayer_1 = __importStar(require("../../../../util/DataLayer"));
71
73
  const ScreenSize_1 = __importDefault(require("../../../../util/ScreenSize"));
72
74
  const TextAlignment_1 = require("../../../../util/TextAlignment");
73
75
  function RoomDetails(props) {
76
+ var _a, _b;
74
77
  const { room } = props;
75
78
  const [featuredRates, setFeaturedRates] = (0, react_1.useState)([]);
76
79
  const [standardRates, setStandardRates] = (0, react_1.useState)([]);
@@ -82,7 +85,10 @@ function RoomDetails(props) {
82
85
  const ccx = (0, react_1.useContext)(contexts_1.CompanyContext);
83
86
  const { hotel } = (0, hooks_1.useCurrentHotel)();
84
87
  const hotelOverridesContext = (0, react_1.useContext)(contexts_1.HotelOverridesContext);
85
- const areaAvailability = (0, useAreaAvailability_1.useAreaAvailability)(room);
88
+ const roomGroup = (_a = hotel === null || hotel === void 0 ? void 0 : hotel.roomGroups) === null || _a === void 0 ? void 0 : _a.find((g) => g.id === room.roomGroupId);
89
+ const roomGroupFilters = (_b = roomGroup === null || roomGroup === void 0 ? void 0 : roomGroup.filters) !== null && _b !== void 0 ? _b : {};
90
+ const { applyAuxiliaryFilterSelections } = (0, useAuxiliaryFilters_1.useAuxiliaryFilters)();
91
+ const { handleBookNow, handleAuxiliaryUpdate, auxiliaryPickerOpen, auxiliaryPickerShowError, setAuxiliaryPickerOpen } = (0, useAreaAvailability_1.useAreaAvailability)(room, roomGroupFilters);
86
92
  const classes = (0, classnames_1.default)('room-details', {
87
93
  ['+is-open']: viewingRates,
88
94
  });
@@ -196,8 +202,9 @@ function RoomDetails(props) {
196
202
  !isLoading && hasPricePreview ? (react_1.default.createElement("div", { className: "u-marg-top--light" },
197
203
  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,
198
204
  react_1.default.createElement(BEButton_1.default, { className: "u-marg-top--light", name: "ViewRatesNowButton", primary: true, primaryActive: !!ratesOpen, filled: true, stopIconAnimation: true, icon: ratesOpen ? Icon_1.IconType.ArrowUp2 : Icon_1.IconType.ArrowDown2, iconPosition: "right", onClick: sendRoomClickOnClick, wide: context.screenSize <= ScreenSize_1.default.Large, textColor: (0, Color_1.getContrastTextColor)(ratesOpen ? hotel === null || hotel === void 0 ? void 0 : hotel.colors.accent3 : hotel === null || hotel === void 0 ? void 0 : hotel.colors.accent) }, ratesOpen ? t(Translation_1.Translation.Step.Room.RoomInfo.CloseRates) : t(Translation_1.Translation.Step.Room.RoomInfo.ViewRates))))),
199
- react_1.default.createElement(AutoAutoHeight_1.default, { open: !!ratesOpen }, room.isAvailable() && areaAvailability ? (react_1.default.createElement(RoomRates_1.default, { roomCode: room.code, rates: standardRates, featuredRates: featuredRates, bookNowButtonDisabledReason: props.bookNowButtonDisabledReason })) : (react_1.default.createElement(UnavailableRoom_1.default, { room: room, hideFindAvailableRooms: room.isAvailable() && !areaAvailability }))),
205
+ react_1.default.createElement(AutoAutoHeight_1.default, { open: !!ratesOpen }, room.isAvailable() ? (react_1.default.createElement(RoomRates_1.default, { roomCode: room.code, rates: standardRates, featuredRates: featuredRates, onAddToBasketOverride: (rate) => handleBookNow(rate) })) : (react_1.default.createElement(UnavailableRoom_1.default, { room: room }))),
200
206
  react_1.default.createElement(RoomModal_1.default, { open: viewingDescription, room: props.room, rates: standardRates, featuredRates: featuredRates, onClose: closeDescriptionOnClose }),
207
+ react_1.default.createElement(AuxiliaryPickerModal_1.AuxiliaryPickerModal, { open: auxiliaryPickerOpen, groupFilters: roomGroupFilters, currentSelections: context.currentGroupedRoomFilters, showErrorInitially: auxiliaryPickerShowError, onUpdate: handleAuxiliaryUpdate, saveAuxiliaryFiltersSelections: (selections) => applyAuxiliaryFilterSelections(selections, roomGroupFilters), onClose: () => setAuxiliaryPickerOpen(false) }),
201
208
  room.getRates().map((rate) => {
202
209
  return (react_1.default.createElement("script", { key: room.code + '-' + rate.code, type: "application/ld+json" }, JSON.stringify({
203
210
  '@context': 'http://schema.org/',
@@ -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, HotelOverridesContext } 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 { TaxInclusionNotice } from '@/components/generic/TaxInclusionNotice/TaxInclusionNotice';\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 UnavailableRoom from '@/components/steps/room/roomDetails/unavailableRoom/UnavailableRoom';\nimport RoomModal from '@/components/steps/room/RoomModal';\nimport useCurrency from '@/hooks/Currency';\nimport usePlanpay from '@/hooks/Planpay';\nimport { useAreaAvailability } from '@/hooks/useAreaAvailability';\nimport { useWindowSize } from '@/hooks/WindowSize';\nimport { HotelPerk } from '@/models/Client/Hotel/HotelPerk';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate } 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';\nimport { TextAlign } from '@/util/TextAlignment';\nexport interface RoomDetailsProps {\n room: Room;\n disableMarginBottom?: boolean;\n bookNowButtonDisabledReason?: string;\n}\n\nexport default function RoomDetails(props: RoomDetailsProps) {\n const { room } = props;\n\n const [featuredRates, setFeaturedRates] = useState<RoomRate[]>([]);\n const [standardRates, setStandardRates] = useState<RoomRate[]>([]);\n\n const [viewingRates, setViewingRates] = useState<boolean | number | null>(!room.isAvailable());\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 const hotelOverridesContext = useContext(HotelOverridesContext);\n const areaAvailability = useAreaAvailability(room);\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 const basketRow = basketContext.selectedBasketRow;\n if (!basketRow) {\n return;\n }\n\n DataLayer.instance.addRoomImpression(room, { to: basketRow.getStartDate(), from: basketRow.getEndDate() }, basketRow.getPromoCode());\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 } = useWindowSize();\n\n const ratesOpen = viewingRates || (context.screenSize <= ScreenSize.Medium && viewingRates === null && !hotel?.mobileDefaultRatesClosed);\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 const basketRow = basketContext.selectedBasketRow;\n\n if (basketRow) {\n DataLayer.instance.sendRoomClick(room, basketRow.getStartDate(), basketRow.getEndDate(), basketRow.getPromoCode());\n }\n }\n setViewingRates(!ratesOpen);\n };\n const closeDescriptionOnClose = () => {\n setViewingDescription(false);\n };\n\n const lowestRawPrice = room.getLowestPrice(false, true);\n const lowestDisplayPrice = hotelOverridesContext.alwaysShowDecimals ? lowestRawPrice : Math.round(lowestRawPrice);\n const currencySize = context.screenSize > ScreenSize.Medium && lowestDisplayPrice.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: lowestDisplayPrice,\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 {hotel?.perkTitle || t(Translation.Misc.Perks.AndYouGetAll)}\n </Text>\n </div>\n )}\n <RoomDetailsPerkBlock perks={roomPerks as HotelPerk[]} room={room} />\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 {room.isAvailable() && (\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>{lowestDisplayPrice}</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} className=\"u-nowrap\" align={isMobile ? TextAlign.Left : TextAlign.Right}>\n <TaxInclusionNotice room={room} />\n </Text>\n </div>\n )}\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 {room.isAvailable() && areaAvailability ? (\n <RoomRates roomCode={room.code as string} rates={standardRates} featuredRates={featuredRates} bookNowButtonDisabledReason={props.bookNowButtonDisabledReason} />\n ) : (\n <UnavailableRoom room={room} hideFindAvailableRooms={room.isAvailable() && !areaAvailability} />\n )}\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, HotelOverridesContext } 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 { TaxInclusionNotice } from '@/components/generic/TaxInclusionNotice/TaxInclusionNotice';\nimport Text, { TextType } from '@/components/generic/Text';\nimport ImageGallerySlider from '@/components/steps/room/ImageGallerySlider';\nimport { AuxiliaryPickerModal } from '@/components/steps/room/roomDetails/AuxiliaryPickerModal/AuxiliaryPickerModal';\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 UnavailableRoom from '@/components/steps/room/roomDetails/unavailableRoom/UnavailableRoom';\nimport RoomModal from '@/components/steps/room/RoomModal';\nimport useCurrency from '@/hooks/Currency';\nimport usePlanpay from '@/hooks/Planpay';\nimport { useAreaAvailability } from '@/hooks/useAreaAvailability';\nimport { useAuxiliaryFilters } from '@/hooks/useAuxiliaryFilters';\nimport { useWindowSize } from '@/hooks/WindowSize';\nimport { HotelPerk } from '@/models/Client/Hotel/HotelPerk';\nimport { Room } from '@/models/Room/Room';\nimport { RoomRate } 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';\nimport { TextAlign } from '@/util/TextAlignment';\nexport interface RoomDetailsProps {\n room: Room;\n disableMarginBottom?: boolean;\n}\n\nexport default function RoomDetails(props: RoomDetailsProps) {\n const { room } = props;\n\n const [featuredRates, setFeaturedRates] = useState<RoomRate[]>([]);\n const [standardRates, setStandardRates] = useState<RoomRate[]>([]);\n\n const [viewingRates, setViewingRates] = useState<boolean | number | null>(!room.isAvailable());\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 const hotelOverridesContext = useContext(HotelOverridesContext);\n\n const roomGroup = hotel?.roomGroups?.find((g) => g.id === room.roomGroupId);\n const roomGroupFilters = roomGroup?.filters ?? {};\n\n const { applyAuxiliaryFilterSelections } = useAuxiliaryFilters();\n const { handleBookNow, handleAuxiliaryUpdate, auxiliaryPickerOpen, auxiliaryPickerShowError, setAuxiliaryPickerOpen } = useAreaAvailability(room, roomGroupFilters);\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 const basketRow = basketContext.selectedBasketRow;\n if (!basketRow) {\n return;\n }\n\n DataLayer.instance.addRoomImpression(room, { to: basketRow.getStartDate(), from: basketRow.getEndDate() }, basketRow.getPromoCode());\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 } = useWindowSize();\n\n const ratesOpen = viewingRates || (context.screenSize <= ScreenSize.Medium && viewingRates === null && !hotel?.mobileDefaultRatesClosed);\n const moreDetailsOnClick = () => {\n DataLayer.instance.sendInteraction('More Room Details', InteractionType.LINK, InteractionStep.ROOMS);\n setViewingDescription(true);\n };\n\n const sendRoomClickOnClick = () => {\n if (!ratesOpen) {\n const basketRow = basketContext.selectedBasketRow;\n\n if (basketRow) {\n DataLayer.instance.sendRoomClick(room, basketRow.getStartDate(), basketRow.getEndDate(), basketRow.getPromoCode());\n }\n }\n setViewingRates(!ratesOpen);\n };\n const closeDescriptionOnClose = () => {\n setViewingDescription(false);\n };\n\n const lowestRawPrice = room.getLowestPrice(false, true);\n const lowestDisplayPrice = hotelOverridesContext.alwaysShowDecimals ? lowestRawPrice : Math.round(lowestRawPrice);\n const currencySize = context.screenSize > ScreenSize.Medium && lowestDisplayPrice.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: lowestDisplayPrice,\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 {hotel?.perkTitle || t(Translation.Misc.Perks.AndYouGetAll)}\n </Text>\n </div>\n )}\n <RoomDetailsPerkBlock perks={roomPerks as HotelPerk[]} room={room} />\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 {room.isAvailable() && (\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>{lowestDisplayPrice}</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} className=\"u-nowrap\" align={isMobile ? TextAlign.Left : TextAlign.Right}>\n <TaxInclusionNotice room={room} />\n </Text>\n </div>\n )}\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 {room.isAvailable() ? (\n <RoomRates roomCode={room.code as string} rates={standardRates} featuredRates={featuredRates} onAddToBasketOverride={(rate) => handleBookNow(rate)} />\n ) : (\n <UnavailableRoom room={room} />\n )}\n </AutoAutoHeight>\n <RoomModal open={viewingDescription} room={props.room} rates={standardRates} featuredRates={featuredRates} onClose={closeDescriptionOnClose} />\n <AuxiliaryPickerModal\n open={auxiliaryPickerOpen}\n groupFilters={roomGroupFilters}\n currentSelections={context.currentGroupedRoomFilters}\n showErrorInitially={auxiliaryPickerShowError}\n onUpdate={handleAuxiliaryUpdate}\n saveAuxiliaryFiltersSelections={(selections) => applyAuxiliaryFilterSelections(selections, roomGroupFilters)}\n onClose={() => setAuxiliaryPickerOpen(false)}\n />\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"]}
@@ -7,6 +7,5 @@ export interface RoomRateRowProps extends Pick<InlineRoomMiniEngineConfig, 'poli
7
7
  onAddToBasketOverride?: (rate: RoomRate) => void;
8
8
  isPromoRate?: boolean;
9
9
  isCardLayout?: boolean;
10
- bookNowButtonDisabledReason?: string;
11
10
  }
12
11
  export default function RoomRateRow(props: RoomRateRowProps): React.JSX.Element;
@@ -109,9 +109,6 @@ function RoomRateRow(props) {
109
109
  if (isRoomSelectedAndEditing) {
110
110
  bookNowLabel = isThisSelectedRow ? t(Translation_1.Translation.Step.Room.RoomInfo.Selected) : (bookNowLabel = t(Translation_1.Translation.Step.Room.RoomInfo.Update));
111
111
  }
112
- else if (props.bookNowButtonDisabledReason) {
113
- bookNowLabel = props.bookNowButtonDisabledReason;
114
- }
115
112
  else {
116
113
  bookNowLabel = t(Translation_1.Translation.Misc.BookNow);
117
114
  }
@@ -208,7 +205,7 @@ function RoomRateRow(props) {
208
205
  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,
209
206
  react_1.default.createElement("div", { className: (0, classnames_1.default)('u-marg-top--light', {
210
207
  [RoomRateRow_module_scss_1.default['room-rate-row-booknow-button']]: isCardLayout,
211
- }) }, 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, disabled: !!props.bookNowButtonDisabledReason }))))),
208
+ }) }, 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 }))))),
212
209
  react_1.default.createElement(RoomRateDetailsAndPriceBreakdownModal_1.default, { isOpen: viewingModal.open, currentTab: viewingModal.currentTab, rate: props.rate, getButtonLabel: props.getButtonLabel, onAddToBasketOverride: props.onAddToBasketOverride, onClose: updateModalOnClose })));
213
210
  }
214
211
  //# sourceMappingURL=RoomRateRow.js.map
@@ -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, BookingEngineContext, CompanyContext } 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 { TaxInclusionNotice } from '@/components/generic/TaxInclusionNotice/TaxInclusionNotice';\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 } 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 bookNowButtonDisabledReason?: string;\n}\n\nexport default function RoomRateRow(props: RoomRateRowProps) {\n const ccx = useContext(CompanyContext);\n const basketContext = useContext(BasketContext);\n const { roomRateCalendarInteractivity, setRoomRateCalendarInteractivity } = useContext(BookingEngineContext);\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 if (props.bookNowButtonDisabledReason) {\n bookNowLabel = props.bookNowButtonDisabledReason;\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 useEffect(() => {\n const roomCode = props.rate.getRoom().code;\n if (roomRateCalendarInteractivity?.roomCode === roomCode && props.rate.code === roomRateCalendarInteractivity?.rateCode) {\n //Provided the API response still includes that rate => still open the modal\n openTab(RoomRateDetailsAndPriceBreakdownModalTabs.RoomDetails);\n }\n }, [props.rate, roomRateCalendarInteractivity]);\n\n const updateModalOnClose = () => {\n // Clear the modal state\n setRoomRateCalendarInteractivity(null);\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 <TaxInclusionNotice rate={rate} />\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\n rate={rate}\n buttonLabel={bookNowLabel}\n onAddToBasketOverride={props.onAddToBasketOverride}\n isFilled={!isThisSelectedRow}\n disabled={!!props.bookNowButtonDisabledReason}\n />\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,8BA4QC;AApTD,iDAAyF;AACzF,2CAAkD;AAClD,4DAAoC;AACpC,+CAAuE;AACvE,iDAA+C;AAC/C,0DAAuD;AAEvD,6EAAqD;AACrD,uEAAgE;AAChE,kEAA2D;AAC3D,iFAA8E;AAC9E,mGAAgG;AAChG,kEAA2D;AAC3D,sHAA8F;AAC9F,gHAAwF;AACxF,6JAE6F;AAC7F,gHAAwF;AAExF,gEAA2C;AAC3C,8DAAyC;AACzC,2DAAwD;AACxD,mDAAmD;AAEnD,wCAAqC;AACrC,8DAA+E;AAC/E,wDAAiD;AAEjD,wFAA+C;AAW/C,SAAwB,WAAW,CAAC,KAAuB;;IACvD,MAAM,GAAG,GAAG,IAAA,kBAAU,EAAC,yBAAc,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAA,kBAAU,EAAC,wBAAa,CAAC,CAAC;IAChD,MAAM,EAAE,6BAA6B,EAAE,gCAAgC,EAAE,GAAG,IAAA,kBAAU,EAAC,+BAAoB,CAAC,CAAC;IAE7G,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAC;QAC7C,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,iFAAyC,CAAC,WAAW;KACpE,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAC/B,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAA,uBAAe,GAAE,CAAC;IACjD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,0BAAa,GAAE,CAAC;IACrC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IACrC,MAAM,WAAW,GAAG,aAAa,CAAC,iBAAiB,CAAC;IACpD,MAAM,wBAAwB,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,OAAO,EAAE,CAAC;IAExD,MAAM,iBAAiB,GAAG,WAAW,IAAI,IAAI,CAAC,IAAI,MAAK,MAAA,WAAW,CAAC,OAAO,EAAE,0CAAE,IAAI,CAAA,IAAI,CAAA,MAAA,IAAI,CAAC,OAAO,EAAE,0CAAE,IAAI,OAAK,MAAA,WAAW,CAAC,OAAO,EAAE,0CAAE,IAAI,CAAA,CAAC;IAE3I,MAAM,UAAU,GAAG,IAAA,cAAM,EAAwB,IAAI,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,WAAW,EAAE;QACpC,WAAW,EAAE,CAAC,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,YAAY;QAC7B,WAAW,EAAE,iBAAiB,IAAI,wBAAwB;QAC1D,YAAY,EAAE,KAAK,CAAC,WAAW;KAClC,CAAC,CAAC;IAEH,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACzC,QAAQ,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,aAAa,CAAC,iBAAiB,CAAC;YAClD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,OAAO;YACX,CAAC;YAED,mBAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7J,CAAC;IACL,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAExB,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAA,+BAAc,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,CAAC,GAA8C,EAAE,EAAE;QAC/D,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC;IAEF,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;IACrF,CAAC;SAAM,CAAC;QACJ,IAAI,wBAAwB,EAAE,CAAC;YAC3B,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9I,CAAC;aAAM,CAAC;YACJ,YAAY,GAAG,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,MAAM,4BAA4B,GAAG,GAAG,EAAE;QACtC,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,qBAAqB,EAAE,2BAAe,CAAC,IAAI,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QACvG,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC5B,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,mBAAmB,EAAE,2BAAe,CAAC,IAAI,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QACrG,OAAO,CAAC,iFAAyC,CAAC,WAAW,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;QAC3C,IAAI,CAAA,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,QAAQ,MAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,MAAK,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,QAAQ,CAAA,EAAE,CAAC;YACtH,4EAA4E;YAC5E,OAAO,CAAC,iFAAyC,CAAC,WAAW,CAAC,CAAC;QACnE,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAEhD,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC5B,wBAAwB;QACxB,gCAAgC,CAAC,IAAI,CAAC,CAAC;QACvC,eAAe,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;YACjB,yBAAY,GAAG,EAAG;QACtB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,GAAG,EAAE;QACxB,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,2BAAe,CAAC,IAAI,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QAClG,OAAO,CAAC,iFAAyC,CAAC,cAAc,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,kBAAkB,IAAI,CAAC,CAAC,iBAAiB,IAAI,wBAAwB,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IACvH,MAAM,WAAW,GAAG,CAAC,KAAK,GAAG,aAAK,CAAC,QAAQ,EAAE,EAAE;QAC3C,OAAO,iBAAiB,CAAC,CAAC,CAAC,aAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAA,kBAAW,EAAC;QAC5C,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;KACvC,CAAC,CAAC;IAEH,MAAM,EAAE,eAAe,EAAE,GAAG,IAAA,iBAAU,GAAE,CAAC;IAEzC,MAAM,4BAA4B,GAAG,GAAG,EAAE,CAAC,CACvC,uCAAK,SAAS,EAAC,yDAAyD;QACpE,8BAAC,+BAAqB,IAClB,QAAQ,EAAE,QAAQ,EAClB,kBAAkB,EAAE,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAC5D,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EACxC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,EACrC,YAAY,EAAE,iBAAiB,GACjC;QACF,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,aAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,yBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAS,CAAC,KAAK;YAC9G,8BAAC,uCAAkB,IAAC,IAAI,EAAE,IAAI,GAAI,CAC/B,CACL,CACT,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACnB,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,CACH,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,aAAK,CAAC,OAAO;gBAC3C,8CAAS,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAU,CAChE,CACV,CAAC;QACN,CAAC;QACD,OAAO,CACH,uCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,iCAAM,CAAC,wBAAwB,CAAC,CAAC;YACvD,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,CAAC,CAAC,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,IAAI,GAAI,CAAC,CAAC,CAAC,IAAI;YACzE,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,UAChD,QAAQ,CACN,CACL,CACT,CAAC;IACN,CAAC,CAAC;IAEF,OAAO,CACH,uCAAK,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU;QACpC,uCAAK,SAAS,EAAC,KAAK;YAChB,uCACI,SAAS,EAAE,IAAA,oBAAU,EAAC;oBAClB,UAAU,EAAE,eAAe,IAAI,CAAC,YAAY;oBAC5C,UAAU,EAAE,CAAC,eAAe,IAAI,CAAC,YAAY;oBAC7C,WAAW,EAAE,YAAY;iBAC5B,CAAC;gBAEF,uCAAK,SAAS,EAAC,0BAA0B;oBACrC;wBACI,uCAAK,SAAS,EAAC,oBAAoB;4BAC/B,8BAAC,SAAS,OAAG,CACX;wBACN,uCAAK,SAAS,EAAC,6DAA6D,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;4BACxG,uCAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,gBAAgB,aAAhB,gBAAgB,cAAhB,gBAAgB,GAAI,EAAE,EAAE,GAAI,CAClE;wBACL,QAAQ,IAAI,CACT,uCAAK,SAAS,EAAC,QAAQ;4BACnB,wCAAM,OAAO,EAAE,4BAA4B;gCACvC,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,eAAQ,CAAC,OAAO,IAC7C,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC3C,CACJ,CACL,CACT;wBACA,CAAC,YAAY,CAAC,CAAC,CAAC,8BAAC,uBAAa,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,eAAe,SAAG,CAAC,CAAC,CAAC,IAAI,CACzE;oBAEL,YAAY,CAAC,CAAC,CAAC,CACZ,uCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,iCAAM,CAAC,2BAA2B,CAAC,CAAC;wBAC1D,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CACZ,uCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,iCAAM,CAAC,0BAA0B,CAAC,CAAC;4BAC1D,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,IAAI,GAAI;4BAC7B,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,aAAK,CAAC,QAAQ,IAC5C,KAAK,CAAC,MAAM,CACV,CACL,CACT,CAAC,CAAC,CAAC,IAAI;wBACR,uCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,iCAAM,CAAC,uBAAuB,CAAC,CAAC;4BACtD,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CACtB,uCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,iCAAM,CAAC,yBAAyB,CAAC,CAAC;gCACzD,8BAAC,cAAI,IAAC,IAAI,EAAE,eAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,aAAK,CAAC,MAAM,IAC1C,KAAK,CAAC,gBAAgB,CACpB,CACL,CACT,CAAC,CAAC,CAAC,IAAI;4BACR,uCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,iCAAM,CAAC,wBAAwB,CAAC,CAAC;gCACxD,8BAAC,4BAA4B,OAAG,CAC9B,CACJ,CACJ,CACT,CAAC,CAAC,CAAC,IAAI;oBAER,uCACI,SAAS,EAAE,IAAA,oBAAU,EAAC,mFAAmF,EAAE;4BACvG,CAAC,iCAAM,CAAC,iCAAiC,CAAC,CAAC,EAAE,YAAY;yBAC5D,CAAC;wBAEF,uCAAK,SAAS,EAAC,4BAA4B;4BACvC,8BAAC,kBAAQ,IACL,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAQ,CAAC,WAAW,EACrD,MAAM,QACN,OAAO,QACP,IAAI,EAAC,OAAO,EACZ,YAAY,EAAC,OAAO,EACpB,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,aAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,aAAK,CAAC,MAAM,CAAC,IAEjE,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC3B,CACT;wBACN,8BAAC,kBAAQ,IACL,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAQ,CAAC,WAAW,EACrD,MAAM,QACN,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,aAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,aAAK,CAAC,IAAI,CAAC,EAChE,IAAI,EAAC,OAAO,EACZ,YAAY,EAAC,OAAO,EACpB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,QAAQ,IAEjB,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAC9C,CACT,CACJ,CACJ;YACN,uCACI,SAAS,EAAE,IAAA,oBAAU,EACjB;oBACI,UAAU,EAAE,eAAe,IAAI,CAAC,YAAY;oBAC5C,UAAU,EAAE,CAAC,eAAe,IAAI,CAAC,YAAY;oBAC7C,WAAW,EAAE,YAAY;iBAC5B,EACD,oGAAoG,CACvG;gBAEA,CAAC,YAAY,CAAC,CAAC,CAAC,8BAAC,4BAA4B,OAAG,CAAC,CAAC,CAAC,IAAI;gBACvD,CAAC,SAAS,IAAI,eAAe,CAAC,CAAC,CAAC,CAC7B,uCAAK,SAAS,EAAC,mBAAmB;oBAC9B,8BAAC,2BAAY,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,EAAE,KAAI,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,eAAe,GAAI,CACjJ,CACT,CAAC,CAAC,CAAC,IAAI;gBACR,uCACI,SAAS,EAAE,IAAA,oBAAU,EAAC,mBAAmB,EAAE;wBACvC,CAAC,iCAAM,CAAC,8BAA8B,CAAC,CAAC,EAAE,YAAY;qBACzD,CAAC,IAED,QAAQ,CAAC,CAAC,CAAC,CACR,8BAAC,kBAAQ,IAAC,MAAM,QAAC,OAAO,QAAC,IAAI,QAAC,OAAO,EAAE,4BAA4B,IAC9D,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CACvC,CACd,CAAC,CAAC,CAAC,CACA,8BAAC,uBAAa,IAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,QAAQ,EAAE,CAAC,iBAAiB,GAAI,CAC7I,CACC,CACJ,CACJ;QACN,8BAAC,+CAAqC,IAClC,MAAM,EAAE,YAAY,CAAC,IAAI,EACzB,UAAU,EAAE,YAAY,CAAC,UAAU,EACnC,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,cAAc,EAAE,KAAK,CAAC,cAAc,EACpC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAClD,OAAO,EAAE,kBAAkB,GAC7B,CACA,CACT,CAAC;AACN,CAAC","sourcesContent":["import { BasketContext, BookingEngineContext, CompanyContext } 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 { TaxInclusionNotice } from '@/components/generic/TaxInclusionNotice/TaxInclusionNotice';\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 } 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 { roomRateCalendarInteractivity, setRoomRateCalendarInteractivity } = useContext(BookingEngineContext);\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 useEffect(() => {\n const roomCode = props.rate.getRoom().code;\n if (roomRateCalendarInteractivity?.roomCode === roomCode && props.rate.code === roomRateCalendarInteractivity?.rateCode) {\n //Provided the API response still includes that rate => still open the modal\n openTab(RoomRateDetailsAndPriceBreakdownModalTabs.RoomDetails);\n }\n }, [props.rate, roomRateCalendarInteractivity]);\n\n const updateModalOnClose = () => {\n // Clear the modal state\n setRoomRateCalendarInteractivity(null);\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 <TaxInclusionNotice rate={rate} />\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"]}
@@ -10,6 +10,5 @@ export interface RoomRatesProps extends Pick<InlineRoomMiniEngineConfig, 'policy
10
10
  getButtonLabel?: (isRoomSelectedAndEditing: boolean, isThisSelectedRow: boolean) => string;
11
11
  onAddToBasketOverride?: (rate: RoomRate) => void;
12
12
  isCardLayout?: boolean;
13
- bookNowButtonDisabledReason?: string;
14
13
  }
15
14
  export default function RoomRates(props: RoomRatesProps): React.JSX.Element;
@@ -102,7 +102,7 @@ function RoomRates(props) {
102
102
  if (RoomRateReadMoreVersionFeature_1.default.isActive()) {
103
103
  return (react_1.default.createElement(ReadMoreRoomRateRow_1.default, { key: rate.name, rate: rate, getButtonLabel: props.getButtonLabel, onAddToBasketOverride: props.onAddToBasketOverride, isPromoRate: isPromo }));
104
104
  }
105
- 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, bookNowButtonDisabledReason: props.bookNowButtonDisabledReason }));
105
+ 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 }));
106
106
  };
107
107
  const maxRows = hasFeaturedRates && !showingMoreOpen ? featuredRates.length : numOfRatesToShowFirst;
108
108
  let rowsLeftToOpen = 0;
@@ -149,15 +149,6 @@ function RoomRates(props) {
149
149
  rowsLeftToOpen,
150
150
  " ",
151
151
  t(Translation_1.Translation.Step.Room.RoomInfo.MoreRates))))));
152
- }, [
153
- props.featuredRates,
154
- rates,
155
- beContext.currentRoomSort,
156
- beContext.currentRoomRateSort,
157
- showingMoreOpen,
158
- basketContext === null || basketContext === void 0 ? void 0 : basketContext.loadedPromotion,
159
- hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyRenderRateLast,
160
- props.bookNowButtonDisabledReason,
161
- ]);
152
+ }, [props.featuredRates, rates, beContext.currentRoomSort, beContext.currentRoomRateSort, showingMoreOpen, basketContext === null || basketContext === void 0 ? void 0 : basketContext.loadedPromotion, hotel === null || hotel === void 0 ? void 0 : hotel.memberOnlyRenderRateLast]);
162
153
  }
163
154
  //# sourceMappingURL=RoomRates.js.map