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.
@@ -3,20 +3,29 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.loadFurnitureData = exports.STAGE_API_URL = exports.API_URL = void 0;
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
- const API_URL = 'https://backend.estate.myhart.ru';
13
- exports.API_URL = API_URL;
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
  };
@@ -48,3 +48,6 @@
48
48
  cursor: pointer
49
49
  border: none
50
50
  padding: 10px 5px
51
+ &:disabled
52
+ opacity: .75
53
+ cursor: not-allowed
@@ -10,6 +10,8 @@
10
10
  left: 50%
11
11
  top: 50%
12
12
  transform: translate(-50%, -50%)
13
+ &--sm
14
+ transform: translate(-50%, -50%) scale(.75)
13
15
  div
14
16
  position: absolute
15
17
  top: 33px
@@ -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
@@ -40,8 +40,10 @@
40
40
  img
41
41
  width: 100px
42
42
  border-radius: 10px
43
+ cursor: zoom-in
43
44
  &.active
44
45
  width: 240px
46
+ cursor: zoom-out
45
47
  &:hover
46
48
  box-shadow: 1px 1px 10px rgba(0,0,0,0.15)
47
49
  &__dot
@@ -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: "plan-view"
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 = _ref2 => {
80
+ const onImageUploaded = _ref3 => {
55
81
  let {
56
82
  target
57
- } = _ref2;
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: _ref3 => {
118
+ onChange: _ref4 => {
91
119
  let {
92
120
  target
93
- } = _ref3;
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((_ref4, index) => {
130
+ }, houseStore && houseStore.wallsTextures.map((_ref5, index) => {
103
131
  let {
104
132
  image,
105
133
  texture
106
- } = _ref4;
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 = new PANOLENS.ImagePanorama(image);
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
- const currentRoom = Floors[0].Units[0].Rooms.find(room => room.ID === panorama['room_id']);
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("img", {
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
- const config = Object.assign(_defaultConfig.default, options);
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: 'https://backend-stage.estate.myhart.ru/storage/projects/202112/952c2131-5a8b-4afd-8083-b56d4357aa5c/plan.png',
20
- topView: 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/TopView_0_0.png',
21
- topDownView: 'https://backend-stage.estate.myhart.ru/storage/projects/202112/a5768629-fa1a-48f4-87de-15fea894deed/unreal/Style_2/MiddleCut_0_0_0.png',
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'],
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
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 _api = require("../api");
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
- (0, _api.loadFurnitureData)(this.furniture).then(resp => {
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(_api.API_URL, "/storage/furniture/").concat(mesh);
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(_api.API_URL, "/storage/furniture/").concat(url);
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); // const axesHelper = new THREE.AxesHelper( 50 );
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.controls.currentControlsType = 'orbit';
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.NONE;
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.controls.currentControlsType = type;
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.controls.currentControlsType !== 'wasd') return;
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.11",
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",