@roomstay/frontend 2.2.5 → 2.3.0-1

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 (125) hide show
  1. package/dist/115.bundle.js +1 -0
  2. package/dist/151.bundle.js +1 -0
  3. package/dist/201.bundle.js +1 -0
  4. package/dist/213.bundle.js +1 -0
  5. package/dist/279.bundle.js +1 -0
  6. package/dist/370.bundle.js +1 -0
  7. package/dist/387.bundle.js +1 -0
  8. package/dist/423.bundle.js +1 -0
  9. package/dist/446.bundle.js +1 -0
  10. package/dist/449.bundle.js +1 -0
  11. package/dist/535.bundle.js +2 -0
  12. package/dist/535.bundle.js.LICENSE.txt +30 -0
  13. package/dist/572.bundle.js +1 -0
  14. package/dist/619.bundle.js +1 -0
  15. package/dist/625.bundle.js +1 -0
  16. package/dist/686.bundle.js +1 -0
  17. package/dist/815.bundle.js +1 -0
  18. package/dist/855.bundle.js +1 -0
  19. package/dist/873.bundle.js +1 -0
  20. package/dist/903.bundle.js +1 -0
  21. package/dist/972.bundle.js +1 -0
  22. package/dist/975.bundle.js +1 -0
  23. package/dist/main.bundle.js +1 -0
  24. package/dist/src/components/generic/Tabs/TabContext.js.map +1 -1
  25. package/dist/src/components/generic/Tabs/TabLink.js +10 -7
  26. package/dist/src/components/generic/Tabs/TabLink.js.map +1 -1
  27. package/dist/src/components/generic/Tabs/TabRouteContainer.js +3 -1
  28. package/dist/src/components/generic/Tabs/TabRouteContainer.js.map +1 -1
  29. package/dist/src/components/generic/Tabs/Tabs.d.ts +1 -0
  30. package/dist/src/components/generic/Tabs/Tabs.js +2 -11
  31. package/dist/src/components/generic/Tabs/Tabs.js.map +1 -1
  32. package/dist/src/components/generic/Tooltip/Tooltip.d.ts +2 -0
  33. package/dist/src/components/generic/Tooltip/Tooltip.js +2 -2
  34. package/dist/src/components/generic/Tooltip/Tooltip.js.map +1 -1
  35. package/dist/src/components/steps/room/RoomList.js +2 -119
  36. package/dist/src/components/steps/room/RoomList.js.map +1 -1
  37. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRoomList.d.ts +8 -0
  38. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRoomList.js +97 -0
  39. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRoomList.js.map +1 -0
  40. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRooms.d.ts +1 -0
  41. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRooms.js +107 -0
  42. package/dist/src/components/steps/room/TabGroupedRooms/TabGroupedRooms.js.map +1 -0
  43. package/dist/src/components/steps/room/TripteaseLodgingSearchSchema.d.ts +1 -0
  44. package/dist/src/components/steps/room/TripteaseLodgingSearchSchema.js +43 -0
  45. package/dist/src/components/steps/room/TripteaseLodgingSearchSchema.js.map +1 -0
  46. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummary.d.ts +1 -0
  47. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummary.js +56 -0
  48. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummary.js.map +1 -0
  49. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryPromocodeInput.d.ts +8 -0
  50. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryPromocodeInput.js +90 -0
  51. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryPromocodeInput.js.map +1 -0
  52. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.d.ts +7 -0
  53. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.js +172 -0
  54. package/dist/src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.js.map +1 -0
  55. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgress.js +2 -10
  56. package/dist/src/components/steps/room/roomBuilderProgress/RoomBuilderProgress.js.map +1 -1
  57. package/dist/src/components/steps/room/roomDetails/RoomDetails.js +1 -2
  58. package/dist/src/components/steps/room/roomDetails/RoomDetails.js.map +1 -1
  59. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +1 -0
  60. package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
  61. package/dist/src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.js +2 -1
  62. package/dist/src/contexts/FullPageEngineContext/FullPageEngineContextWrapper.js.map +1 -1
  63. package/dist/src/hooks/RoomRateAvailabilityListFromApi.d.ts +8 -0
  64. package/dist/src/hooks/RoomRateAvailabilityListFromApi.js +133 -0
  65. package/dist/src/hooks/RoomRateAvailabilityListFromApi.js.map +1 -0
  66. package/dist/src/index.d.ts +1 -0
  67. package/dist/src/index.js +3 -1
  68. package/dist/src/index.js.map +1 -1
  69. package/dist/src/models/Api/HotelDTO.d.ts +14 -0
  70. package/dist/src/models/Api/HotelDTO.js.map +1 -1
  71. package/dist/src/models/Client/Hotel/Hotel.d.ts +2 -1
  72. package/dist/src/models/Client/Hotel/Hotel.js.map +1 -1
  73. package/dist/src/models/Room/Room.d.ts +8 -0
  74. package/dist/src/models/Room/Room.js +6 -0
  75. package/dist/src/models/Room/Room.js.map +1 -1
  76. package/dist/src/pages/hotel/HotelInfo.js +4 -4
  77. package/dist/src/pages/hotel/HotelInfo.js.map +1 -1
  78. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoom.d.ts +15 -0
  79. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoom.js +30 -0
  80. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoom.js.map +1 -0
  81. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomComponent.d.ts +2 -0
  82. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomComponent.js +69 -0
  83. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomComponent.js.map +1 -0
  84. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomLoader.d.ts +1 -0
  85. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomLoader.js +109 -0
  86. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomLoader.js.map +1 -0
  87. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomValidator.d.ts +3 -0
  88. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomValidator.js +10 -0
  89. package/dist/src/pages/steps/StepGroupedRoom/StepGroupedRoomValidator.js.map +1 -0
  90. package/dist/src/stories/BookingWizard.stories.js +2 -2
  91. package/dist/src/stories/BookingWizard.stories.js.map +1 -1
  92. package/dist/src/translations/Translation.d.ts +0 -4
  93. package/dist/src/translations/Translation.js +0 -4
  94. package/dist/src/translations/Translation.js.map +1 -1
  95. package/dist/src/translations/languages/en-gb.js +0 -4
  96. package/dist/src/translations/languages/en-gb.js.map +1 -1
  97. package/dist/src/util/DataLayer.js +1 -1
  98. package/dist/src/util/DataLayer.js.map +1 -1
  99. package/dist/test.bundle.js +1 -0
  100. package/dist/tests/offline/entry/{OfflineEngineDefaults.js → RSCompany.js} +52 -6
  101. package/dist/tests/offline/entry/RSCompany.js.map +1 -0
  102. package/dist/tests/offline/entry/ReactWrapper.d.ts +1 -0
  103. package/dist/tests/offline/entry/{OfflineEngineWrapper.js → ReactWrapper.js} +21 -14
  104. package/dist/tests/offline/entry/ReactWrapper.js.map +1 -0
  105. package/dist/tests/offline/entry/{offline-entry.js → allEngines.js} +3 -3
  106. package/dist/tests/offline/entry/allEngines.js.map +1 -0
  107. package/dist/tests/offline/entry/components/TestPicker.js +2 -61
  108. package/dist/tests/offline/entry/components/TestPicker.js.map +1 -1
  109. package/dist/tests/offline/entry/engineRenderer/memberPortalWidgetRenderer.js +2 -2
  110. package/dist/tests/offline/entry/engineRenderer/memberPortalWidgetRenderer.js.map +1 -1
  111. package/dist/vendors.bundle.js +2 -0
  112. package/dist/vendors.bundle.js.LICENSE.txt +80 -0
  113. package/package.json +2 -2
  114. package/dist/src/components/generic/Select.d.ts +0 -0
  115. package/dist/src/components/generic/Select.js +0 -2
  116. package/dist/src/components/generic/Select.js.map +0 -1
  117. package/dist/tests/offline/entry/OfflineEngineDefaults.js.map +0 -1
  118. package/dist/tests/offline/entry/OfflineEngineWrapper.d.ts +0 -1
  119. package/dist/tests/offline/entry/OfflineEngineWrapper.js.map +0 -1
  120. package/dist/tests/offline/entry/offline-entry.js.map +0 -1
  121. package/dist/tests/offline/entry/pages/Inline/index.d.ts +0 -4
  122. package/dist/tests/offline/entry/pages/Inline/index.js +0 -96
  123. package/dist/tests/offline/entry/pages/Inline/index.js.map +0 -1
  124. /package/dist/tests/offline/entry/{OfflineEngineDefaults.d.ts → RSCompany.d.ts} +0 -0
  125. /package/dist/tests/offline/entry/{offline-entry.d.ts → allEngines.d.ts} +0 -0
@@ -0,0 +1,107 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.TabGroupedRooms = void 0;
30
+ const Tab_1 = require("../../../generic/Tabs/Tab");
31
+ const Tabs_1 = __importDefault(require("../../../generic/Tabs/Tabs"));
32
+ const RoomRateAvailabilityListFromApi_1 = require("../../../../hooks/RoomRateAvailabilityListFromApi");
33
+ const StepGroupedRoom_1 = __importDefault(require("../../../../pages/steps/StepGroupedRoom/StepGroupedRoom"));
34
+ const hooks_1 = require("../../../../hooks/index.js");
35
+ const react_1 = __importStar(require("react"));
36
+ const TabGroupedRoomList_1 = require("./TabGroupedRoomList");
37
+ const LargeLoader_1 = __importDefault(require("../../../generic/loader/LargeLoader"));
38
+ const Query_1 = require("../../../../hooks/Query");
39
+ const DataLayer_1 = __importDefault(require("../../../../util/DataLayer"));
40
+ const NoRoomsFoundBlock_1 = __importDefault(require("../NoRoomsFoundBlock"));
41
+ const RoomListCrossSellBlock_1 = __importDefault(require("../RoomListCrossSellBlock"));
42
+ const StepRoomErrorForm_1 = require("../StepRoomErrorForm");
43
+ const TabGroupedRooms = () => {
44
+ var _a;
45
+ const { hotel } = (0, hooks_1.useCurrentHotel)();
46
+ const { rooms, isLoading, openRoom, apiHasError } = (0, RoomRateAvailabilityListFromApi_1.useRoomRateAvailabilityListFromApi)();
47
+ const params = (0, Query_1.useHashQuery)();
48
+ const groupedRooms = (0, react_1.useMemo)(() => {
49
+ if (!(hotel === null || hotel === void 0 ? void 0 : hotel.roomGroups)) {
50
+ return [];
51
+ }
52
+ const sortingGroup = {
53
+ 'list-all': {
54
+ id: 'list-all',
55
+ groupName: 'All Accomodations',
56
+ filters: {},
57
+ rooms: [],
58
+ },
59
+ };
60
+ for (const room of rooms) {
61
+ let groupId = !!room.roomGroupId ? room.roomGroupId : 'list-all';
62
+ if (!sortingGroup[groupId]) {
63
+ const foundGroup = hotel.roomGroups.find((group) => group.id === groupId);
64
+ if (foundGroup) {
65
+ sortingGroup[groupId] = Object.assign(Object.assign({}, foundGroup), { rooms: [] });
66
+ }
67
+ else {
68
+ // Can't find the specific room, defaulting to "unsorted" rooms
69
+ groupId = 'list-all';
70
+ }
71
+ }
72
+ // Actual bit that puts the right room in the right location
73
+ sortingGroup[groupId].rooms.push(room);
74
+ }
75
+ const valuedSortedGroups = Object.values(sortingGroup);
76
+ if (valuedSortedGroups.length === 1 && valuedSortedGroups[0].rooms.length === 0) {
77
+ valuedSortedGroups.splice(0, 1);
78
+ }
79
+ DataLayer_1.default.instance.sendRoomImpressions();
80
+ return valuedSortedGroups;
81
+ }, [rooms, hotel === null || hotel === void 0 ? void 0 : hotel.roomGroups]);
82
+ const defaultTab = (0, react_1.useMemo)(() => {
83
+ var _a;
84
+ return (_a = params.get('defaultTab')) !== null && _a !== void 0 ? _a : undefined;
85
+ }, []);
86
+ if (isLoading) {
87
+ return react_1.default.createElement(LargeLoader_1.default, null);
88
+ }
89
+ if (groupedRooms.length) {
90
+ const onlyGroups = [...groupedRooms];
91
+ // Update onlyGroups to be the same as groupedRooms, but without the first element
92
+ onlyGroups.splice(0, 1);
93
+ return (react_1.default.createElement("div", { style: { maxWidth: '100%', overflow: 'hidden' } },
94
+ react_1.default.createElement(Tabs_1.default, { fullBleedOnLineBreak: false, activeKey: defaultTab },
95
+ react_1.default.createElement(Tab_1.Tab, { title: "All Accomodation", navPath: StepGroupedRoom_1.default.getStepUrl() + 'list-all', key: "list-all" }, groupedRooms === null || groupedRooms === void 0 ? void 0 : groupedRooms.filter((item) => item.rooms.length).map((group) => {
96
+ return react_1.default.createElement(TabGroupedRoomList_1.TabGroupedRoomList, { group: group, rooms: group.rooms, key: group.id });
97
+ })),
98
+ onlyGroups.map((group) => (react_1.default.createElement(Tab_1.Tab, { title: group.groupName, navPath: StepGroupedRoom_1.default.getStepUrl() + group.groupName, key: group.id },
99
+ react_1.default.createElement(TabGroupedRoomList_1.TabGroupedRoomList, { group: group, rooms: group.rooms })))))));
100
+ }
101
+ // No rooms found, so let's display the crossell block, or no rooms found
102
+ return (react_1.default.createElement(react_1.default.Fragment, null,
103
+ apiHasError ? react_1.default.createElement(StepRoomErrorForm_1.StepRoomErrorForm, null) : react_1.default.createElement(NoRoomsFoundBlock_1.default, null), (_a = hotel === null || hotel === void 0 ? void 0 : hotel.crossSellHotelIds) === null || _a === void 0 ? void 0 :
104
+ _a.map((hotelId) => (react_1.default.createElement(RoomListCrossSellBlock_1.default, { key: hotelId, hotelId: hotelId })))));
105
+ };
106
+ exports.TabGroupedRooms = TabGroupedRooms;
107
+ //# sourceMappingURL=TabGroupedRooms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabGroupedRooms.js","sourceRoot":"/","sources":["src/components/steps/room/TabGroupedRooms/TabGroupedRooms.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Tab } from '@/components/generic/Tabs/Tab';\nimport Tabs from '@/components/generic/Tabs/Tabs';\nimport { useRoomRateAvailabilityListFromApi } from '@/hooks/RoomRateAvailabilityListFromApi';\nimport StepGroupedRoom from '@/pages/steps/StepGroupedRoom/StepGroupedRoom';\nimport { useCurrentHotel } from '@frontend/hooks';\nimport React, { useMemo } from 'react';\nimport { TabGroupedRoomList } from '@/components/steps/room/TabGroupedRooms/TabGroupedRoomList';\nimport { HotelRoomGroupsDTO } from '@/models/Api/HotelDTO';\nimport { Room } from '@/models/Room/Room';\nimport LargeLoader from '@/components/generic/loader/LargeLoader';\nimport { useHashQuery } from '@/hooks/Query';\nimport DataLayer from '@/util/DataLayer';\nimport NoRoomsFoundBlock from '@/components/steps/room/NoRoomsFoundBlock';\nimport RoomListCrossSellBlock from '@/components/steps/room/RoomListCrossSellBlock';\nimport { StepRoomErrorForm } from '@/components/steps/room/StepRoomErrorForm';\n\nexport const TabGroupedRooms = () => {\n const { hotel } = useCurrentHotel();\n\n const { rooms, isLoading, openRoom, apiHasError } = useRoomRateAvailabilityListFromApi();\n const params = useHashQuery();\n\n const groupedRooms: (HotelRoomGroupsDTO[number] & { rooms: Room[] })[] = useMemo(() => {\n if (!hotel?.roomGroups) {\n return [];\n }\n\n const sortingGroup: { [id: string]: HotelRoomGroupsDTO[number] & { rooms: Room[] } } = {\n 'list-all': {\n id: 'list-all',\n groupName: 'All Accomodations',\n filters: {},\n rooms: [],\n },\n };\n\n for (const room of rooms) {\n let groupId = !!room.roomGroupId ? room.roomGroupId : 'list-all';\n\n if (!sortingGroup[groupId]) {\n const foundGroup = hotel.roomGroups.find((group) => group.id === groupId);\n\n if (foundGroup) {\n sortingGroup[groupId] = {\n ...foundGroup,\n rooms: [],\n };\n } else {\n // Can't find the specific room, defaulting to \"unsorted\" rooms\n groupId = 'list-all';\n }\n }\n\n // Actual bit that puts the right room in the right location\n sortingGroup[groupId].rooms.push(room);\n }\n\n const valuedSortedGroups = Object.values(sortingGroup);\n\n if (valuedSortedGroups.length === 1 && valuedSortedGroups[0].rooms.length === 0) {\n valuedSortedGroups.splice(0, 1);\n }\n\n DataLayer.instance.sendRoomImpressions();\n\n return valuedSortedGroups;\n }, [rooms, hotel?.roomGroups]);\n\n const defaultTab = useMemo(() => {\n return params.get('defaultTab') ?? undefined;\n }, []);\n\n if (isLoading) {\n return <LargeLoader />;\n }\n\n if (groupedRooms.length) {\n const onlyGroups = [...groupedRooms];\n // Update onlyGroups to be the same as groupedRooms, but without the first element\n onlyGroups.splice(0, 1);\n\n return (\n <div style={{ maxWidth: '100%', overflow: 'hidden' }}>\n <Tabs fullBleedOnLineBreak={false} activeKey={defaultTab}>\n <Tab title=\"All Accomodation\" navPath={StepGroupedRoom.getStepUrl() + 'list-all'} key=\"list-all\">\n {/* We're not starting at 1 here as we want to display these rooms, even if they're not ordered */}\n {groupedRooms\n ?.filter((item) => item.rooms.length)\n .map((group) => {\n return <TabGroupedRoomList group={group} rooms={group.rooms} key={group.id} />;\n })}\n </Tab>\n {/* Reason we've got to splice here is 0 index will always be unsorted rooms */}\n {onlyGroups.map((group) => (\n <Tab title={group.groupName} navPath={StepGroupedRoom.getStepUrl() + group.groupName} key={group.id}>\n <TabGroupedRoomList group={group} rooms={group.rooms} />\n </Tab>\n ))}\n </Tabs>\n </div>\n );\n }\n\n // No rooms found, so let's display the crossell block, or no rooms found\n return (\n <>\n {apiHasError ? <StepRoomErrorForm /> : <NoRoomsFoundBlock />}\n {hotel?.crossSellHotelIds?.map((hotelId) => (\n <RoomListCrossSellBlock key={hotelId} hotelId={hotelId} />\n ))}\n </>\n );\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const TripteaseLodgingSearchSchema: () => JSX.Element;
@@ -0,0 +1,43 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.TripteaseLodgingSearchSchema = void 0;
27
+ const react_1 = __importStar(require("react"));
28
+ const contexts_1 = require("../../../contexts/index.js");
29
+ const TripteaseLodgingSearchSchema = () => {
30
+ const { selectedBasketRow } = (0, react_1.useContext)(contexts_1.BasketContext);
31
+ return (react_1.default.createElement("script", { type: "application/ld+json" }, JSON.stringify({
32
+ '@context': 'https://structured-data.triptease.io',
33
+ '@type': 'LodgingSearch',
34
+ checkinTime: selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getStartDate().format('YYYY-M-D'),
35
+ checkoutTime: selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getEndDate().format('YYYY-M-D'),
36
+ numAdults: selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getAdults(),
37
+ numChildren: selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getChildren(),
38
+ numRooms: '1',
39
+ offerCode: selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getPromoCode(),
40
+ })));
41
+ };
42
+ exports.TripteaseLodgingSearchSchema = TripteaseLodgingSearchSchema;
43
+ //# sourceMappingURL=TripteaseLodgingSearchSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TripteaseLodgingSearchSchema.js","sourceRoot":"/","sources":["src/components/steps/room/TripteaseLodgingSearchSchema.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA0C;AAC1C,iDAAmD;AAE5C,MAAM,4BAA4B,GAAG,GAAG,EAAE;IAC7C,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAA,kBAAU,EAAC,wBAAa,CAAC,CAAC;IAExD,OAAO,CACH,0CAAQ,IAAI,EAAC,qBAAqB,IAC7B,IAAI,CAAC,SAAS,CAAC;QACZ,UAAU,EAAE,sCAAsC;QAClD,OAAO,EAAE,eAAe;QACxB,WAAW,EAAE,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC;QACjE,YAAY,EAAE,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAChE,SAAS,EAAE,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,SAAS,EAAE;QACzC,WAAW,EAAE,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,WAAW,EAAE;QAC7C,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,YAAY,EAAE;KAC/C,CAAC,CACG,CACZ,CAAC;AACN,CAAC,CAAC;AAjBW,QAAA,4BAA4B,gCAiBvC","sourcesContent":["import React, { useContext } from 'react';\nimport { BasketContext } from '@frontend/contexts';\n\nexport const TripteaseLodgingSearchSchema = () => {\n const { selectedBasketRow } = useContext(BasketContext);\n\n return (\n <script type=\"application/ld+json\">\n {JSON.stringify({\n '@context': 'https://structured-data.triptease.io',\n '@type': 'LodgingSearch',\n checkinTime: selectedBasketRow?.getStartDate().format('YYYY-M-D'),\n checkoutTime: selectedBasketRow?.getEndDate().format('YYYY-M-D'),\n numAdults: selectedBasketRow?.getAdults(),\n numChildren: selectedBasketRow?.getChildren(),\n numRooms: '1',\n offerCode: selectedBasketRow?.getPromoCode(),\n })}\n </script>\n );\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const UserSearchSummary: () => JSX.Element;
@@ -0,0 +1,56 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.UserSearchSummary = void 0;
30
+ const react_1 = __importStar(require("react"));
31
+ const TripteaseLodgingSearchSchema_1 = require("../TripteaseLodgingSearchSchema");
32
+ const contexts_1 = require("../../../../contexts/index.js");
33
+ const UserSearchSummaryRow_1 = require("./UserSearchSummaryRow");
34
+ const react_i18next_1 = require("react-i18next");
35
+ const BasketRow_1 = __importDefault(require("../../../../models/BasketRow"));
36
+ const DataLayer_1 = __importStar(require("../../../../util/DataLayer"));
37
+ const Translation_1 = require("../../../../translations/Translation");
38
+ const Icon_1 = require("../../../generic/Icon/Icon");
39
+ const BEButton_1 = __importDefault(require("../../../generic/BEButton"));
40
+ const UserSearchSummary = () => {
41
+ const { currentBasketRows, addBasketRow } = (0, react_1.useContext)(contexts_1.BasketContext);
42
+ const { t } = (0, react_i18next_1.useTranslation)();
43
+ const addRoomRowOnClick = () => {
44
+ DataLayer_1.default.instance.sendInteraction('Add Room Row', DataLayer_1.InteractionType.BUTTON, DataLayer_1.InteractionStep.ROOMS);
45
+ addBasketRow(new BasketRow_1.default());
46
+ };
47
+ return (react_1.default.createElement(react_1.default.Fragment, null,
48
+ currentBasketRows.map((row, index) => {
49
+ return react_1.default.createElement(UserSearchSummaryRow_1.UserSearchSummaryRow, { row: row, index: index, key: row.getID() });
50
+ }),
51
+ react_1.default.createElement("div", { className: "u-flex justify-content-end" },
52
+ react_1.default.createElement(BEButton_1.default, { icon: Icon_1.IconType.Add, onClick: addRoomRowOnClick, stopIconAnimation: true }, t(Translation_1.Translation.Step.Room.RoomInfo.AddRoom))),
53
+ react_1.default.createElement(TripteaseLodgingSearchSchema_1.TripteaseLodgingSearchSchema, null)));
54
+ };
55
+ exports.UserSearchSummary = UserSearchSummary;
56
+ //# sourceMappingURL=UserSearchSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserSearchSummary.js","sourceRoot":"/","sources":["src/components/steps/room/UserSearchSummary/UserSearchSummary.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA0C;AAC1C,kFAA+E;AAC/E,iDAAmD;AACnD,iEAA8D;AAC9D,iDAA+C;AAC/C,mEAA2C;AAC3C,8DAA+E;AAC/E,4DAAyD;AACzD,yDAA0D;AAC1D,6EAAqD;AAE9C,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,GAAG,IAAA,kBAAU,EAAC,wBAAa,CAAC,CAAC;IAEtE,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,8BAAc,GAAE,CAAC;IAC/B,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC3B,mBAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,2BAAe,CAAC,MAAM,EAAE,2BAAe,CAAC,KAAK,CAAC,CAAC;QAClG,YAAY,CAAC,IAAI,mBAAS,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,OAAO,CACH;QACK,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAClC,OAAO,8BAAC,2CAAoB,IAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,GAAI,CAAC;QAC9E,CAAC,CAAC;QACF,uCAAK,SAAS,EAAC,4BAA4B;YACvC,8BAAC,kBAAQ,IAAC,IAAI,EAAE,eAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,UACtE,CAAC,CAAC,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CACnC,CACT;QACN,8BAAC,2DAA4B,OAAG,CACjC,CACN,CAAC;AACN,CAAC,CAAC;AAtBW,QAAA,iBAAiB,qBAsB5B","sourcesContent":["import React, { useContext } from 'react';\nimport { TripteaseLodgingSearchSchema } from '../TripteaseLodgingSearchSchema';\nimport { BasketContext } from '@frontend/contexts';\nimport { UserSearchSummaryRow } from './UserSearchSummaryRow';\nimport { useTranslation } from 'react-i18next';\nimport BasketRow from '@/models/BasketRow';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport { Translation } from '@/translations/Translation';\nimport { IconType } from '@/components/generic/Icon/Icon';\nimport BEButton from '@/components/generic/BEButton';\n\nexport const UserSearchSummary = () => {\n const { currentBasketRows, addBasketRow } = useContext(BasketContext);\n\n const { t } = useTranslation();\n const addRoomRowOnClick = () => {\n DataLayer.instance.sendInteraction('Add Room Row', InteractionType.BUTTON, InteractionStep.ROOMS);\n addBasketRow(new BasketRow());\n };\n\n return (\n <>\n {currentBasketRows.map((row, index) => {\n return <UserSearchSummaryRow row={row} index={index} key={row.getID()} />;\n })}\n <div className=\"u-flex justify-content-end\">\n <BEButton icon={IconType.Add} onClick={addRoomRowOnClick} stopIconAnimation>\n {t(Translation.Step.Room.RoomInfo.AddRoom)}\n </BEButton>\n </div>\n <TripteaseLodgingSearchSchema />\n </>\n );\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import BasketRow from '../../../../models/BasketRow';
2
+ type UserSearchSummaryPromocodeInputProps = {
3
+ row: BasketRow;
4
+ onChange: (code: string) => void;
5
+ disabled?: boolean;
6
+ };
7
+ export declare const UserSearchSummaryPromocdeInput: ({ row, disabled, onChange }: UserSearchSummaryPromocodeInputProps) => JSX.Element;
8
+ export {};
@@ -0,0 +1,90 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.UserSearchSummaryPromocdeInput = void 0;
30
+ const BEButton_1 = __importDefault(require("../../../generic/BEButton"));
31
+ const Icon_1 = __importStar(require("../../../generic/Icon/Icon"));
32
+ const Overlay_1 = require("../../../generic/Overlay/Overlay");
33
+ const PromoCodeInput_1 = __importDefault(require("../../../generic/PromoCodeInput"));
34
+ const Text_1 = __importStar(require("../../../generic/Text"));
35
+ const Tooltip_1 = __importDefault(require("../../../generic/Tooltip/Tooltip"));
36
+ const Translation_1 = require("../../../../translations/Translation");
37
+ const Color_1 = require("../../../../util/Color");
38
+ const DataLayer_1 = __importStar(require("../../../../util/DataLayer"));
39
+ const react_1 = __importStar(require("react"));
40
+ const react_i18next_1 = require("react-i18next");
41
+ const UserSearchSummaryPromocdeInput = ({ row, disabled = false, onChange }) => {
42
+ const { t } = (0, react_i18next_1.useTranslation)();
43
+ const [isPromoModalOpen, setIsPromoModalOpen] = (0, react_1.useState)(false);
44
+ let promoCodeTooltip = '';
45
+ if (row.getPromoCodeStatus() === 'new') {
46
+ promoCodeTooltip = row.getPromoCode() ? t(Translation_1.Translation.Step.Date.PromoCodeTooltip.Checking) : t(Translation_1.Translation.Step.Date.PromoCodeTooltip.NoValue);
47
+ }
48
+ else {
49
+ if (row.getPromoCodeStatus() === 'valid') {
50
+ promoCodeTooltip = t(Translation_1.Translation.Step.Date.PromoCodeTooltip.Valid);
51
+ }
52
+ else {
53
+ promoCodeTooltip = t(Translation_1.Translation.Step.Date.PromoCodeTooltip.Invalid);
54
+ }
55
+ }
56
+ const thisElement = (0, react_1.useRef)(null);
57
+ const openPromoModalOnClick = () => {
58
+ if (disabled) {
59
+ return;
60
+ }
61
+ setIsPromoModalOpen(true);
62
+ };
63
+ const setPromoCodeOnClose = () => {
64
+ setIsPromoModalOpen(false);
65
+ };
66
+ const cancelPromoPopupOnClick = () => {
67
+ DataLayer_1.default.instance.sendInteraction('Cancel Promo Popup', DataLayer_1.InteractionType.BUTTON, DataLayer_1.InteractionStep.ROOMS);
68
+ setIsPromoModalOpen(false);
69
+ };
70
+ const _onChangePromoCode = (code) => {
71
+ onChange(code);
72
+ if (code) {
73
+ setIsPromoModalOpen(false);
74
+ }
75
+ };
76
+ return (react_1.default.createElement(react_1.default.Fragment, null,
77
+ react_1.default.createElement(Tooltip_1.default, { title: promoCodeTooltip, wrapperClasses: "u-w-100@xl- d-flex", disabled: disabled },
78
+ react_1.default.createElement("div", { className: "room-builder-progress--value u-cursor-pointer", ref: thisElement, onClick: openPromoModalOnClick },
79
+ react_1.default.createElement("div", { className: "u-flex align-items-center justify-content-center u-w-100@xl-" },
80
+ react_1.default.createElement(Text_1.default, { className: "u-pad-right--light", type: Text_1.TextType.Body, color: row.getPromoCode() ? row.getPromoCodeColour() : Color_1.Color.Navy }, row.getPromoCode() ? row.getPromoCode() : t(Translation_1.Translation.Step.Date.PromoCode)),
81
+ react_1.default.createElement(Icon_1.default, { icon: Icon_1.IconType.Dropdown, color: Color_1.Color.DarkGrey })))),
82
+ react_1.default.createElement(Overlay_1.Overlay, { open: isPromoModalOpen, followElement: thisElement.current, onClose: setPromoCodeOnClose },
83
+ react_1.default.createElement("div", { className: "u-pad--heavy" },
84
+ react_1.default.createElement("div", null,
85
+ react_1.default.createElement(PromoCodeInput_1.default, { value: row === null || row === void 0 ? void 0 : row.getPromoCode(), onChange: _onChangePromoCode, valid: (row === null || row === void 0 ? void 0 : row.getPromoCodeStatus()) !== 'new' ? (row === null || row === void 0 ? void 0 : row.getPromoCodeStatus()) === 'valid' : undefined })),
86
+ react_1.default.createElement("div", { className: "u-flex justify-content-end align-items-center u-marg-top" },
87
+ react_1.default.createElement(BEButton_1.default, { isText: true, size: "small", onClick: cancelPromoPopupOnClick }, t(Translation_1.Translation.Misc.Cancel)))))));
88
+ };
89
+ exports.UserSearchSummaryPromocdeInput = UserSearchSummaryPromocdeInput;
90
+ //# sourceMappingURL=UserSearchSummaryPromocodeInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserSearchSummaryPromocodeInput.js","sourceRoot":"/","sources":["src/components/steps/room/UserSearchSummary/UserSearchSummaryPromocodeInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import BEButton from '@/components/generic/BEButton';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\nimport { Overlay } from '@/components/generic/Overlay/Overlay';\nimport PromoCodeInput from '@/components/generic/PromoCodeInput';\nimport Text, { TextType } from '@/components/generic/Text';\nimport Tooltip from '@/components/generic/Tooltip/Tooltip';\nimport BasketRow from '@/models/BasketRow';\nimport { Translation } from '@/translations/Translation';\nimport { Color } from '@/util/Color';\nimport DataLayer, { InteractionStep, InteractionType } from '@/util/DataLayer';\nimport React, { useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\ntype UserSearchSummaryPromocodeInputProps = {\n row: BasketRow;\n onChange: (code: string) => void;\n\n disabled?: boolean;\n};\n\nexport const UserSearchSummaryPromocdeInput = ({ row, disabled = false, onChange }: UserSearchSummaryPromocodeInputProps) => {\n const { t } = useTranslation();\n const [isPromoModalOpen, setIsPromoModalOpen] = useState(false);\n\n let promoCodeTooltip = '';\n\n if (row.getPromoCodeStatus() === 'new') {\n promoCodeTooltip = row.getPromoCode() ? t(Translation.Step.Date.PromoCodeTooltip.Checking) : t(Translation.Step.Date.PromoCodeTooltip.NoValue);\n } else {\n if (row.getPromoCodeStatus() === 'valid') {\n promoCodeTooltip = t(Translation.Step.Date.PromoCodeTooltip.Valid);\n } else {\n promoCodeTooltip = t(Translation.Step.Date.PromoCodeTooltip.Invalid);\n }\n }\n\n const thisElement = useRef<HTMLDivElement | null>(null);\n\n const openPromoModalOnClick = () => {\n if (disabled) {\n return;\n }\n\n setIsPromoModalOpen(true);\n };\n const setPromoCodeOnClose = () => {\n setIsPromoModalOpen(false);\n };\n\n const cancelPromoPopupOnClick = () => {\n DataLayer.instance.sendInteraction('Cancel Promo Popup', InteractionType.BUTTON, InteractionStep.ROOMS);\n setIsPromoModalOpen(false);\n };\n\n const _onChangePromoCode = (code: string) => {\n onChange(code);\n if (code) {\n setIsPromoModalOpen(false);\n }\n };\n\n return (\n <>\n <Tooltip title={promoCodeTooltip} wrapperClasses=\"u-w-100@xl- d-flex\" disabled={disabled}>\n <div className=\"room-builder-progress--value u-cursor-pointer\" ref={thisElement} onClick={openPromoModalOnClick}>\n <div className=\"u-flex align-items-center justify-content-center u-w-100@xl-\">\n <Text className=\"u-pad-right--light\" type={TextType.Body} color={row.getPromoCode() ? row.getPromoCodeColour() : Color.Navy}>\n {row.getPromoCode() ? row.getPromoCode() : t(Translation.Step.Date.PromoCode)}\n </Text>\n <Icon icon={IconType.Dropdown} color={Color.DarkGrey} />\n </div>\n </div>\n </Tooltip>\n <Overlay open={isPromoModalOpen} followElement={thisElement.current} onClose={setPromoCodeOnClose}>\n <div className=\"u-pad--heavy\">\n <div>\n <PromoCodeInput\n value={row?.getPromoCode()}\n onChange={_onChangePromoCode}\n valid={row?.getPromoCodeStatus() !== 'new' ? row?.getPromoCodeStatus() === 'valid' : undefined}\n />\n </div>\n\n <div className=\"u-flex justify-content-end align-items-center u-marg-top\">\n <BEButton isText size=\"small\" onClick={cancelPromoPopupOnClick}>\n {t(Translation.Misc.Cancel)}\n </BEButton>\n </div>\n </div>\n </Overlay>\n </>\n );\n};\n"]}
@@ -0,0 +1,7 @@
1
+ import BasketRow from '../../../../models/BasketRow';
2
+ type UserSearchSummaryRowProps = {
3
+ row: BasketRow;
4
+ index: number;
5
+ };
6
+ export declare const UserSearchSummaryRow: ({ row, index }: UserSearchSummaryRowProps) => JSX.Element;
7
+ export {};
@@ -0,0 +1,172 @@
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.UserSearchSummaryRow = void 0;
30
+ const react_1 = __importStar(require("react"));
31
+ const UserSearchSummaryRow_module_scss_1 = __importDefault(require("./UserSearchSummaryRow.module.scss"));
32
+ const Icon_1 = __importStar(require("../../../generic/Icon/Icon"));
33
+ const classnames_1 = __importDefault(require("classnames"));
34
+ const contexts_1 = require("../../../../contexts/index.js");
35
+ const Text_1 = __importStar(require("../../../generic/Text"));
36
+ const Tooltip_1 = __importDefault(require("../../../generic/Tooltip/Tooltip"));
37
+ const FloatingDatePicker_1 = __importDefault(require("../../../generic/date/FloatingDatePicker"));
38
+ const Color_1 = require("../../../../util/Color");
39
+ const Translation_1 = require("../../../../translations/Translation");
40
+ const react_i18next_1 = require("react-i18next");
41
+ const NumberOfAdultsPicker_1 = __importDefault(require("../roomBuilderProgress/NumberOfAdultsPicker"));
42
+ const DataLayer_1 = __importStar(require("../../../../util/DataLayer"));
43
+ const NumberOfChildrenPicker_1 = __importDefault(require("../roomBuilderProgress/NumberOfChildrenPicker"));
44
+ const UserSearchSummaryPromocodeInput_1 = require("./UserSearchSummaryPromocodeInput");
45
+ const BEButton_1 = __importDefault(require("../../../generic/BEButton"));
46
+ const ScreenSize_1 = __importDefault(require("../../../../util/ScreenSize"));
47
+ const StringHelper_1 = __importDefault(require("../../../../util/StringHelper"));
48
+ const Pill_1 = __importStar(require("../../../generic/Pill"));
49
+ const hooks_1 = require("../../../../hooks/index.js");
50
+ const UserSearchSummaryRow = ({ row, index }) => {
51
+ const { t } = (0, react_i18next_1.useTranslation)();
52
+ const removeButtonRef = (0, react_1.useRef)();
53
+ const { hotel } = (0, hooks_1.useCurrentHotel)();
54
+ const { selectedBasketRow, currentBasketRows, updateBasketRow, removeBasketRow, selectBasketRow } = (0, react_1.useContext)(contexts_1.BasketContext);
55
+ const engineContext = (0, react_1.useContext)(contexts_1.BookingEngineContext);
56
+ const isSelectedRow = (0, react_1.useMemo)(() => {
57
+ return (selectedBasketRow === null || selectedBasketRow === void 0 ? void 0 : selectedBasketRow.getID()) === (row === null || row === void 0 ? void 0 : row.getID());
58
+ }, [selectedBasketRow]);
59
+ const canRemove = currentBasketRows.length > 1;
60
+ const removeRoomOnClick = () => {
61
+ DataLayer_1.default.instance.sendInteraction('Remove Room', DataLayer_1.InteractionType.BUTTON, DataLayer_1.InteractionStep.ROOMS);
62
+ removeBasketRow(row);
63
+ };
64
+ const removeButton = (react_1.default.createElement(Tooltip_1.default, { title: canRemove ? 'Remove this room' : 'Cannot remove this room as at least one must be selected.', followElement: removeButtonRef === null || removeButtonRef === void 0 ? void 0 : removeButtonRef.current, wrapperClasses: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__remove-tooltip'] },
65
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__remove'], onClick: removeRoomOnClick, ref: removeButtonRef },
66
+ react_1.default.createElement(BEButton_1.default, { isText: true, icon: Icon_1.IconType.Close, iconPosition: "right", stopIconAnimation: true, disabled: !canRemove, onClick: removeRoomOnClick }))));
67
+ const updatePeopleValues = ({ adults, children, updatedPromoCode }) => {
68
+ if (adults && adults !== row.getAdults()) {
69
+ DataLayer_1.default.instance.sendInteraction('Guests', DataLayer_1.InteractionType.NUMBER_INPUT, DataLayer_1.InteractionStep.ROOMS);
70
+ row.setAdults(adults);
71
+ }
72
+ if ((children || children === 0) && children !== row.getChildren()) {
73
+ DataLayer_1.default.instance.sendInteraction('Guests', DataLayer_1.InteractionType.NUMBER_INPUT, DataLayer_1.InteractionStep.ROOMS);
74
+ row.setChildren(children);
75
+ }
76
+ if ((updatedPromoCode || updatedPromoCode === '') && updatedPromoCode !== row.getPromoCode()) {
77
+ DataLayer_1.default.instance.sendInteraction('Promo Code', DataLayer_1.InteractionType.FORM_FIELD, DataLayer_1.InteractionStep.ROOMS);
78
+ row.setPromoCode(updatedPromoCode);
79
+ }
80
+ updateBasketRow(row);
81
+ };
82
+ const updatePromoCode = (code) => {
83
+ DataLayer_1.default.instance.sendInteraction('Promo Code', DataLayer_1.InteractionType.FORM_FIELD, DataLayer_1.InteractionStep.ROOMS);
84
+ if (selectedBasketRow) {
85
+ selectedBasketRow.setPromoCode(code);
86
+ updateBasketRow(selectedBasketRow);
87
+ }
88
+ };
89
+ const updateDateValues = (startDate, endDate) => {
90
+ if (startDate) {
91
+ row.setStartDate(startDate);
92
+ }
93
+ if (endDate) {
94
+ row.setEndDate(endDate);
95
+ }
96
+ updateBasketRow(row);
97
+ };
98
+ const updateNumberOfAdultsOnChange = (value) => {
99
+ updatePeopleValues({ adults: +value });
100
+ };
101
+ const updateNumberOfChildrenOnChange = (value) => {
102
+ updatePeopleValues({ children: +value });
103
+ };
104
+ const changePromoCode = (val) => {
105
+ updatePromoCode(val);
106
+ };
107
+ const onClickCancelRoomChanges = () => {
108
+ DataLayer_1.default.instance.sendInteraction('Cancel Room Changes', DataLayer_1.InteractionType.LINK, DataLayer_1.InteractionStep.ROOMS);
109
+ selectBasketRow(null);
110
+ };
111
+ const onClickEditRoom = () => {
112
+ DataLayer_1.default.instance.sendInteraction('Edit Room', DataLayer_1.InteractionType.LINK, DataLayer_1.InteractionStep.ROOMS);
113
+ selectBasketRow(row);
114
+ };
115
+ const isValid = row.isValid();
116
+ const isLargerThanLarge = engineContext.screenSize > ScreenSize_1.default.ExtraLarge;
117
+ if (isValid && !isSelectedRow) {
118
+ return (react_1.default.createElement("div", { className: `${UserSearchSummaryRow_module_scss_1.default['user-completed-summary-row']} u-flex w-100` },
119
+ react_1.default.createElement("div", { className: "u-flex justify-content-start" },
120
+ react_1.default.createElement("div", { className: "u-flex flex-column" },
121
+ react_1.default.createElement("span", null,
122
+ react_1.default.createElement(Text_1.default, { inline: isLargerThanLarge },
123
+ react_1.default.createElement("strong", null, row.getRoom().name)),
124
+ react_1.default.createElement(Text_1.default, { inline: isLargerThanLarge, type: isLargerThanLarge ? Text_1.TextType.Body : Text_1.TextType.Small },
125
+ react_1.default.createElement("span", { className: "u-marg-left--light@xl" },
126
+ StringHelper_1.default.pluralWithDictAndCount(row.getAdults(), Translation_1.Translation.Step.Date.Adult, t),
127
+ ",\u00A0",
128
+ StringHelper_1.default.pluralWithDictAndCount(row.getChildren(), Translation_1.Translation.Step.Date.Child, t)))),
129
+ react_1.default.createElement(Text_1.default, { type: Text_1.TextType.Caption, color: Color_1.Color.DarkGrey },
130
+ react_1.default.createElement("strong", null, row.getStayDateRange('ddd, MMM D, YYYY', ' -')))),
131
+ row.isPromoCodeValid() && (react_1.default.createElement("div", { className: "u-marg-left d-flex align-items-center" },
132
+ react_1.default.createElement(Pill_1.default, { type: Pill_1.PillType.Success, icon: Icon_1.IconType.Money }, row.getPromoCode())))),
133
+ react_1.default.createElement("div", { className: "u-flex align-items-center" },
134
+ react_1.default.createElement("div", { className: "u-flex align-items-center room-builder-progress--edit" },
135
+ react_1.default.createElement(Tooltip_1.default, { title: t(Translation_1.Translation.Step.Room.EditThisRoom) },
136
+ react_1.default.createElement("div", { className: "u-flex align-items-center" },
137
+ react_1.default.createElement(BEButton_1.default, { isText: true, size: "tiny", onClick: onClickEditRoom }, t(Translation_1.Translation.Misc.Edit).toUpperCase())))),
138
+ removeButton)));
139
+ }
140
+ // Commented out for now - need to figure out if all text should go the same colour
141
+ // const shouldTextBeWhite = hotel?.colors && lightOrDark(hotel?.colors.accent) === 'dark' && isValid;
142
+ return (react_1.default.createElement("div", { className: (0, classnames_1.default)(UserSearchSummaryRow_module_scss_1.default['user-search-summary-row'], {
143
+ [UserSearchSummaryRow_module_scss_1.default['--selected']]: isSelectedRow,
144
+ [UserSearchSummaryRow_module_scss_1.default['--valid']]: isValid,
145
+ }) },
146
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row--inner'] },
147
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__group'] },
148
+ react_1.default.createElement(Text_1.default, { inline: true, bold: true, className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__group-label'] }, "Dates:"),
149
+ react_1.default.createElement(FloatingDatePicker_1.default, { startDate: row.getStartDate(), endDate: row.getEndDate(), selectedDateChanged: updateDateValues, isAboveNav: true, className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__input'] },
150
+ react_1.default.createElement(Tooltip_1.default, { disabled: !isSelectedRow, title: t(Translation_1.Translation.Step.Date.SelectArrivalAndDepartureDatesByClickingHere) },
151
+ react_1.default.createElement("div", { className: "u-flex align-items-center justify-content-center u-w-100@xl- u-cursor-pointer" },
152
+ react_1.default.createElement(Text_1.default, { color: Color_1.Color.Accent, bold: true, className: "u-nowrap" }, row.getArrivalDate()),
153
+ react_1.default.createElement(Icon_1.default, { icon: Icon_1.IconType.ArrowRight2 }),
154
+ react_1.default.createElement(Text_1.default, { color: Color_1.Color.Accent, bold: true, className: "u-nowrap" }, row.getDepartureDate()))))),
155
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__divider'] }),
156
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__group'] },
157
+ react_1.default.createElement(Text_1.default, { inline: true, bold: true, className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__group-label'] }, "Who:"),
158
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__input'] },
159
+ react_1.default.createElement(NumberOfAdultsPicker_1.default, { row: row, onChange: updateNumberOfAdultsOnChange })),
160
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__input'] },
161
+ react_1.default.createElement(NumberOfChildrenPicker_1.default, { row: row, onChange: updateNumberOfChildrenOnChange }))),
162
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__divider'] }),
163
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__group'] },
164
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row__input'] },
165
+ react_1.default.createElement(UserSearchSummaryPromocodeInput_1.UserSearchSummaryPromocdeInput, { row: row, onChange: changePromoCode, disabled: !isSelectedRow })))),
166
+ react_1.default.createElement("div", { className: UserSearchSummaryRow_module_scss_1.default['user-search-summary-row--buttons'] },
167
+ isSelectedRow && isValid && (react_1.default.createElement(react_1.default.Fragment, null,
168
+ react_1.default.createElement(BEButton_1.default, { isText: true, size: "tiny", onClick: onClickCancelRoomChanges }, t(Translation_1.Translation.Misc.Cancel)))),
169
+ removeButton)));
170
+ };
171
+ exports.UserSearchSummaryRow = UserSearchSummaryRow;
172
+ //# sourceMappingURL=UserSearchSummaryRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserSearchSummaryRow.js","sourceRoot":"/","sources":["src/components/steps/room/UserSearchSummary/UserSearchSummaryRow.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext, useMemo, useRef } from 'react';\nimport BasketRow from '@/models/BasketRow';\n\nimport styles from './UserSearchSummaryRow.module.scss';\nimport Icon, { IconType } from '@/components/generic/Icon/Icon';\n\nimport { default as cx } from 'classnames';\nimport { BasketContext, BookingEngineContext } from '@frontend/contexts';\nimport Text, { TextType } from '@/components/generic/Text';\nimport Tooltip from '@/components/generic/Tooltip/Tooltip';\nimport FloatingDatePicker from '@/components/generic/date/FloatingDatePicker';\nimport { Color, lightOrDark } from '@/util/Color';\nimport { Translation } from '@/translations/Translation';\nimport { useTranslation } from 'react-i18next';\nimport dayjs from 'dayjs';\nimport NumberOfAdultsPicker from '../roomBuilderProgress/NumberOfAdultsPicker';\nimport DataLayer, { InteractionType, InteractionStep } from '@/util/DataLayer';\nimport NumberOfChildrenPicker from '../roomBuilderProgress/NumberOfChildrenPicker';\nimport { UserSearchSummaryPromocdeInput } from './UserSearchSummaryPromocodeInput';\nimport BEButton from '@/components/generic/BEButton';\nimport ScreenSize from '@/util/ScreenSize';\nimport StringHelper from '@/util/StringHelper';\nimport Pill, { PillType } from '@/components/generic/Pill';\nimport { useCurrentHotel } from '@frontend/hooks';\n\ntype UserSearchSummaryRowProps = {\n row: BasketRow;\n index: number;\n};\n\nexport const UserSearchSummaryRow = ({ row, index }: UserSearchSummaryRowProps) => {\n const { t } = useTranslation();\n const removeButtonRef = useRef<any>();\n const { hotel } = useCurrentHotel();\n\n const { selectedBasketRow, currentBasketRows, updateBasketRow, removeBasketRow, selectBasketRow } = useContext(BasketContext);\n const engineContext = useContext(BookingEngineContext);\n\n const isSelectedRow = useMemo(() => {\n return selectedBasketRow?.getID() === row?.getID();\n }, [selectedBasketRow]);\n\n const canRemove = currentBasketRows.length > 1;\n const removeRoomOnClick = () => {\n DataLayer.instance.sendInteraction('Remove Room', InteractionType.BUTTON, InteractionStep.ROOMS);\n removeBasketRow(row);\n };\n\n const removeButton = (\n <Tooltip\n title={canRemove ? 'Remove this room' : 'Cannot remove this room as at least one must be selected.'}\n followElement={removeButtonRef?.current}\n wrapperClasses={styles['user-search-summary-row__remove-tooltip']}\n >\n <div className={styles['user-search-summary-row__remove']} onClick={removeRoomOnClick} ref={removeButtonRef}>\n <BEButton isText icon={IconType.Close} iconPosition=\"right\" stopIconAnimation disabled={!canRemove} onClick={removeRoomOnClick} />\n </div>\n </Tooltip>\n );\n\n const updatePeopleValues = ({ adults, children, updatedPromoCode }: { adults?: number; children?: number; updatedPromoCode?: string }) => {\n if (adults && adults !== row.getAdults()) {\n DataLayer.instance.sendInteraction('Guests', InteractionType.NUMBER_INPUT, InteractionStep.ROOMS);\n row.setAdults(adults);\n }\n\n if ((children || children === 0) && children !== row.getChildren()) {\n DataLayer.instance.sendInteraction('Guests', InteractionType.NUMBER_INPUT, InteractionStep.ROOMS);\n row.setChildren(children);\n }\n\n if ((updatedPromoCode || updatedPromoCode === '') && updatedPromoCode !== row.getPromoCode()) {\n DataLayer.instance.sendInteraction('Promo Code', InteractionType.FORM_FIELD, InteractionStep.ROOMS);\n row.setPromoCode(updatedPromoCode);\n }\n\n updateBasketRow(row);\n };\n\n const updatePromoCode = (code: string) => {\n DataLayer.instance.sendInteraction('Promo Code', InteractionType.FORM_FIELD, InteractionStep.ROOMS);\n\n if (selectedBasketRow) {\n selectedBasketRow.setPromoCode(code);\n updateBasketRow(selectedBasketRow);\n }\n };\n\n const updateDateValues = (startDate: dayjs.Dayjs, endDate: dayjs.Dayjs) => {\n if (startDate) {\n row.setStartDate(startDate);\n }\n\n if (endDate) {\n row.setEndDate(endDate);\n }\n\n updateBasketRow(row);\n };\n\n const updateNumberOfAdultsOnChange = (value: string) => {\n updatePeopleValues({ adults: +value });\n };\n const updateNumberOfChildrenOnChange = (value: string) => {\n updatePeopleValues({ children: +value });\n };\n const changePromoCode = (val: any) => {\n updatePromoCode(val);\n };\n\n const onClickCancelRoomChanges = () => {\n DataLayer.instance.sendInteraction('Cancel Room Changes', InteractionType.LINK, InteractionStep.ROOMS);\n selectBasketRow(null);\n };\n const onClickEditRoom = () => {\n DataLayer.instance.sendInteraction('Edit Room', InteractionType.LINK, InteractionStep.ROOMS);\n selectBasketRow(row);\n };\n\n const isValid = row.isValid();\n const isLargerThanLarge = engineContext.screenSize > ScreenSize.ExtraLarge;\n\n if (isValid && !isSelectedRow) {\n return (\n <div className={`${styles['user-completed-summary-row']} u-flex w-100`}>\n <div className=\"u-flex justify-content-start\">\n <div className=\"u-flex flex-column\">\n <span>\n <Text inline={isLargerThanLarge}>\n <strong>{row.getRoom().name}</strong>\n </Text>\n <Text inline={isLargerThanLarge} type={isLargerThanLarge ? TextType.Body : TextType.Small}>\n <span className=\"u-marg-left--light@xl\">\n {StringHelper.pluralWithDictAndCount(row.getAdults(), Translation.Step.Date.Adult, t)}\n ,&nbsp;\n {StringHelper.pluralWithDictAndCount(row.getChildren(), Translation.Step.Date.Child, t)}\n </span>\n </Text>\n </span>\n <Text type={TextType.Caption} color={Color.DarkGrey}>\n <strong>{row.getStayDateRange('ddd, MMM D, YYYY', ' -')}</strong>\n </Text>\n </div>\n {row.isPromoCodeValid() && (\n <div className=\"u-marg-left d-flex align-items-center\">\n <Pill type={PillType.Success} icon={IconType.Money}>\n {row.getPromoCode()}\n </Pill>\n </div>\n )}\n </div>\n <div className=\"u-flex align-items-center\">\n <div className=\"u-flex align-items-center room-builder-progress--edit\">\n <Tooltip title={t(Translation.Step.Room.EditThisRoom)}>\n <div className=\"u-flex align-items-center\">\n <BEButton isText size=\"tiny\" onClick={onClickEditRoom}>\n {t(Translation.Misc.Edit).toUpperCase()}\n </BEButton>\n </div>\n </Tooltip>\n </div>\n {removeButton}\n </div>\n </div>\n );\n }\n\n // Commented out for now - need to figure out if all text should go the same colour\n // const shouldTextBeWhite = hotel?.colors && lightOrDark(hotel?.colors.accent) === 'dark' && isValid;\n\n return (\n <div\n className={cx(styles['user-search-summary-row'], {\n [styles['--selected']]: isSelectedRow,\n [styles['--valid']]: isValid,\n })}\n >\n <div className={styles['user-search-summary-row--inner']}>\n <div className={styles['user-search-summary-row__group']}>\n <Text inline bold className={styles['user-search-summary-row__group-label']}>\n Dates:\n </Text>\n <FloatingDatePicker\n startDate={row.getStartDate()}\n endDate={row.getEndDate()}\n selectedDateChanged={updateDateValues}\n isAboveNav\n className={styles['user-search-summary-row__input']}\n >\n <Tooltip disabled={!isSelectedRow} title={t(Translation.Step.Date.SelectArrivalAndDepartureDatesByClickingHere)}>\n <div className=\"u-flex align-items-center justify-content-center u-w-100@xl- u-cursor-pointer\">\n <Text color={Color.Accent} bold className=\"u-nowrap\">\n {row.getArrivalDate()}\n </Text>\n <Icon icon={IconType.ArrowRight2} />\n <Text color={Color.Accent} bold className=\"u-nowrap\">\n {row.getDepartureDate()}\n </Text>\n </div>\n </Tooltip>\n </FloatingDatePicker>\n </div>\n <div className={styles['user-search-summary-row__divider']} />\n <div className={styles['user-search-summary-row__group']}>\n <Text inline bold className={styles['user-search-summary-row__group-label']}>\n Who:\n </Text>\n <div className={styles['user-search-summary-row__input']}>\n <NumberOfAdultsPicker row={row} onChange={updateNumberOfAdultsOnChange} />\n </div>\n <div className={styles['user-search-summary-row__input']}>\n <NumberOfChildrenPicker row={row} onChange={updateNumberOfChildrenOnChange} />\n </div>\n </div>\n <div className={styles['user-search-summary-row__divider']} />\n <div className={styles['user-search-summary-row__group']}>\n <div className={styles['user-search-summary-row__input']}>\n <UserSearchSummaryPromocdeInput row={row} onChange={changePromoCode} disabled={!isSelectedRow} />\n </div>\n </div>\n </div>\n\n <div className={styles['user-search-summary-row--buttons']}>\n {isSelectedRow && isValid && (\n <>\n <BEButton isText size=\"tiny\" onClick={onClickCancelRoomChanges}>\n {t(Translation.Misc.Cancel)}\n </BEButton>\n </>\n )}\n {removeButton}\n </div>\n </div>\n );\n};\n"]}