hart-estate-widget 0.0.11 → 0.0.14
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.
- package/build/api/index.js +14 -5
- package/build/assets/sass/components/instructions.sass +3 -0
- package/build/assets/sass/components/loader.sass +2 -0
- package/build/assets/sass/components/model.sass +12 -0
- package/build/assets/sass/components/panorama.sass +2 -0
- package/build/components/Application.js +13 -3
- package/build/components/ImageTab.js +3 -2
- package/build/components/Instructions.js +2 -0
- package/build/components/Loader.js +3 -2
- package/build/components/ModelTab.js +34 -6
- package/build/components/PanoramaTab.js +30 -20
- package/build/components/TabPanes.js +7 -2
- package/build/components/TabWrapper.js +2 -0
- package/build/components/Widget.js +17 -3
- package/build/config/defaultConfig.js +7 -8
- package/build/index.js +8 -0
- package/build/store/apiStore.js +69 -0
- package/build/store/houseStore.js +8 -4
- package/build/store/modelStore.js +39 -7
- package/build/utils/modelHelpers.js +28 -2
- package/build/utils/panoramaHelpers.js +4 -0
- package/package.json +2 -5
package/build/api/index.js
CHANGED
@@ -3,20 +3,29 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.loadFurnitureData = exports.STAGE_API_URL = exports.
|
6
|
+
exports.loadFurnitureData = exports.STAGE_API_URL = exports.PRODUCTION_API_URL = void 0;
|
7
7
|
|
8
8
|
require("core-js/modules/es.promise.js");
|
9
9
|
|
10
10
|
require("core-js/modules/es.array.reduce.js");
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
13
|
+
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
15
|
+
|
16
|
+
const PRODUCTION_API_URL = 'https://backend.estate.myhart.ru';
|
17
|
+
exports.PRODUCTION_API_URL = PRODUCTION_API_URL;
|
14
18
|
const STAGE_API_URL = 'https://backend-stage.estate.myhart.ru';
|
15
19
|
exports.STAGE_API_URL = STAGE_API_URL;
|
20
|
+
const API_URL = {
|
21
|
+
'production': PRODUCTION_API_URL,
|
22
|
+
'stage': STAGE_API_URL
|
23
|
+
};
|
16
24
|
|
17
|
-
const loadFurnitureData = async furniture
|
25
|
+
const loadFurnitureData = async function loadFurnitureData(furniture) {
|
26
|
+
let env = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'production';
|
18
27
|
const furnitureQuery = furniture.reduce((acc, item, i) => acc += "".concat(i === 0 ? '' : ',').concat(item.Model), '');
|
19
|
-
const path = "".concat(API_URL, "/api/furniture?only=").concat(furnitureQuery);
|
28
|
+
const path = "".concat(API_URL[env], "/api/furniture?only=").concat(furnitureQuery);
|
20
29
|
const response = await fetch(path);
|
21
30
|
return await response.json();
|
22
31
|
};
|
@@ -12,3 +12,15 @@
|
|
12
12
|
width: 100%
|
13
13
|
height: 100%
|
14
14
|
display: block
|
15
|
+
&-joystick
|
16
|
+
position: absolute
|
17
|
+
left: 100px
|
18
|
+
bottom: 100px
|
19
|
+
opacity: 0
|
20
|
+
pointer-events: none
|
21
|
+
@media #{$mobile}
|
22
|
+
left: 50%
|
23
|
+
transform: translateX(-50%)
|
24
|
+
&--active
|
25
|
+
opacity: 1
|
26
|
+
pointer-events: unset
|
@@ -50,16 +50,20 @@ const Application = (0, _mobxReactLite.observer)(_ref => {
|
|
50
50
|
|
51
51
|
const tabsList = {
|
52
52
|
'planImage': /*#__PURE__*/_react.default.createElement(_ImageTab.default, {
|
53
|
-
image: config.planImage
|
53
|
+
image: config.planImage,
|
54
|
+
alt: "plan-view"
|
54
55
|
}),
|
55
56
|
'topView': /*#__PURE__*/_react.default.createElement(_ImageTab.default, {
|
56
|
-
image: config.topView
|
57
|
+
image: config.topView,
|
58
|
+
alt: "top-view"
|
57
59
|
}),
|
58
60
|
'topDownView': /*#__PURE__*/_react.default.createElement(_ImageTab.default, {
|
59
|
-
image: config.topDownView
|
61
|
+
image: config.topDownView,
|
62
|
+
alt: "top-down-view"
|
60
63
|
}),
|
61
64
|
'rotation': /*#__PURE__*/_react.default.createElement(_TabWrapper.default, {
|
62
65
|
isActive: !isTabPanesVisible,
|
66
|
+
disabled: !config.rotationImages[0],
|
63
67
|
image: config.rotationImages[0],
|
64
68
|
title: "360\xB0 overview",
|
65
69
|
text: ['Use mouse to rotate', 'Shift + LMB to move'],
|
@@ -69,6 +73,7 @@ const Application = (0, _mobxReactLite.observer)(_ref => {
|
|
69
73
|
})),
|
70
74
|
'panorama': /*#__PURE__*/_react.default.createElement(_TabWrapper.default, {
|
71
75
|
isActive: !isTabPanesVisible,
|
76
|
+
disabled: !config.panoramaImages[0],
|
72
77
|
image: config.panoramaImages[0],
|
73
78
|
title: "Panoramic tour",
|
74
79
|
text: ['Use mouse to rotate', 'To move through the rooms, click on the layout thumbnail'],
|
@@ -80,6 +85,7 @@ const Application = (0, _mobxReactLite.observer)(_ref => {
|
|
80
85
|
})),
|
81
86
|
'model': /*#__PURE__*/_react.default.createElement(_TabWrapper.default, {
|
82
87
|
isActive: !isTabPanesVisible,
|
88
|
+
disabled: !config.json,
|
83
89
|
image: _D.default,
|
84
90
|
title: "3D Model",
|
85
91
|
text: ['Use mouse to rotate', 'Use the right mouse button to move'],
|
@@ -101,6 +107,10 @@ const Application = (0, _mobxReactLite.observer)(_ref => {
|
|
101
107
|
window.addEventListener('resize', setWindowHeight);
|
102
108
|
setWindowHeight();
|
103
109
|
}, []);
|
110
|
+
(0, _react.useEffect)(() => {
|
111
|
+
if (config.tabs.some(tab => tab === currentTab)) return;
|
112
|
+
setCurrentTab(config.tabs[0]);
|
113
|
+
}, [config, currentTab]);
|
104
114
|
return /*#__PURE__*/_react.default.createElement("main", {
|
105
115
|
className: "widget-application",
|
106
116
|
style: appStyle
|
@@ -11,12 +11,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
11
11
|
|
12
12
|
const ImageTab = _ref => {
|
13
13
|
let {
|
14
|
-
image
|
14
|
+
image,
|
15
|
+
alt
|
15
16
|
} = _ref;
|
16
17
|
return /*#__PURE__*/_react.default.createElement("img", {
|
17
18
|
className: "widget-tab__image",
|
18
19
|
src: image,
|
19
|
-
alt:
|
20
|
+
alt: alt
|
20
21
|
});
|
21
22
|
};
|
22
23
|
|
@@ -13,6 +13,7 @@ const Instructions = _ref => {
|
|
13
13
|
let {
|
14
14
|
title,
|
15
15
|
text,
|
16
|
+
disabled,
|
16
17
|
onClick
|
17
18
|
} = _ref;
|
18
19
|
return /*#__PURE__*/_react.default.createElement("div", {
|
@@ -28,6 +29,7 @@ const Instructions = _ref => {
|
|
28
29
|
}, row))), /*#__PURE__*/_react.default.createElement("div", {
|
29
30
|
className: "widget-instructions__footer"
|
30
31
|
}, /*#__PURE__*/_react.default.createElement("button", {
|
32
|
+
disabled: disabled,
|
31
33
|
onClick: onClick,
|
32
34
|
type: "button"
|
33
35
|
}, "Start"))));
|
@@ -11,10 +11,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
11
11
|
|
12
12
|
const Loader = _ref => {
|
13
13
|
let {
|
14
|
-
absolute
|
14
|
+
absolute,
|
15
|
+
size = 'lg'
|
15
16
|
} = _ref;
|
16
17
|
return /*#__PURE__*/_react.default.createElement("div", {
|
17
|
-
className: "widget-loader ".concat(absolute ? 'widget-loader--absolute' : '')
|
18
|
+
className: "widget-loader widget-loader--".concat(size, " ").concat(absolute ? 'widget-loader--absolute' : '')
|
18
19
|
}, /*#__PURE__*/_react.default.createElement("div", null), /*#__PURE__*/_react.default.createElement("div", null), /*#__PURE__*/_react.default.createElement("div", null), /*#__PURE__*/_react.default.createElement("div", null));
|
19
20
|
};
|
20
21
|
|
@@ -13,6 +13,10 @@ var _mobxReactLite = require("mobx-react-lite");
|
|
13
13
|
|
14
14
|
var _modelStore = _interopRequireDefault(require("../store/modelStore"));
|
15
15
|
|
16
|
+
var _modelHelpers = require("../utils/modelHelpers");
|
17
|
+
|
18
|
+
var _nipplejs = _interopRequireDefault(require("nipplejs"));
|
19
|
+
|
16
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17
21
|
|
18
22
|
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); }
|
@@ -45,16 +49,38 @@ const ModelTab = (0, _mobxReactLite.observer)(_ref => {
|
|
45
49
|
|
46
50
|
_modelStore.default.init(json);
|
47
51
|
}, [json]);
|
52
|
+
(0, _react.useEffect)(() => {
|
53
|
+
const joystick = _nipplejs.default.create({
|
54
|
+
zone: document.querySelector('.widget-tab__model-joystick'),
|
55
|
+
color: '#F4C833',
|
56
|
+
mode: 'static',
|
57
|
+
position: {
|
58
|
+
left: '50%',
|
59
|
+
top: '50%'
|
60
|
+
}
|
61
|
+
});
|
62
|
+
|
63
|
+
joystick.on('start', () => _modelStore.default.setJoystickState(true));
|
64
|
+
joystick.on('end', () => _modelStore.default.setJoystickState(false));
|
65
|
+
joystick.on('move', (_, _ref2) => {
|
66
|
+
let {
|
67
|
+
angle
|
68
|
+
} = _ref2;
|
69
|
+
const directions = (0, _modelHelpers.getDirectionsFromDegrees)(angle.degree);
|
70
|
+
|
71
|
+
_modelStore.default.setJoystickDirections(directions);
|
72
|
+
});
|
73
|
+
}, []);
|
48
74
|
|
49
75
|
const getNextWallsMaterialType = () => {
|
50
76
|
if (houseStore.wallsMaterialType === 'texture') return 'color';
|
51
77
|
return 'texture';
|
52
78
|
};
|
53
79
|
|
54
|
-
const onImageUploaded =
|
80
|
+
const onImageUploaded = _ref3 => {
|
55
81
|
let {
|
56
82
|
target
|
57
|
-
} =
|
83
|
+
} = _ref3;
|
58
84
|
if (!target.files.length) return;
|
59
85
|
const reader = new FileReader();
|
60
86
|
|
@@ -67,6 +93,8 @@ const ModelTab = (0, _mobxReactLite.observer)(_ref => {
|
|
67
93
|
className: "widget-tab__model"
|
68
94
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
69
95
|
className: "widget-tab__model-scene"
|
96
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
97
|
+
className: "widget-tab__model-joystick \n ".concat(_modelStore.default.currentControlsType === 'wasd' ? 'widget-tab__model-joystick--active' : '')
|
70
98
|
}), /*#__PURE__*/_react.default.createElement("div", {
|
71
99
|
className: "widget-tab-menu"
|
72
100
|
}, /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", {
|
@@ -87,10 +115,10 @@ const ModelTab = (0, _mobxReactLite.observer)(_ref => {
|
|
87
115
|
onClick: () => houseStore.setCurrentWallsMaterialType(getNextWallsMaterialType())
|
88
116
|
}, "Material: ", houseStore.wallsMaterialType === 'texture' ? 'Texture' : 'Color'), /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("label", null, "Wall color:", /*#__PURE__*/_react.default.createElement("input", {
|
89
117
|
type: "color",
|
90
|
-
onChange:
|
118
|
+
onChange: _ref4 => {
|
91
119
|
let {
|
92
120
|
target
|
93
|
-
} =
|
121
|
+
} = _ref4;
|
94
122
|
return houseStore.setCurrentWallColor(target.value);
|
95
123
|
},
|
96
124
|
style: {
|
@@ -99,11 +127,11 @@ const ModelTab = (0, _mobxReactLite.observer)(_ref => {
|
|
99
127
|
value: houseStore.wallsColor
|
100
128
|
}))), /*#__PURE__*/_react.default.createElement("li", null, "Wall texture:", /*#__PURE__*/_react.default.createElement("div", {
|
101
129
|
className: "widget-tab-menu__wallpapers"
|
102
|
-
}, houseStore && houseStore.wallsTextures.map((
|
130
|
+
}, houseStore && houseStore.wallsTextures.map((_ref5, index) => {
|
103
131
|
let {
|
104
132
|
image,
|
105
133
|
texture
|
106
|
-
} =
|
134
|
+
} = _ref5;
|
107
135
|
return /*#__PURE__*/_react.default.createElement("img", {
|
108
136
|
key: index,
|
109
137
|
src: image,
|
@@ -35,40 +35,49 @@ const {
|
|
35
35
|
} = PANOLENS.CONTROLS;
|
36
36
|
const pathName = 'Panorama_0_0_';
|
37
37
|
|
38
|
+
const createPanorama = (image, index, setLoadingState) => {
|
39
|
+
const panorama = new PANOLENS.ImagePanorama(image);
|
40
|
+
panorama['panorama_id'] = index + 1;
|
41
|
+
panorama.addEventListener('progress', event => {
|
42
|
+
setLoadingState(true);
|
43
|
+
|
44
|
+
if (event.progress.loaded / event.progress.total * 100 === 100) {
|
45
|
+
setLoadingState(false);
|
46
|
+
}
|
47
|
+
});
|
48
|
+
panorama.addEventListener('enter', () => setLoadingState(false));
|
49
|
+
return panorama;
|
50
|
+
};
|
51
|
+
|
38
52
|
const getPanoramas = (json, images, setLoadingState) => {
|
53
|
+
if (!json) return images.map((image, index) => createPanorama(image, index, setLoadingState));
|
39
54
|
return json.Floors[0].Units[0].Rooms.reduce((acc, jsonRoom, index) => {
|
40
55
|
const image = images.find(img => img.includes(pathName + index));
|
41
56
|
if (!image) return acc;
|
42
|
-
const panorama =
|
43
|
-
panorama['panorama_id'] = index + 1;
|
57
|
+
const panorama = createPanorama(image, index, setLoadingState);
|
44
58
|
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
59
|
acc.push(panorama);
|
54
60
|
return acc;
|
55
61
|
}, []);
|
56
62
|
};
|
57
63
|
|
58
64
|
const getPanoramaRooms = (json, panoramas) => {
|
59
|
-
const {
|
60
|
-
Vertices,
|
61
|
-
Floors
|
62
|
-
} = json;
|
63
|
-
const {
|
64
|
-
Walls
|
65
|
-
} = Floors[0];
|
66
65
|
return panoramas.map((panorama, index) => {
|
67
|
-
|
66
|
+
let currentRoom = {
|
67
|
+
Type: "Room - ".concat(panorama['panorama_id'])
|
68
|
+
};
|
69
|
+
|
70
|
+
if (json) {
|
71
|
+
currentRoom = json.Floors[0].Units[0].Rooms.find(room => room.ID === panorama['room_id']);
|
72
|
+
}
|
73
|
+
|
68
74
|
const {
|
69
75
|
left,
|
70
76
|
top
|
71
|
-
} = (0, _panoramaHelpers.findRoomCenter)(currentRoom, Walls, Vertices)
|
77
|
+
} = json ? (0, _panoramaHelpers.findRoomCenter)(currentRoom, json.Floors[0].Walls, json.Vertices) : {
|
78
|
+
left: 0,
|
79
|
+
top: 0
|
80
|
+
};
|
72
81
|
return {
|
73
82
|
type: currentRoom.Type,
|
74
83
|
id: index,
|
@@ -121,6 +130,7 @@ const PanoramaTab = _ref => {
|
|
121
130
|
X: 1,
|
122
131
|
Y: 1
|
123
132
|
});
|
133
|
+
const isMapDisabled = !json;
|
124
134
|
|
125
135
|
const changePanorama = (panorama, index) => {
|
126
136
|
setCurrentRoomIndex(index);
|
@@ -194,7 +204,7 @@ const PanoramaTab = _ref => {
|
|
194
204
|
className: isMapActive ? 'active' : '',
|
195
205
|
onClick: toggleMap,
|
196
206
|
alt: "plan"
|
197
|
-
}), panoramaRooms.map((room, index) => /*#__PURE__*/_react.default.createElement("div", {
|
207
|
+
}), !isMapDisabled && panoramaRooms.map((room, index) => /*#__PURE__*/_react.default.createElement("div", {
|
198
208
|
key: index,
|
199
209
|
style: {
|
200
210
|
left: "".concat(room.left * planScale.X, "px"),
|
@@ -11,6 +11,8 @@ var _mobxReactLite = require("mobx-react-lite");
|
|
11
11
|
|
12
12
|
var _store = _interopRequireDefault(require("../store"));
|
13
13
|
|
14
|
+
var _Loader = _interopRequireDefault(require("./Loader"));
|
15
|
+
|
14
16
|
var _refreshIcon = _interopRequireDefault(require("../assets/img/refresh-icon.svg"));
|
15
17
|
|
16
18
|
var _D = _interopRequireDefault(require("../assets/img/3D.jpg"));
|
@@ -77,7 +79,10 @@ const TabPane = _ref2 => {
|
|
77
79
|
return /*#__PURE__*/_react.default.createElement("div", {
|
78
80
|
className: "widget-tab-pane ".concat(active ? 'widget-tab-pane--active' : ''),
|
79
81
|
onClick: onClick
|
80
|
-
}, /*#__PURE__*/_react.default.createElement(
|
82
|
+
}, !image && /*#__PURE__*/_react.default.createElement(_Loader.default, {
|
83
|
+
absolute: true,
|
84
|
+
size: "sm"
|
85
|
+
}), image && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("img", {
|
81
86
|
className: "widget-tab-pane__image",
|
82
87
|
src: image,
|
83
88
|
alt: "tab-pane"
|
@@ -85,7 +90,7 @@ const TabPane = _ref2 => {
|
|
85
90
|
className: "widget-tab-pane__icon",
|
86
91
|
src: icon,
|
87
92
|
alt: "tab-pane-icon"
|
88
|
-
}));
|
93
|
+
})));
|
89
94
|
};
|
90
95
|
|
91
96
|
var _default = TabPanes;
|
@@ -19,6 +19,7 @@ const TabWrapper = _ref => {
|
|
19
19
|
image,
|
20
20
|
title,
|
21
21
|
text,
|
22
|
+
disabled,
|
22
23
|
onStart,
|
23
24
|
children
|
24
25
|
} = _ref;
|
@@ -27,6 +28,7 @@ const TabWrapper = _ref => {
|
|
27
28
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ImageTab.default, {
|
28
29
|
image: image
|
29
30
|
}), /*#__PURE__*/_react.default.createElement(_Instructions.default, {
|
31
|
+
disabled: disabled,
|
30
32
|
title: title,
|
31
33
|
text: text,
|
32
34
|
onClick: onStart
|
@@ -5,8 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
7
|
|
8
|
-
require("core-js/modules/es.object.assign.js");
|
9
|
-
|
10
8
|
var _react = _interopRequireDefault(require("react"));
|
11
9
|
|
12
10
|
var _reactDom = _interopRequireDefault(require("react-dom"));
|
@@ -19,10 +17,18 @@ var _defaultConfig = _interopRequireDefault(require("../config/defaultConfig"));
|
|
19
17
|
|
20
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
21
19
|
|
20
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
21
|
+
|
22
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
23
|
+
|
24
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
25
|
+
|
22
26
|
class Widget {
|
23
27
|
constructor(container) {
|
24
28
|
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
25
|
-
|
29
|
+
|
30
|
+
const config = _objectSpread(_objectSpread({}, _defaultConfig.default), options);
|
31
|
+
|
26
32
|
const widgetContainer = document.querySelector(container);
|
27
33
|
if (!widgetContainer) throw new Error("\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043D\u0430\u0439\u0442\u0438 \u044D\u043B\u0435\u043C\u0435\u043D\u0442: #".concat(container));
|
28
34
|
config.containerElement = widgetContainer;
|
@@ -35,6 +41,14 @@ class Widget {
|
|
35
41
|
}), widgetContainer);
|
36
42
|
}
|
37
43
|
|
44
|
+
get options() {
|
45
|
+
return _store.default.config;
|
46
|
+
}
|
47
|
+
|
48
|
+
updateOptions(config) {
|
49
|
+
_store.default.setConfig(_objectSpread(_objectSpread({}, this.options), config));
|
50
|
+
}
|
51
|
+
|
38
52
|
}
|
39
53
|
|
40
54
|
var _default = Widget;
|
@@ -7,8 +7,6 @@ exports.default = void 0;
|
|
7
7
|
|
8
8
|
var _react = _interopRequireDefault(require("react"));
|
9
9
|
|
10
|
-
var _defaultJSON = _interopRequireDefault(require("./defaultJSON"));
|
11
|
-
|
12
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
11
|
|
14
12
|
const defaultConfig = {
|
@@ -16,12 +14,13 @@ const defaultConfig = {
|
|
16
14
|
tabPanes: true,
|
17
15
|
width: null,
|
18
16
|
height: null,
|
19
|
-
planImage:
|
20
|
-
topView:
|
21
|
-
topDownView:
|
22
|
-
rotationImages: [
|
23
|
-
panoramaImages: [
|
24
|
-
json:
|
17
|
+
planImage: null,
|
18
|
+
topView: null,
|
19
|
+
topDownView: null,
|
20
|
+
rotationImages: [],
|
21
|
+
panoramaImages: [],
|
22
|
+
json: null,
|
23
|
+
env: 'production'
|
25
24
|
};
|
26
25
|
var _default = defaultConfig;
|
27
26
|
exports.default = _default;
|
package/build/index.js
CHANGED
@@ -3,6 +3,12 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
+
Object.defineProperty(exports, "ApiStore", {
|
7
|
+
enumerable: true,
|
8
|
+
get: function get() {
|
9
|
+
return _apiStore.default;
|
10
|
+
}
|
11
|
+
});
|
6
12
|
Object.defineProperty(exports, "ImageTab", {
|
7
13
|
enumerable: true,
|
8
14
|
get: function get() {
|
@@ -70,4 +76,6 @@ var _ModelTab = _interopRequireDefault(require("./components/ModelTab"));
|
|
70
76
|
|
71
77
|
var _Loader = _interopRequireDefault(require("./components/Loader"));
|
72
78
|
|
79
|
+
var _apiStore = _interopRequireDefault(require("./store/apiStore"));
|
80
|
+
|
73
81
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
@@ -0,0 +1,69 @@
|
|
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.promise.js");
|
9
|
+
|
10
|
+
require("core-js/modules/es.array.reduce.js");
|
11
|
+
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
13
|
+
|
14
|
+
var _mobx = require("mobx");
|
15
|
+
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
17
|
+
|
18
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
19
|
+
|
20
|
+
(0, _mobx.configure)({
|
21
|
+
useProxies: 'never'
|
22
|
+
});
|
23
|
+
|
24
|
+
class ApiStore {
|
25
|
+
constructor() {
|
26
|
+
let env = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'production';
|
27
|
+
|
28
|
+
_defineProperty(this, "PRODUCTION_API_URL", 'https://backend.estate.myhart.ru');
|
29
|
+
|
30
|
+
_defineProperty(this, "STAGE_API_URL", 'https://backend-stage.estate.myhart.ru');
|
31
|
+
|
32
|
+
_defineProperty(this, "env", null);
|
33
|
+
|
34
|
+
_defineProperty(this, "loadFurnitureData", async furniture => {
|
35
|
+
const furnitureQuery = furniture.reduce((acc, item, i) => acc += "".concat(i === 0 ? '' : ',').concat(item.Model), '');
|
36
|
+
const path = "".concat(this.API_URL, "/api/furniture?only=").concat(furnitureQuery);
|
37
|
+
const response = await fetch(path);
|
38
|
+
return await response.json();
|
39
|
+
});
|
40
|
+
|
41
|
+
_defineProperty(this, "loadWidgetData", async planId => {
|
42
|
+
const path = "".concat(this.API_URL, "/api/plans/").concat(planId, "/widget");
|
43
|
+
const response = await fetch(path);
|
44
|
+
return await response.json();
|
45
|
+
});
|
46
|
+
|
47
|
+
_defineProperty(this, "loadPanoramaData", async planId => {
|
48
|
+
const path = "".concat(this.API_URL, "/api/plans/").concat(planId, "/panorama");
|
49
|
+
const response = await fetch(path);
|
50
|
+
return await response.json();
|
51
|
+
});
|
52
|
+
|
53
|
+
_defineProperty(this, "loadJson", async path => {
|
54
|
+
const response = await fetch(path);
|
55
|
+
return await response.json();
|
56
|
+
});
|
57
|
+
|
58
|
+
(0, _mobx.makeAutoObservable)(this);
|
59
|
+
this.env = env;
|
60
|
+
}
|
61
|
+
|
62
|
+
get API_URL() {
|
63
|
+
return this.env === 'stage' ? this.STAGE_API_URL : this.PRODUCTION_API_URL;
|
64
|
+
}
|
65
|
+
|
66
|
+
}
|
67
|
+
|
68
|
+
var _default = ApiStore;
|
69
|
+
exports.default = _default;
|
@@ -15,7 +15,9 @@ var _react = _interopRequireDefault(require("react"));
|
|
15
15
|
|
16
16
|
var _mobx = require("mobx");
|
17
17
|
|
18
|
-
var
|
18
|
+
var _apiStore = _interopRequireDefault(require("../store/apiStore"));
|
19
|
+
|
20
|
+
var _store = _interopRequireDefault(require("../store"));
|
19
21
|
|
20
22
|
var THREE = _interopRequireWildcard(require("three"));
|
21
23
|
|
@@ -57,6 +59,8 @@ class HouseStore {
|
|
57
59
|
constructor(modelStore) {
|
58
60
|
_defineProperty(this, "modelStore", null);
|
59
61
|
|
62
|
+
_defineProperty(this, "apiStore", new _apiStore.default(_store.default.config.env));
|
63
|
+
|
60
64
|
_defineProperty(this, "houseGroup", new THREE.Group());
|
61
65
|
|
62
66
|
_defineProperty(this, "wallsGroup", new THREE.Group());
|
@@ -96,7 +100,7 @@ class HouseStore {
|
|
96
100
|
this.setCenterPosition().loadTextures().then(() => {
|
97
101
|
this.createFloors().createSpaceBetweenWalls().createWalls().createDoors();
|
98
102
|
});
|
99
|
-
|
103
|
+
this.apiStore.loadFurnitureData(this.furniture).then(resp => {
|
100
104
|
this.furnitureData = resp;
|
101
105
|
this.loadFurniture(0);
|
102
106
|
});
|
@@ -514,7 +518,7 @@ class HouseStore {
|
|
514
518
|
mesh,
|
515
519
|
textures
|
516
520
|
} = furnitureData;
|
517
|
-
const modelPath = "".concat(
|
521
|
+
const modelPath = "".concat(this.apiStore.API_URL, "/storage/furniture/").concat(mesh);
|
518
522
|
const {
|
519
523
|
Location,
|
520
524
|
Rotation,
|
@@ -526,7 +530,7 @@ class HouseStore {
|
|
526
530
|
Z
|
527
531
|
} = Location;
|
528
532
|
const promises = textures.map(url => {
|
529
|
-
const texturePath = "".concat(
|
533
|
+
const texturePath = "".concat(this.apiStore.API_URL, "/storage/furniture/").concat(url);
|
530
534
|
return new Promise(resolve => {
|
531
535
|
this.textureLoader.load(texturePath, texture => resolve(texture));
|
532
536
|
});
|
@@ -57,6 +57,12 @@ class ModelStore {
|
|
57
57
|
|
58
58
|
_defineProperty(this, "wallsHeight", 280 * this.sceneScale);
|
59
59
|
|
60
|
+
_defineProperty(this, "currentControlsType", 'orbit');
|
61
|
+
|
62
|
+
_defineProperty(this, "isJoystickActive", false);
|
63
|
+
|
64
|
+
_defineProperty(this, "joystickDirections", []);
|
65
|
+
|
60
66
|
_defineProperty(this, "init", json => {
|
61
67
|
this.json = json;
|
62
68
|
this.initialized = true;
|
@@ -64,15 +70,21 @@ class ModelStore {
|
|
64
70
|
this.scene.add(this.houseStore.houseGroup);
|
65
71
|
});
|
66
72
|
|
73
|
+
_defineProperty(this, "setJoystickState", value => {
|
74
|
+
this.isJoystickActive = value;
|
75
|
+
});
|
76
|
+
|
77
|
+
_defineProperty(this, "setJoystickDirections", directions => {
|
78
|
+
this.joystickDirections = directions;
|
79
|
+
});
|
80
|
+
|
67
81
|
_defineProperty(this, "createScene", () => {
|
68
82
|
this.scene = new THREE.Scene();
|
69
83
|
const light = new THREE.AmbientLight(0xffffff);
|
70
84
|
this.scene.rotation.x = -Math.PI / 2;
|
71
85
|
this.scene.scale.y = -1;
|
72
86
|
this.scene.background = new THREE.Color('#FAFAFA');
|
73
|
-
this.scene.add(light);
|
74
|
-
// this.scene.add( axesHelper );
|
75
|
-
|
87
|
+
this.scene.add(light);
|
76
88
|
this.createGround();
|
77
89
|
return this;
|
78
90
|
});
|
@@ -118,11 +130,31 @@ class ModelStore {
|
|
118
130
|
this.controls.maxPolarAngle = Math.PI / 2.1;
|
119
131
|
this.setDefaultControls(Math.PI / 4);
|
120
132
|
this.controls.verticalDragToForward = true;
|
121
|
-
this.
|
133
|
+
this.currentControlsType = 'orbit';
|
122
134
|
|
123
135
|
const animate = () => {
|
124
136
|
this.controls.update(this.clock.getDelta());
|
125
137
|
window.requestAnimationFrame(animate);
|
138
|
+
const distance = 0.2;
|
139
|
+
|
140
|
+
if (this.isJoystickActive) {
|
141
|
+
if (this.joystickDirections.some(direction => direction === 'forward')) {
|
142
|
+
this.controls.forward(distance, true);
|
143
|
+
}
|
144
|
+
|
145
|
+
if (this.joystickDirections.some(direction => direction === 'backward')) {
|
146
|
+
this.controls.forward(-distance, true);
|
147
|
+
}
|
148
|
+
|
149
|
+
if (this.joystickDirections.some(direction => direction === 'right')) {
|
150
|
+
this.controls.truck(distance, 0, true);
|
151
|
+
}
|
152
|
+
|
153
|
+
if (this.joystickDirections.some(direction => direction === 'left')) {
|
154
|
+
this.controls.truck(-distance, 0, true);
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
126
158
|
this.renderer.render(this.scene, this.camera);
|
127
159
|
};
|
128
160
|
|
@@ -134,12 +166,12 @@ class ModelStore {
|
|
134
166
|
this.controls.dollyTo(20, true);
|
135
167
|
this.controls.moveTo(0, 0, 0, true);
|
136
168
|
this.controls.mouseButtons.wheel = _cameraControls.default.ACTION.DOLLY;
|
137
|
-
this.controls.touches.two = _cameraControls.default.ACTION.
|
169
|
+
this.controls.touches.two = _cameraControls.default.ACTION.TOUCH_DOLLY_TRUCK;
|
138
170
|
this.controls.rotateTo(0, angle, true); // this.destroyNipple();
|
139
171
|
});
|
140
172
|
|
141
173
|
_defineProperty(this, "setCurrentControlsType", type => {
|
142
|
-
this.
|
174
|
+
this.currentControlsType = type;
|
143
175
|
const EPS = 1e-5;
|
144
176
|
|
145
177
|
if (type === 'orbit') {
|
@@ -173,7 +205,7 @@ class ModelStore {
|
|
173
205
|
callback
|
174
206
|
} = _ref;
|
175
207
|
keys.forEach(key => key.addEventListener('holding', () => {
|
176
|
-
if (this.
|
208
|
+
if (this.currentControlsType !== 'wasd') return;
|
177
209
|
callback();
|
178
210
|
}));
|
179
211
|
});
|
@@ -5,7 +5,7 @@ require("core-js/modules/web.dom-collections.iterator.js");
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
6
6
|
value: true
|
7
7
|
});
|
8
|
-
exports.getMinMaxCoordinates = exports.getKeyEvents = exports.getFloorParams = void 0;
|
8
|
+
exports.getMinMaxCoordinates = exports.getKeyEvents = exports.getFloorParams = exports.getDirectionsFromDegrees = void 0;
|
9
9
|
|
10
10
|
var _react = _interopRequireDefault(require("react"));
|
11
11
|
|
@@ -122,4 +122,30 @@ const getMinMaxCoordinates = walls => {
|
|
122
122
|
};
|
123
123
|
};
|
124
124
|
|
125
|
-
exports.getMinMaxCoordinates = getMinMaxCoordinates;
|
125
|
+
exports.getMinMaxCoordinates = getMinMaxCoordinates;
|
126
|
+
|
127
|
+
const getDirectionsFromDegrees = deg => {
|
128
|
+
let directions = [];
|
129
|
+
|
130
|
+
if (deg > 80 && deg < 100) {
|
131
|
+
directions = ['forward'];
|
132
|
+
} else if (deg > 10 && deg < 80) {
|
133
|
+
directions = ['forward', 'right'];
|
134
|
+
} else if (deg > 100 && deg < 170) {
|
135
|
+
directions = ['forward', 'left'];
|
136
|
+
} else if (deg > 260 && deg < 280) {
|
137
|
+
directions = ['backward'];
|
138
|
+
} else if (deg > 190 && deg < 260) {
|
139
|
+
directions = ['backward', 'left'];
|
140
|
+
} else if (deg > 280 && deg < 350) {
|
141
|
+
directions = ['backward', 'right'];
|
142
|
+
} else if (deg > 350 || deg < 10) {
|
143
|
+
directions = ['right'];
|
144
|
+
} else if (deg > 170 && deg < 190) {
|
145
|
+
directions = ['left'];
|
146
|
+
}
|
147
|
+
|
148
|
+
return directions;
|
149
|
+
};
|
150
|
+
|
151
|
+
exports.getDirectionsFromDegrees = getDirectionsFromDegrees;
|
@@ -68,6 +68,10 @@ const findRoomCenter = (room, walls, vertices) => {
|
|
68
68
|
exports.findRoomCenter = findRoomCenter;
|
69
69
|
|
70
70
|
const getScale = (image, json) => {
|
71
|
+
if (!json) return {
|
72
|
+
X: 1,
|
73
|
+
Y: 1
|
74
|
+
};
|
71
75
|
const imageWidth = image.width;
|
72
76
|
const imageHeight = image.height;
|
73
77
|
const baseImageWidth = 1024;
|
package/package.json
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
"description": "HART Estate widget",
|
4
4
|
"author": "HART",
|
5
5
|
"keywords": [],
|
6
|
-
"version": "0.0.
|
6
|
+
"version": "0.0.14",
|
7
7
|
"private": false,
|
8
8
|
"main": "build/index.js",
|
9
9
|
"module": "build/index.js",
|
@@ -11,10 +11,6 @@
|
|
11
11
|
"build",
|
12
12
|
"README.md"
|
13
13
|
],
|
14
|
-
"repository": {
|
15
|
-
"type": "git",
|
16
|
-
"url": "https://gitlab.myhart.ru/hart_estate/hart-estate-widget"
|
17
|
-
},
|
18
14
|
"scripts": {
|
19
15
|
"start": "babel src --watch --out-dir build --copy-files",
|
20
16
|
"start-example": "cd ./example && npm run start",
|
@@ -27,6 +23,7 @@
|
|
27
23
|
"hold-event": "^0.1.0",
|
28
24
|
"mobx": "^6.3.13",
|
29
25
|
"mobx-react-lite": "^3.2.3",
|
26
|
+
"nipplejs": "^0.9.0",
|
30
27
|
"panolens": "^0.12.1",
|
31
28
|
"panzoom": "^9.4.2",
|
32
29
|
"react": "^17.0.2",
|