hart-estate-widget 0.0.9 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/build/api/index.js +33 -0
- package/build/assets/img/bricks.jpeg +0 -0
- package/build/assets/img/door-texture.jpeg +0 -0
- package/build/assets/img/door.jpeg +0 -0
- package/build/assets/img/exterior-wall-texture.jpeg +0 -0
- package/build/assets/img/floor-bathroom.jpg +0 -0
- package/build/assets/img/floor-dark.png +0 -0
- package/build/assets/img/floor-white.png +0 -0
- package/build/assets/img/floor.jpg +0 -0
- package/build/assets/img/grass.png +0 -0
- package/build/assets/img/ground.svg +9 -0
- package/build/assets/img/wall-texture.jpg +0 -0
- package/build/assets/sass/animation.sass +5 -0
- 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 +26 -0
- package/build/assets/sass/components/panorama.sass +4 -35
- package/build/assets/sass/components/tabs.sass +66 -0
- package/build/assets/sass/index.sass +1 -0
- package/build/components/Application.js +18 -4
- 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 +148 -0
- package/build/components/PanoramaTab.js +36 -24
- 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.css +1 -1
- package/build/index.css.map +1 -1
- package/build/index.js +24 -0
- package/build/store/apiStore.js +63 -0
- package/build/store/houseStore.js +679 -0
- package/build/store/modelStore.js +228 -0
- package/build/utils/csg/csg-lib.js +387 -0
- package/build/utils/csg/csg-worker.js +94 -0
- package/build/utils/csg/three-csg.js +280 -0
- package/build/utils/modelHelpers.js +151 -0
- package/build/utils/{helpers.js → panoramaHelpers.js} +8 -0
- package/package.json +13 -2
package/README.md
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.loadFurnitureData = exports.STAGE_API_URL = exports.PRODUCTION_API_URL = 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
|
+
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;
|
18
|
+
const STAGE_API_URL = 'https://backend-stage.estate.myhart.ru';
|
19
|
+
exports.STAGE_API_URL = STAGE_API_URL;
|
20
|
+
const API_URL = {
|
21
|
+
'production': PRODUCTION_API_URL,
|
22
|
+
'stage': STAGE_API_URL
|
23
|
+
};
|
24
|
+
|
25
|
+
const loadFurnitureData = async function loadFurnitureData(furniture) {
|
26
|
+
let env = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'production';
|
27
|
+
const furnitureQuery = furniture.reduce((acc, item, i) => acc += "".concat(i === 0 ? '' : ',').concat(item.Model), '');
|
28
|
+
const path = "".concat(API_URL[env], "/api/furniture?only=").concat(furnitureQuery);
|
29
|
+
const response = await fetch(path);
|
30
|
+
return await response.json();
|
31
|
+
};
|
32
|
+
|
33
|
+
exports.loadFurnitureData = loadFurnitureData;
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<svg width="250" height="250" viewBox="0 0 250 250" fill="none" xmlns="http://www.w3.org/2000/svg">
|
2
|
+
<rect width="125" height="125" fill="white"/>
|
3
|
+
<rect x="125" y="125" width="125" height="125" fill="white"/>
|
4
|
+
<rect y="125" width="125" height="125" fill="black"/>
|
5
|
+
<rect x="125" width="125" height="125" fill="black"/>
|
6
|
+
<rect x="124" width="2" height="250" fill="#00A3FF"/>
|
7
|
+
<rect y="126" width="2" height="250" transform="rotate(-90 0 126)" fill="#00A3FF"/>
|
8
|
+
<rect x="0.5" y="0.5" width="249" height="249" stroke="#00A3FF"/>
|
9
|
+
</svg>
|
Binary file
|
@@ -0,0 +1,26 @@
|
|
1
|
+
@import '../vars'
|
2
|
+
|
3
|
+
.widget-application
|
4
|
+
.widget-tab
|
5
|
+
&__model
|
6
|
+
width: 100%
|
7
|
+
height: 100%
|
8
|
+
position: absolute
|
9
|
+
left: 0
|
10
|
+
top: 0
|
11
|
+
&-scene
|
12
|
+
width: 100%
|
13
|
+
height: 100%
|
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
|
@@ -35,11 +35,15 @@
|
|
35
35
|
right: 15px
|
36
36
|
bottom: 70px
|
37
37
|
z-index: 10000
|
38
|
+
&--hidden
|
39
|
+
display: none !important
|
38
40
|
img
|
39
41
|
width: 100px
|
40
42
|
border-radius: 10px
|
43
|
+
cursor: zoom-in
|
41
44
|
&.active
|
42
45
|
width: 240px
|
46
|
+
cursor: zoom-out
|
43
47
|
&:hover
|
44
48
|
box-shadow: 1px 1px 10px rgba(0,0,0,0.15)
|
45
49
|
&__dot
|
@@ -61,38 +65,3 @@
|
|
61
65
|
&--active
|
62
66
|
background-color: red
|
63
67
|
border: 2px solid red
|
64
|
-
&-menu
|
65
|
-
position: absolute
|
66
|
-
z-index: 3
|
67
|
-
left: 15px
|
68
|
-
top: 15px
|
69
|
-
max-height: 100%
|
70
|
-
overflow-y: auto
|
71
|
-
padding-bottom: 30px
|
72
|
-
ul
|
73
|
-
list-style-type: none
|
74
|
-
li
|
75
|
-
color: $black
|
76
|
-
background-color: $mainColor
|
77
|
-
padding: 5px 15px
|
78
|
-
border-radius: 10px
|
79
|
-
font-size: .8rem
|
80
|
-
border: none
|
81
|
-
cursor: pointer
|
82
|
-
margin-bottom: 15px
|
83
|
-
width: 150px
|
84
|
-
@include noSelect
|
85
|
-
&:hover
|
86
|
-
box-shadow: 1px 1px 10px rgba(0, 0, 0, .15)
|
87
|
-
&:nth-child(1)
|
88
|
-
position: relative
|
89
|
-
&::after
|
90
|
-
content: '|||'
|
91
|
-
transform: translateY(-50%) rotate(90deg)
|
92
|
-
font-size: 20px
|
93
|
-
line-height: 20px
|
94
|
-
margin-left: 10px
|
95
|
-
display: block
|
96
|
-
position: absolute
|
97
|
-
right: 10px
|
98
|
-
top: 50%
|
@@ -48,6 +48,72 @@
|
|
48
48
|
height: 100%
|
49
49
|
object-fit: cover
|
50
50
|
|
51
|
+
&-menu
|
52
|
+
position: absolute
|
53
|
+
z-index: 3
|
54
|
+
left: 15px
|
55
|
+
top: 15px
|
56
|
+
max-height: 100%
|
57
|
+
overflow-y: auto
|
58
|
+
padding-bottom: 30px
|
59
|
+
&__wallpapers
|
60
|
+
display: flex
|
61
|
+
flex-wrap: wrap
|
62
|
+
align-items: flex-start
|
63
|
+
margin-top: 10px
|
64
|
+
width: 100%
|
65
|
+
img
|
66
|
+
width: 30px
|
67
|
+
height: 30px
|
68
|
+
display: block
|
69
|
+
object-fit: cover
|
70
|
+
cursor: pointer
|
71
|
+
margin-right: 10px
|
72
|
+
margin-block-end: 10px
|
73
|
+
ul
|
74
|
+
list-style-type: none
|
75
|
+
li
|
76
|
+
color: $black
|
77
|
+
background-color: $mainColor
|
78
|
+
padding: 5px 15px
|
79
|
+
border-radius: 10px
|
80
|
+
font-size: .8rem
|
81
|
+
border: none
|
82
|
+
cursor: pointer
|
83
|
+
margin-bottom: 15px
|
84
|
+
width: 200px
|
85
|
+
@include noSelect
|
86
|
+
label
|
87
|
+
display: flex
|
88
|
+
cursor: inherit
|
89
|
+
width: 100%
|
90
|
+
input
|
91
|
+
&[type=color]
|
92
|
+
cursor: pointer
|
93
|
+
margin-left: auto
|
94
|
+
width: 50px
|
95
|
+
height: 20px
|
96
|
+
border: 0
|
97
|
+
border-radius: 5px
|
98
|
+
&::-webkit-color-swatch-wrapper
|
99
|
+
display: none !important
|
100
|
+
&[type=file]
|
101
|
+
display: none
|
102
|
+
&:hover
|
103
|
+
box-shadow: 1px 1px 10px rgba(0, 0, 0, .15)
|
104
|
+
&:nth-child(1)
|
105
|
+
position: relative
|
106
|
+
&::after
|
107
|
+
content: '|||'
|
108
|
+
transform: translateY(-50%) rotate(90deg)
|
109
|
+
font-size: 20px
|
110
|
+
line-height: 20px
|
111
|
+
margin-left: 10px
|
112
|
+
display: block
|
113
|
+
position: absolute
|
114
|
+
right: 10px
|
115
|
+
top: 50%
|
116
|
+
|
51
117
|
.widget-tab-panes
|
52
118
|
position: absolute
|
53
119
|
z-index: 3
|
@@ -21,6 +21,8 @@ var _RotationTab = _interopRequireDefault(require("./RotationTab"));
|
|
21
21
|
|
22
22
|
var _PanoramaTab = _interopRequireDefault(require("./PanoramaTab"));
|
23
23
|
|
24
|
+
var _ModelTab = _interopRequireDefault(require("./ModelTab"));
|
25
|
+
|
24
26
|
var _TabWrapper = _interopRequireDefault(require("./TabWrapper"));
|
25
27
|
|
26
28
|
var _D = _interopRequireDefault(require("../assets/img/3D.jpg"));
|
@@ -48,16 +50,20 @@ const Application = (0, _mobxReactLite.observer)(_ref => {
|
|
48
50
|
|
49
51
|
const tabsList = {
|
50
52
|
'planImage': /*#__PURE__*/_react.default.createElement(_ImageTab.default, {
|
51
|
-
image: config.planImage
|
53
|
+
image: config.planImage,
|
54
|
+
alt: "plan-view"
|
52
55
|
}),
|
53
56
|
'topView': /*#__PURE__*/_react.default.createElement(_ImageTab.default, {
|
54
|
-
image: config.topView
|
57
|
+
image: config.topView,
|
58
|
+
alt: "top-view"
|
55
59
|
}),
|
56
60
|
'topDownView': /*#__PURE__*/_react.default.createElement(_ImageTab.default, {
|
57
|
-
image: config.topDownView
|
61
|
+
image: config.topDownView,
|
62
|
+
alt: "top-down-view"
|
58
63
|
}),
|
59
64
|
'rotation': /*#__PURE__*/_react.default.createElement(_TabWrapper.default, {
|
60
65
|
isActive: !isTabPanesVisible,
|
66
|
+
disabled: !config.rotationImages[0],
|
61
67
|
image: config.rotationImages[0],
|
62
68
|
title: "360\xB0 overview",
|
63
69
|
text: ['Use mouse to rotate', 'Shift + LMB to move'],
|
@@ -67,6 +73,7 @@ const Application = (0, _mobxReactLite.observer)(_ref => {
|
|
67
73
|
})),
|
68
74
|
'panorama': /*#__PURE__*/_react.default.createElement(_TabWrapper.default, {
|
69
75
|
isActive: !isTabPanesVisible,
|
76
|
+
disabled: !config.panoramaImages[0],
|
70
77
|
image: config.panoramaImages[0],
|
71
78
|
title: "Panoramic tour",
|
72
79
|
text: ['Use mouse to rotate', 'To move through the rooms, click on the layout thumbnail'],
|
@@ -78,11 +85,14 @@ const Application = (0, _mobxReactLite.observer)(_ref => {
|
|
78
85
|
})),
|
79
86
|
'model': /*#__PURE__*/_react.default.createElement(_TabWrapper.default, {
|
80
87
|
isActive: !isTabPanesVisible,
|
88
|
+
disabled: !config.json,
|
81
89
|
image: _D.default,
|
82
90
|
title: "3D Model",
|
83
91
|
text: ['Use mouse to rotate', 'Use the right mouse button to move'],
|
84
92
|
onStart: hideTabPanes
|
85
|
-
}, /*#__PURE__*/_react.default.createElement(
|
93
|
+
}, /*#__PURE__*/_react.default.createElement(_ModelTab.default, {
|
94
|
+
json: config.json
|
95
|
+
}))
|
86
96
|
};
|
87
97
|
const appStyle = {
|
88
98
|
width,
|
@@ -97,6 +107,10 @@ const Application = (0, _mobxReactLite.observer)(_ref => {
|
|
97
107
|
window.addEventListener('resize', setWindowHeight);
|
98
108
|
setWindowHeight();
|
99
109
|
}, []);
|
110
|
+
(0, _react.useEffect)(() => {
|
111
|
+
if (config.tabs.some(tab => tab === currentTab)) return;
|
112
|
+
setCurrentTab(config.tabs[0]);
|
113
|
+
}, [config, currentTab]);
|
100
114
|
return /*#__PURE__*/_react.default.createElement("main", {
|
101
115
|
className: "widget-application",
|
102
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
|
|
@@ -0,0 +1,148 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.default = void 0;
|
7
|
+
|
8
|
+
require("core-js/modules/web.dom-collections.iterator.js");
|
9
|
+
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
11
|
+
|
12
|
+
var _mobxReactLite = require("mobx-react-lite");
|
13
|
+
|
14
|
+
var _modelStore = _interopRequireDefault(require("../store/modelStore"));
|
15
|
+
|
16
|
+
var _modelHelpers = require("../utils/modelHelpers");
|
17
|
+
|
18
|
+
var _nipplejs = _interopRequireDefault(require("nipplejs"));
|
19
|
+
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
21
|
+
|
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); }
|
23
|
+
|
24
|
+
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; }
|
25
|
+
|
26
|
+
const ModelTab = (0, _mobxReactLite.observer)(_ref => {
|
27
|
+
let {
|
28
|
+
json
|
29
|
+
} = _ref;
|
30
|
+
const [menuState, setMenuState] = (0, _react.useState)(false);
|
31
|
+
const {
|
32
|
+
houseStore
|
33
|
+
} = _modelStore.default;
|
34
|
+
(0, _react.useEffect)(() => {
|
35
|
+
const container = document.querySelector('.widget-tab__model-scene');
|
36
|
+
container.appendChild(_modelStore.default.renderer.domElement);
|
37
|
+
|
38
|
+
_modelStore.default.setCurrentControlsType('orbit');
|
39
|
+
|
40
|
+
if (_modelStore.default.initialized) {
|
41
|
+
_modelStore.default.houseStore.setDoorsVisibility(true);
|
42
|
+
|
43
|
+
_modelStore.default.houseStore.setFullBuildingVisibility(true);
|
44
|
+
|
45
|
+
_modelStore.default.houseStore.setCurrentWallsMaterialType('texture');
|
46
|
+
|
47
|
+
return;
|
48
|
+
}
|
49
|
+
|
50
|
+
_modelStore.default.init(json);
|
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
|
+
}, []);
|
74
|
+
|
75
|
+
const getNextWallsMaterialType = () => {
|
76
|
+
if (houseStore.wallsMaterialType === 'texture') return 'color';
|
77
|
+
return 'texture';
|
78
|
+
};
|
79
|
+
|
80
|
+
const onImageUploaded = _ref3 => {
|
81
|
+
let {
|
82
|
+
target
|
83
|
+
} = _ref3;
|
84
|
+
if (!target.files.length) return;
|
85
|
+
const reader = new FileReader();
|
86
|
+
|
87
|
+
reader.onload = e => houseStore.addWallTexture(e.target.result);
|
88
|
+
|
89
|
+
reader.readAsDataURL(target.files[0]);
|
90
|
+
};
|
91
|
+
|
92
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
93
|
+
className: "widget-tab__model"
|
94
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
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' : '')
|
98
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
99
|
+
className: "widget-tab-menu"
|
100
|
+
}, /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", {
|
101
|
+
onClick: () => setMenuState(!menuState)
|
102
|
+
}, "Menu"), menuState && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("li", {
|
103
|
+
onClick: () => _modelStore.default.setCurrentControlsType('wasd')
|
104
|
+
}, "WASD"), /*#__PURE__*/_react.default.createElement("li", {
|
105
|
+
onClick: () => _modelStore.default.setCurrentControlsType('plan')
|
106
|
+
}, "View from above"), /*#__PURE__*/_react.default.createElement("li", {
|
107
|
+
onClick: () => _modelStore.default.setCurrentControlsType('orbit')
|
108
|
+
}, "Free camera"), /*#__PURE__*/_react.default.createElement("li", {
|
109
|
+
onClick: () => houseStore.setPlanMode()
|
110
|
+
}, "Plan"), /*#__PURE__*/_react.default.createElement("li", {
|
111
|
+
onClick: () => houseStore.setFullBuildingVisibility(!houseStore.isFullBuildingVisible)
|
112
|
+
}, houseStore.isFullBuildingVisible ? 'Hide walls' : 'Show walls'), /*#__PURE__*/_react.default.createElement("li", {
|
113
|
+
onClick: () => houseStore.setDoorsVisibility(!houseStore.isDoorsVisible)
|
114
|
+
}, houseStore.isDoorsVisible ? 'Hide doors' : 'Show doors'), /*#__PURE__*/_react.default.createElement("li", {
|
115
|
+
onClick: () => houseStore.setCurrentWallsMaterialType(getNextWallsMaterialType())
|
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", {
|
117
|
+
type: "color",
|
118
|
+
onChange: _ref4 => {
|
119
|
+
let {
|
120
|
+
target
|
121
|
+
} = _ref4;
|
122
|
+
return houseStore.setCurrentWallColor(target.value);
|
123
|
+
},
|
124
|
+
style: {
|
125
|
+
background: houseStore.wallsColor
|
126
|
+
},
|
127
|
+
value: houseStore.wallsColor
|
128
|
+
}))), /*#__PURE__*/_react.default.createElement("li", null, "Wall texture:", /*#__PURE__*/_react.default.createElement("div", {
|
129
|
+
className: "widget-tab-menu__wallpapers"
|
130
|
+
}, houseStore && houseStore.wallsTextures.map((_ref5, index) => {
|
131
|
+
let {
|
132
|
+
image,
|
133
|
+
texture
|
134
|
+
} = _ref5;
|
135
|
+
return /*#__PURE__*/_react.default.createElement("img", {
|
136
|
+
key: index,
|
137
|
+
src: image,
|
138
|
+
onClick: () => houseStore.setCurrentWallTexture(texture),
|
139
|
+
alt: "texture=".concat(index)
|
140
|
+
});
|
141
|
+
}))), /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("label", null, "Upload wall texture", /*#__PURE__*/_react.default.createElement("input", {
|
142
|
+
onChange: onImageUploaded,
|
143
|
+
type: "file",
|
144
|
+
accept: ".jpg, .jpeg, .png"
|
145
|
+
})))))));
|
146
|
+
});
|
147
|
+
var _default = ModelTab;
|
148
|
+
exports.default = _default;
|
@@ -21,7 +21,7 @@ var _threeDeviceOrientation = _interopRequireDefault(require("three-device-orien
|
|
21
21
|
|
22
22
|
var _Loader = _interopRequireDefault(require("./Loader"));
|
23
23
|
|
24
|
-
var
|
24
|
+
var _panoramaHelpers = require("../utils/panoramaHelpers");
|
25
25
|
|
26
26
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
27
27
|
|
@@ -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,
|
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,
|
@@ -92,6 +101,8 @@ const initPanorama = () => {
|
|
92
101
|
controls.update();
|
93
102
|
};
|
94
103
|
|
104
|
+
animate();
|
105
|
+
|
95
106
|
if (DeviceOrientationEvent.requestPermission) {
|
96
107
|
DeviceOrientationEvent.requestPermission().catch(() => console.log('Device motion not allowed'));
|
97
108
|
}
|
@@ -119,6 +130,7 @@ const PanoramaTab = _ref => {
|
|
119
130
|
X: 1,
|
120
131
|
Y: 1
|
121
132
|
});
|
133
|
+
const isMapDisabled = !json;
|
122
134
|
|
123
135
|
const changePanorama = (panorama, index) => {
|
124
136
|
setCurrentRoomIndex(index);
|
@@ -147,7 +159,7 @@ const PanoramaTab = _ref => {
|
|
147
159
|
|
148
160
|
const setScale = () => {
|
149
161
|
const image = document.querySelector('.widget-tab__panorama-map img');
|
150
|
-
setPlanScale((0,
|
162
|
+
setPlanScale((0, _panoramaHelpers.getScale)(image, json));
|
151
163
|
};
|
152
164
|
|
153
165
|
const getDotClassName = index => {
|
@@ -179,20 +191,20 @@ const PanoramaTab = _ref => {
|
|
179
191
|
}), loadingState && /*#__PURE__*/_react.default.createElement(_Loader.default, {
|
180
192
|
absolute: true
|
181
193
|
}), /*#__PURE__*/_react.default.createElement("div", {
|
182
|
-
className: "widget-
|
194
|
+
className: "widget-tab-menu"
|
183
195
|
}, /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", {
|
184
196
|
onClick: () => setMenuState(!menuState)
|
185
197
|
}, "Rooms"), menuState && panoramaRooms.map((room, index) => /*#__PURE__*/_react.default.createElement("li", {
|
186
198
|
key: index,
|
187
199
|
onClick: () => changePanorama(room.panorama, index)
|
188
200
|
}, currentRoomIndex === index && '• ', " ", room.type)))), /*#__PURE__*/_react.default.createElement("div", {
|
189
|
-
className: "widget-tab__panorama-map"
|
201
|
+
className: "widget-tab__panorama-map ".concat(planImage ? '' : 'widget-tab__panorama-map--hidden')
|
190
202
|
}, /*#__PURE__*/_react.default.createElement("img", {
|
191
203
|
src: planImage,
|
192
204
|
className: isMapActive ? 'active' : '',
|
193
205
|
onClick: toggleMap,
|
194
206
|
alt: "plan"
|
195
|
-
}), panoramaRooms.map((room, index) => /*#__PURE__*/_react.default.createElement("div", {
|
207
|
+
}), !isMapDisabled && panoramaRooms.map((room, index) => /*#__PURE__*/_react.default.createElement("div", {
|
196
208
|
key: index,
|
197
209
|
style: {
|
198
210
|
left: "".concat(room.left * planScale.X, "px"),
|