hart-estate-widget 0.0.8 → 0.0.11

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 (36) hide show
  1. package/README.md +68 -13
  2. package/build/api/index.js +24 -0
  3. package/build/assets/img/bricks.jpeg +0 -0
  4. package/build/assets/img/door-texture.jpeg +0 -0
  5. package/build/assets/img/door.jpeg +0 -0
  6. package/build/assets/img/exterior-wall-texture.jpeg +0 -0
  7. package/build/assets/img/floor-bathroom.jpg +0 -0
  8. package/build/assets/img/floor-dark.png +0 -0
  9. package/build/assets/img/floor-white.png +0 -0
  10. package/build/assets/img/floor.jpg +0 -0
  11. package/build/assets/img/grass.png +0 -0
  12. package/build/assets/img/ground.svg +9 -0
  13. package/build/assets/img/wall-texture.jpg +0 -0
  14. package/build/assets/sass/animation.sass +5 -0
  15. package/build/assets/sass/components/loader.sass +51 -0
  16. package/build/assets/sass/components/model.sass +14 -0
  17. package/build/assets/sass/components/panorama.sass +65 -0
  18. package/build/assets/sass/components/tabs.sass +66 -0
  19. package/build/assets/sass/index.sass +3 -0
  20. package/build/components/Application.js +12 -2
  21. package/build/components/Loader.js +22 -0
  22. package/build/components/ModelTab.js +120 -0
  23. package/build/components/PanoramaTab.js +215 -0
  24. package/build/config/defaultConfig.js +4 -1
  25. package/build/config/defaultJSON.js +2432 -0
  26. package/build/index.css +1 -1
  27. package/build/index.css.map +1 -1
  28. package/build/index.js +32 -8
  29. package/build/store/houseStore.js +675 -0
  30. package/build/store/modelStore.js +196 -0
  31. package/build/utils/csg/csg-lib.js +387 -0
  32. package/build/utils/csg/csg-worker.js +94 -0
  33. package/build/utils/csg/three-csg.js +280 -0
  34. package/build/utils/modelHelpers.js +125 -0
  35. package/build/utils/panoramaHelpers.js +83 -0
  36. package/package.json +17 -3
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ require("core-js/modules/es.array.reduce.js");
9
+
10
+ require("core-js/modules/es.string.includes.js");
11
+
12
+ require("core-js/modules/web.dom-collections.iterator.js");
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var THREE = _interopRequireWildcard(require("three"));
17
+
18
+ var PANOLENS = _interopRequireWildcard(require("panolens"));
19
+
20
+ var _threeDeviceOrientation = _interopRequireDefault(require("three-device-orientation"));
21
+
22
+ var _Loader = _interopRequireDefault(require("./Loader"));
23
+
24
+ var _panoramaHelpers = require("../utils/panoramaHelpers");
25
+
26
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
+
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+
30
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
+
32
+ const {
33
+ DEVICEORIENTATION,
34
+ ORBIT
35
+ } = PANOLENS.CONTROLS;
36
+ const pathName = 'Panorama_0_0_';
37
+
38
+ const getPanoramas = (json, images, setLoadingState) => {
39
+ return json.Floors[0].Units[0].Rooms.reduce((acc, jsonRoom, index) => {
40
+ const image = images.find(img => img.includes(pathName + index));
41
+ if (!image) return acc;
42
+ const panorama = new PANOLENS.ImagePanorama(image);
43
+ panorama['panorama_id'] = index + 1;
44
+ panorama['room_id'] = jsonRoom.ID;
45
+ panorama.addEventListener('progress', event => {
46
+ setLoadingState(true);
47
+
48
+ if (event.progress.loaded / event.progress.total * 100 === 100) {
49
+ setLoadingState(false);
50
+ }
51
+ });
52
+ panorama.addEventListener('enter', () => setLoadingState(false));
53
+ acc.push(panorama);
54
+ return acc;
55
+ }, []);
56
+ };
57
+
58
+ const getPanoramaRooms = (json, panoramas) => {
59
+ const {
60
+ Vertices,
61
+ Floors
62
+ } = json;
63
+ const {
64
+ Walls
65
+ } = Floors[0];
66
+ return panoramas.map((panorama, index) => {
67
+ const currentRoom = Floors[0].Units[0].Rooms.find(room => room.ID === panorama['room_id']);
68
+ const {
69
+ left,
70
+ top
71
+ } = (0, _panoramaHelpers.findRoomCenter)(currentRoom, Walls, Vertices);
72
+ return {
73
+ type: currentRoom.Type,
74
+ id: index,
75
+ panorama,
76
+ left,
77
+ top
78
+ };
79
+ }, []);
80
+ };
81
+
82
+ const initPanorama = () => {
83
+ let camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1100);
84
+ let controls = new _threeDeviceOrientation.default(camera);
85
+ window.addEventListener('resize', () => {
86
+ camera.aspect = window.innerWidth / window.innerHeight;
87
+ camera.updateProjectionMatrix();
88
+ });
89
+
90
+ const animate = () => {
91
+ window.requestAnimationFrame(animate);
92
+ controls.update();
93
+ };
94
+
95
+ animate();
96
+
97
+ if (DeviceOrientationEvent.requestPermission) {
98
+ DeviceOrientationEvent.requestPermission().catch(() => console.log('Device motion not allowed'));
99
+ }
100
+
101
+ return {
102
+ camera,
103
+ controls
104
+ };
105
+ };
106
+
107
+ const PanoramaTab = _ref => {
108
+ let {
109
+ json,
110
+ planImage,
111
+ images
112
+ } = _ref;
113
+ const [menuState, setMenuState] = (0, _react.useState)(false);
114
+ const [loadingState, setLoadingState] = (0, _react.useState)(true);
115
+ const [isMapActive, setMapState] = (0, _react.useState)(false);
116
+ const [currentRoomIndex, setCurrentRoomIndex] = (0, _react.useState)(0);
117
+ const [panoramas] = (0, _react.useState)(getPanoramas(json, images, setLoadingState));
118
+ const [panoramaRooms] = (0, _react.useState)(getPanoramaRooms(json, panoramas));
119
+ const [viewer, setViewer] = (0, _react.useState)(null);
120
+ const [planScale, setPlanScale] = (0, _react.useState)({
121
+ X: 1,
122
+ Y: 1
123
+ });
124
+
125
+ const changePanorama = (panorama, index) => {
126
+ setCurrentRoomIndex(index);
127
+ viewer.setPanorama(panorama);
128
+ };
129
+
130
+ const toggleVrMode = () => {
131
+ if (viewer.mode === 3) {
132
+ viewer.disableEffect();
133
+ return;
134
+ }
135
+
136
+ viewer.enableEffect(PANOLENS.MODES.STEREO);
137
+ };
138
+
139
+ const toggleOrientationMode = () => {
140
+ if (viewer.control.id === 'orbit') {
141
+ viewer.enableControl(DEVICEORIENTATION);
142
+ return;
143
+ }
144
+
145
+ viewer.enableControl(ORBIT);
146
+ };
147
+
148
+ const toggleMap = () => setMapState(!isMapActive);
149
+
150
+ const setScale = () => {
151
+ const image = document.querySelector('.widget-tab__panorama-map img');
152
+ setPlanScale((0, _panoramaHelpers.getScale)(image, json));
153
+ };
154
+
155
+ const getDotClassName = index => {
156
+ let className = 'widget-tab__panorama-map__dot';
157
+ if (isMapActive) className += ' widget-tab__panorama-map__dot--big';
158
+ if (currentRoomIndex === index) className += ' widget-tab__panorama-map__dot--active';
159
+ return className;
160
+ };
161
+
162
+ (0, _react.useEffect)(() => {
163
+ const newViewer = new PANOLENS.Viewer({
164
+ container: document.querySelector('.widget-tab__panorama-overlay'),
165
+ autoHideInfospot: false,
166
+ controlButtons: [],
167
+ cameraFov: 90
168
+ });
169
+ panoramas.forEach(panorama => {
170
+ if (!panorama.panorama_id) return;
171
+ newViewer.add(panorama);
172
+ });
173
+ setViewer(newViewer);
174
+ initPanorama();
175
+ }, [panoramas]);
176
+ (0, _react.useEffect)(setScale, [json, isMapActive]);
177
+ return /*#__PURE__*/_react.default.createElement("div", {
178
+ className: "widget-tab__panorama"
179
+ }, /*#__PURE__*/_react.default.createElement("div", {
180
+ className: "widget-tab__panorama-overlay"
181
+ }), loadingState && /*#__PURE__*/_react.default.createElement(_Loader.default, {
182
+ absolute: true
183
+ }), /*#__PURE__*/_react.default.createElement("div", {
184
+ className: "widget-tab-menu"
185
+ }, /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", {
186
+ onClick: () => setMenuState(!menuState)
187
+ }, "Rooms"), menuState && panoramaRooms.map((room, index) => /*#__PURE__*/_react.default.createElement("li", {
188
+ key: index,
189
+ onClick: () => changePanorama(room.panorama, index)
190
+ }, currentRoomIndex === index && '• ', " ", room.type)))), /*#__PURE__*/_react.default.createElement("div", {
191
+ className: "widget-tab__panorama-map ".concat(planImage ? '' : 'widget-tab__panorama-map--hidden')
192
+ }, /*#__PURE__*/_react.default.createElement("img", {
193
+ src: planImage,
194
+ className: isMapActive ? 'active' : '',
195
+ onClick: toggleMap,
196
+ alt: "plan"
197
+ }), panoramaRooms.map((room, index) => /*#__PURE__*/_react.default.createElement("div", {
198
+ key: index,
199
+ style: {
200
+ left: "".concat(room.left * planScale.X, "px"),
201
+ top: "".concat(room.top * planScale.Y, "px")
202
+ },
203
+ className: getDotClassName(index),
204
+ onClick: () => changePanorama(room.panorama, index)
205
+ }))), /*#__PURE__*/_react.default.createElement("button", {
206
+ className: "widget-tab__panorama-mode",
207
+ onClick: toggleVrMode
208
+ }, "VR"), /*#__PURE__*/_react.default.createElement("button", {
209
+ className: "widget-tab__panorama-standart",
210
+ onClick: toggleOrientationMode
211
+ }, "Standart"));
212
+ };
213
+
214
+ var _default = PanoramaTab;
215
+ exports.default = _default;
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
10
+ var _defaultJSON = _interopRequireDefault(require("./defaultJSON"));
11
+
10
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
13
 
12
14
  const defaultConfig = {
@@ -18,7 +20,8 @@ const defaultConfig = {
18
20
  topView: 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopView_0_0.png',
19
21
  topDownView: 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/MiddleCut_0_0_0.png',
20
22
  rotationImages: ['https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_0.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_1.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_2.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_3.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_4.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_5.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_6.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_7.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_8.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_9.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_10.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_11.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_12.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_13.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_14.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_15.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_16.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_17.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_18.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_19.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_20.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_21.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_22.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_23.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_24.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_25.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_26.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_27.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_28.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_29.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_30.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_31.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_32.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_33.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_34.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopDownView_0_0_35.png'],
21
- panoramaImages: ['https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_0.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_1.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_2.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_3.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_4.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_5.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_6.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_7.png']
23
+ panoramaImages: ['https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_0.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_1.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_2.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_3.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_4.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_5.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_6.png', 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/Panorama_0_0_7.png'],
24
+ json: _defaultJSON.default
22
25
  };
23
26
  var _default = defaultConfig;
24
27
  exports.default = _default;