kitchen-simulator 1.0.0-alin.1 → 1.0.0-alin.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,56 +1,159 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
6
+ import { fromJS, List, Map, Record } from 'immutable';
1
7
  import { EXTERNAL_EVENT_ADD_WALL, EXTERNAL_EVENT_TOGGLE_TO_3D, EXTERNAL_EVENT_TOGGLE_TO_2D, EXTERNAL_EVENT_TOGGLE_TO_ELEVATION, EXTERNAL_EVENT_MOVE_PAN, MODE_IDLE, MODE_2D_PAN, EXTERNAL_EVENT_ADD_ITEM, ARRAY_3D_MODES, MODE_IDLE_3D, MODE_ELEVATION_VIEW, TOP, BOTTOM, LEFT, RIGHT, EXTERNAL_EVENT_NEW_PROJECT } from "../constants";
2
8
  import { isEmpty } from "./helper";
3
- export function handleExternalEvent(evt, props) {
4
- var state = props.state;
5
- switch (evt === null || evt === void 0 ? void 0 : evt.type) {
6
- case EXTERNAL_EVENT_TOGGLE_TO_3D:
7
- props.projectActions.setMode(MODE_IDLE_3D);
8
- break;
9
- case EXTERNAL_EVENT_TOGGLE_TO_2D:
10
- props.projectActions.setMode(MODE_IDLE);
11
- break;
12
- case EXTERNAL_EVENT_TOGGLE_TO_ELEVATION:
13
- props.projectActions.setMode(MODE_ELEVATION_VIEW);
14
- break;
15
- case EXTERNAL_EVENT_ADD_WALL:
16
- if (state.mode === MODE_IDLE || state.mode === MODE_2D_PAN) props.linesActions.selectToolDrawingLine('wall');else {
17
- props.projectActions.setMode(MODE_IDLE);
18
- props.linesActions.selectToolDrawingLine('wall');
9
+ import exporter from "../catalog/utils/exporter";
10
+ import { render2DItem, render3DItem } from "../catalog/utils/item-loader";
11
+ import Catalog from "../catalog/catalog";
12
+ import { CatalogElement, safeLoadMapList } from "../models";
13
+ var loadSVGsByItem = /*#__PURE__*/function () {
14
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(item) {
15
+ var _parsed$xml$viewBox, _parsed$xml$viewBox2, response, svgText, loader, parsed, _t;
16
+ return _regeneratorRuntime.wrap(function (_context) {
17
+ while (1) switch (_context.prev = _context.next) {
18
+ case 0:
19
+ if (item.outline) {
20
+ _context.next = 1;
21
+ break;
22
+ }
23
+ return _context.abrupt("return", null);
24
+ case 1:
25
+ _context.prev = 1;
26
+ _context.next = 2;
27
+ return fetch(item.outline, {
28
+ cache: 'no-store'
29
+ });
30
+ case 2:
31
+ response = _context.sent;
32
+ _context.next = 3;
33
+ return response.text();
34
+ case 3:
35
+ svgText = _context.sent;
36
+ loader = new SVGLoader();
37
+ parsed = loader.parse(svgText);
38
+ if (!isEmpty(parsed.paths)) {
39
+ _context.next = 4;
40
+ break;
41
+ }
42
+ return _context.abrupt("return", null);
43
+ case 4:
44
+ return _context.abrupt("return", {
45
+ paths: parsed.paths,
46
+ svgWidth: parseFloat(parsed.xml.getAttribute('width')) || ((_parsed$xml$viewBox = parsed.xml.viewBox) === null || _parsed$xml$viewBox === void 0 || (_parsed$xml$viewBox = _parsed$xml$viewBox.animVal) === null || _parsed$xml$viewBox === void 0 ? void 0 : _parsed$xml$viewBox.width) || 0,
47
+ svgHeight: parseFloat(parsed.xml.getAttribute('height')) || ((_parsed$xml$viewBox2 = parsed.xml.viewBox) === null || _parsed$xml$viewBox2 === void 0 || (_parsed$xml$viewBox2 = _parsed$xml$viewBox2.animVal) === null || _parsed$xml$viewBox2 === void 0 ? void 0 : _parsed$xml$viewBox2.height) || 0,
48
+ reverse: !parseFloat(parsed.xml.getAttribute('height'))
49
+ });
50
+ case 5:
51
+ _context.prev = 5;
52
+ _t = _context["catch"](1);
53
+ console.error('Failed to load SVG:', item.outline, _t);
54
+ return _context.abrupt("return", null);
55
+ case 6:
56
+ case "end":
57
+ return _context.stop();
19
58
  }
20
- break;
21
- case EXTERNAL_EVENT_ADD_ITEM:
22
- {
23
- var element = evt.payload;
24
- !isEmpty(evt === null || evt === void 0 ? void 0 : evt.payload) && ARRAY_3D_MODES.includes(state.mode) ? props.itemsActions.selectToolDrawingItem3D(element.name) : props.itemsActions.selectToolDrawingItem(element.name);
25
- props.projectActions.pushLastSelectedCatalogElementToHistory(element);
26
- props.projectActions.setIsCabinetDrawing(true);
27
- }
28
- break;
29
- case EXTERNAL_EVENT_MOVE_PAN:
30
- var _evt$payload = evt.payload,
31
- moveType = _evt$payload.moveType,
32
- moveValue = _evt$payload.moveValue;
33
- var value = state.getIn(['KitchenConfigurator', 'viewer2D']).toJS();
34
- switch (moveType) {
35
- case TOP:
36
- value.f -= moveValue;
59
+ }, _callee, null, [[1, 5]]);
60
+ }));
61
+ return function loadSVGsByItem(_x) {
62
+ return _ref.apply(this, arguments);
63
+ };
64
+ }();
65
+ export function handleExternalEvent(_x2, _x3) {
66
+ return _handleExternalEvent.apply(this, arguments);
67
+ }
68
+ function _handleExternalEvent() {
69
+ _handleExternalEvent = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(evt, props) {
70
+ var state, sLineCnt, element, catalog, outlineSVGData, catalogInstance, elementJs, _evt$payload, moveType, moveValue, value, defaulTitle, _t2, _t3;
71
+ return _regeneratorRuntime.wrap(function (_context2) {
72
+ while (1) switch (_context2.prev = _context2.next) {
73
+ case 0:
74
+ state = props.state;
75
+ _t2 = evt === null || evt === void 0 ? void 0 : evt.type;
76
+ _context2.next = _t2 === EXTERNAL_EVENT_TOGGLE_TO_3D ? 1 : _t2 === EXTERNAL_EVENT_TOGGLE_TO_2D ? 2 : _t2 === EXTERNAL_EVENT_TOGGLE_TO_ELEVATION ? 3 : _t2 === EXTERNAL_EVENT_ADD_WALL ? 4 : _t2 === EXTERNAL_EVENT_ADD_ITEM ? 5 : _t2 === EXTERNAL_EVENT_MOVE_PAN ? 9 : _t2 === EXTERNAL_EVENT_NEW_PROJECT ? 15 : 16;
37
77
  break;
38
- case BOTTOM:
39
- value.f += moveValue;
78
+ case 1:
79
+ props.projectActions.setMode(MODE_IDLE_3D);
80
+ return _context2.abrupt("continue", 16);
81
+ case 2:
82
+ props.projectActions.setMode(MODE_IDLE);
83
+ return _context2.abrupt("continue", 16);
84
+ case 3:
85
+ sLineCnt = state.getIn(['KitchenConfigurator', 'scene', 'layers', 'layer-1', 'selected', 'lines']).size;
86
+ if (sLineCnt > 0) props.projectActions.setMode(MODE_ELEVATION_VIEW);
87
+ return _context2.abrupt("continue", 16);
88
+ case 4:
89
+ if (state.mode === MODE_IDLE || state.mode === MODE_2D_PAN) props.linesActions.selectToolDrawingLine('wall');else {
90
+ props.projectActions.setMode(MODE_IDLE);
91
+ props.linesActions.selectToolDrawingLine('wall');
92
+ }
93
+ return _context2.abrupt("continue", 16);
94
+ case 5:
95
+ if (isEmpty(evt === null || evt === void 0 ? void 0 : evt.payload)) {
96
+ _context2.next = 8;
97
+ break;
98
+ }
99
+ element = evt.payload;
100
+ catalog = state.getIn(['KitchenConfigurator', 'catalog']).toJS(); // add item to catalog of state
101
+ if (!isEmpty(catalog === null || catalog === void 0 ? void 0 : catalog.elements[element.name])) {
102
+ _context2.next = 7;
103
+ break;
104
+ }
105
+ _context2.next = 6;
106
+ return loadSVGsByItem(element);
107
+ case 6:
108
+ outlineSVGData = _context2.sent;
109
+ catalogInstance = props.catalog;
110
+ elementJs = exporter(_objectSpread(_objectSpread({}, element), {}, {
111
+ outlineSVGData: outlineSVGData,
112
+ type: 'cabinet',
113
+ render2DItem: render2DItem,
114
+ render3DItem: render3DItem
115
+ }));
116
+ if (catalogInstance !== null && catalogInstance !== void 0 && catalogInstance.validateElement(elementJs)) {
117
+ props.projectActions.addElementToCatalog(elementJs);
118
+ }
119
+ case 7:
120
+ // start drawing item
121
+ ARRAY_3D_MODES.includes(state.mode) ? props.itemsActions.selectToolDrawingItem3D(element.name) : props.itemsActions.selectToolDrawingItem(element.name);
122
+ props.projectActions.pushLastSelectedCatalogElementToHistory(element);
123
+ props.projectActions.setIsCabinetDrawing(true);
124
+ case 8:
125
+ return _context2.abrupt("continue", 16);
126
+ case 9:
127
+ _evt$payload = evt.payload, moveType = _evt$payload.moveType, moveValue = _evt$payload.moveValue;
128
+ value = state.getIn(['KitchenConfigurator', 'viewer2D']).toJS();
129
+ _t3 = moveType;
130
+ _context2.next = _t3 === TOP ? 10 : _t3 === BOTTOM ? 11 : _t3 === RIGHT ? 12 : _t3 === LEFT ? 13 : 14;
40
131
  break;
41
- case RIGHT:
132
+ case 10:
133
+ value.f -= moveValue;
134
+ return _context2.abrupt("continue", 14);
135
+ case 11:
136
+ value.f += moveValue;
137
+ return _context2.abrupt("continue", 14);
138
+ case 12:
42
139
  value.e += moveValue;
43
- break;
44
- case LEFT:
140
+ return _context2.abrupt("continue", 14);
141
+ case 13:
45
142
  value.e -= moveValue;
46
- break;
143
+ return _context2.abrupt("continue", 14);
144
+ case 14:
145
+ if (value.e <= 10 && value.e + value.a * value.SVGWidth + 10 >= value.viewerWidth && value.f <= 80 && value.f + value.d * value.SVGHeight + 10 >= value.viewerHeight) props.viewer2DActions.updateCameraView(value);
146
+ return _context2.abrupt("continue", 16);
147
+ case 15:
148
+ defaulTitle = 'Untitle';
149
+ props.projectActions.newProject();
150
+ props.projectActions.rename(defaulTitle);
151
+ return _context2.abrupt("continue", 16);
152
+ case 16:
153
+ case "end":
154
+ return _context2.stop();
47
155
  }
48
- if (value.e <= 10 && value.e + value.a * value.SVGWidth + 10 >= value.viewerWidth && value.f <= 80 && value.f + value.d * value.SVGHeight + 10 >= value.viewerHeight) props.viewer2DActions.updateCameraView(value);
49
- break;
50
- case EXTERNAL_EVENT_NEW_PROJECT:
51
- var defaulTitle = 'Untitle';
52
- props.projectActions.newProject();
53
- props.projectActions.rename(defaulTitle);
54
- break;
55
- }
156
+ }, _callee2);
157
+ }));
158
+ return _handleExternalEvent.apply(this, arguments);
56
159
  }
@@ -8,10 +8,15 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports["default"] = LiteRenderer;
9
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
11
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
14
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
18
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
19
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
20
  var _react = _interopRequireWildcard(require("react"));
16
21
  var _propTypes = _interopRequireDefault(require("prop-types"));
17
22
  var _reactRedux = require("react-redux");
@@ -35,10 +40,12 @@ var _projectActions = require("./actions/project-actions");
35
40
  var _exporter = _interopRequireDefault(require("./catalog/utils/exporter"));
36
41
  var THREE = _interopRequireWildcard(require("three"));
37
42
  var _LiteKitchenConfigurator = _interopRequireDefault(require("./LiteKitchenConfigurator"));
38
- var _excluded = ["width", "height", "projectElement", "categoryData", "dataBundle", "configData", "options", "user", "auth", "featureFlags", "sentry", "analytics", "externalEvent", "onEvent", "onSave", "onError"];
43
+ var _excluded = ["width", "height", "projectElement", "categoryData", "dataBundle", "configData", "options", "user", "auth", "featureFlags", "sentry", "analytics", "externalEvent", "onError"];
39
44
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
40
45
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
41
46
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
47
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
48
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
42
49
  if (typeof window !== 'undefined') window.THREE = THREE;
43
50
 
44
51
  /* ============================== component ============================= */
@@ -87,6 +94,62 @@ var store = (0, _redux.createStore)(reducer, null, !isProduction && window.devTo
87
94
  return f;
88
95
  });
89
96
  var plugins = [(0, _export2.Keyboard)(), (0, _export2.ConsoleDebugger)()];
97
+ function serializeError(err) {
98
+ try {
99
+ if (!err) return {
100
+ message: 'Unknown error'
101
+ };
102
+ if (err instanceof Error) {
103
+ return {
104
+ name: err.name,
105
+ message: err.message,
106
+ stack: err.stack
107
+ };
108
+ }
109
+ return {
110
+ message: String(err),
111
+ raw: safeJson(err)
112
+ };
113
+ } catch (_unused) {
114
+ return {
115
+ message: 'Error serializing error'
116
+ };
117
+ }
118
+ }
119
+ function safeJson(v) {
120
+ try {
121
+ return JSON.parse(JSON.stringify(v));
122
+ } catch (_unused2) {
123
+ return undefined;
124
+ }
125
+ }
126
+
127
+ /* ---------- Error Boundary that pushes into buffer ---------- */
128
+ var ToolErrorBoundary = /*#__PURE__*/function (_React$Component) {
129
+ function ToolErrorBoundary() {
130
+ (0, _classCallCheck2["default"])(this, ToolErrorBoundary);
131
+ return _callSuper(this, ToolErrorBoundary, arguments);
132
+ }
133
+ (0, _inherits2["default"])(ToolErrorBoundary, _React$Component);
134
+ return (0, _createClass2["default"])(ToolErrorBoundary, [{
135
+ key: "componentDidCatch",
136
+ value: function componentDidCatch(error, info) {
137
+ var pushError = this.props.pushError;
138
+ pushError({
139
+ type: 'render-error',
140
+ error: serializeError(error),
141
+ info: {
142
+ componentStack: info === null || info === void 0 ? void 0 : info.componentStack
143
+ }
144
+ });
145
+ }
146
+ }, {
147
+ key: "render",
148
+ value: function render() {
149
+ return this.props.children;
150
+ }
151
+ }]);
152
+ }(_react["default"].Component);
90
153
  function LiteRenderer(props) {
91
154
  var width = props.width,
92
155
  height = props.height,
@@ -101,10 +164,95 @@ function LiteRenderer(props) {
101
164
  sentry = props.sentry,
102
165
  analytics = props.analytics,
103
166
  externalEvent = props.externalEvent,
104
- onEvent = props.onEvent,
105
- onSave = props.onSave,
106
167
  onError = props.onError,
107
168
  passThrough = (0, _objectWithoutProperties2["default"])(props, _excluded);
169
+
170
+ /* ---------- track last external event ---------- */
171
+ var lastExternalEventRef = (0, _react.useRef)(null);
172
+ (0, _react.useEffect)(function () {
173
+ if (externalEvent) {
174
+ lastExternalEventRef.current = externalEvent;
175
+ }
176
+ }, [externalEvent]);
177
+
178
+ /* ---------- error buffer + last emitted bundle ---------- */
179
+ var errorsBufferRef = (0, _react.useRef)([]); // pending errors (not yet emitted)
180
+ var lastEmittedRef = (0, _react.useRef)({
181
+ externalEvent: null,
182
+ errors: []
183
+ }); // last bundle we sent
184
+ var flushTimerRef = (0, _react.useRef)(null);
185
+ var emit = (0, _react.useCallback)(function (external, errors) {
186
+ var payload = {
187
+ externalEvent: external || null,
188
+ errors: errors || []
189
+ };
190
+ try {
191
+ onError === null || onError === void 0 || onError(payload);
192
+ } catch (_unused3) {}
193
+ // eslint-disable-next-line no-console
194
+ console.debug('[LiteRenderer:onError]', payload);
195
+ lastEmittedRef.current = payload;
196
+ }, [onError]);
197
+
198
+ // batch short bursts (e.g., multiple async errors in same tick)
199
+ var scheduleFlush = (0, _react.useCallback)(function () {
200
+ if (flushTimerRef.current) return;
201
+ flushTimerRef.current = setTimeout(function () {
202
+ flushTimerRef.current = null;
203
+ var errors = errorsBufferRef.current;
204
+ if (!errors.length) return;
205
+ errorsBufferRef.current = [];
206
+ emit(lastExternalEventRef.current, errors);
207
+ }, 0); // micro-batch; increase (e.g. 50ms) if you want coarser batching
208
+ }, [emit]);
209
+ var pushError = (0, _react.useCallback)(function (errPayload) {
210
+ errorsBufferRef.current.push(_objectSpread({
211
+ ts: Date.now()
212
+ }, errPayload));
213
+ scheduleFlush();
214
+ }, [scheduleFlush]);
215
+
216
+ /* ---------- global runtime + async error capture ---------- */
217
+ (0, _react.useEffect)(function () {
218
+ var onWindowError = function onWindowError(event) {
219
+ pushError({
220
+ type: 'runtime-error',
221
+ error: serializeError((event === null || event === void 0 ? void 0 : event.error) || (event === null || event === void 0 ? void 0 : event.message)),
222
+ meta: {
223
+ filename: event === null || event === void 0 ? void 0 : event.filename,
224
+ lineno: event === null || event === void 0 ? void 0 : event.lineno,
225
+ colno: event === null || event === void 0 ? void 0 : event.colno
226
+ }
227
+ });
228
+ };
229
+ var onUnhandledRejection = function onUnhandledRejection(event) {
230
+ pushError({
231
+ type: 'unhandled-rejection',
232
+ error: serializeError(event === null || event === void 0 ? void 0 : event.reason)
233
+ });
234
+ };
235
+ window.addEventListener('error', onWindowError);
236
+ window.addEventListener('unhandledrejection', onUnhandledRejection);
237
+ return function () {
238
+ window.removeEventListener('error', onWindowError);
239
+ window.removeEventListener('unhandledrejection', onUnhandledRejection);
240
+ };
241
+ }, [pushError]);
242
+
243
+ /* ---------- re-trigger last batch when externalEvent changes ---------- */
244
+ var prevExternalEventRef = (0, _react.useRef)(null);
245
+ (0, _react.useEffect)(function () {
246
+ var prev = prevExternalEventRef.current;
247
+ if (prev === externalEvent) return;
248
+ prevExternalEventRef.current = externalEvent;
249
+
250
+ // if we already emitted something before, re-send it with the new event context
251
+ var last = lastEmittedRef.current;
252
+ if (last && last.errors && last.errors.length) {
253
+ emit(lastExternalEventRef.current, last.errors);
254
+ }
255
+ }, [externalEvent, emit]);
108
256
  var _ref = categoryData && categoryData.data || {},
109
257
  catalogs = _ref.catalogs,
110
258
  colorAlias = _ref.colorAlias,
@@ -387,43 +535,6 @@ function LiteRenderer(props) {
387
535
  });
388
536
  for (var x in Item) MyCatalog.registerElement(Item[x]);
389
537
  }, [outlineSVGData, data, appliances, furnishing, lighting]);
390
-
391
- // Forward updates/save moments to host
392
- (0, _react.useEffect)(function () {
393
- if (!onEvent && !onSave && !onError) return;
394
- var unsubscribe = store.subscribe(function () {
395
- var _state$get, _state$get$get, _state$get$get$get;
396
- var state = store.getState();
397
- onEvent === null || onEvent === void 0 || onEvent({
398
- type: 'state-update',
399
- payload: {
400
- state: state
401
- }
402
- });
403
- var pendingSave = state === null || state === void 0 || (_state$get = state.get) === null || _state$get === void 0 || (_state$get = _state$get.call(state, 'KitchenConfigurator')) === null || _state$get === void 0 || (_state$get$get = _state$get.get) === null || _state$get$get === void 0 || (_state$get$get = _state$get$get.call(_state$get, 'misc')) === null || _state$get$get === void 0 || (_state$get$get$get = _state$get$get.get) === null || _state$get$get$get === void 0 ? void 0 : _state$get$get$get.call(_state$get$get, 'pendingSave');
404
- if (pendingSave && onSave) {
405
- try {
406
- var _planner$get, _planner$get2;
407
- var planner = state.get('KitchenConfigurator');
408
- var currentScene = planner !== null && planner !== void 0 && (_planner$get = planner.get) !== null && _planner$get !== void 0 && (_planner$get = _planner$get.call(planner, 'scene')) !== null && _planner$get !== void 0 && _planner$get.toJS ? planner.get('scene').toJS() : (planner === null || planner === void 0 || (_planner$get2 = planner.get) === null || _planner$get2 === void 0 ? void 0 : _planner$get2.call(planner, 'scene')) || null;
409
- onSave({
410
- type: 'save',
411
- payload: {
412
- scene: currentScene
413
- }
414
- });
415
- } catch (e) {
416
- onError === null || onError === void 0 || onError({
417
- type: 'save-error',
418
- error: e
419
- });
420
- }
421
- }
422
- });
423
- return function () {
424
- return unsubscribe();
425
- };
426
- }, [store, onEvent, onSave, onError]);
427
538
  (0, _react.useEffect)(function () {
428
539
  if (projectElement.length === 0) return;
429
540
  if (!catalogInitiated) return;
@@ -441,6 +552,8 @@ function LiteRenderer(props) {
441
552
  }, [project_data, catalogInitiated]);
442
553
  return /*#__PURE__*/_react["default"].createElement(_AppContext["default"].Provider, null, /*#__PURE__*/_react["default"].createElement(_reactRedux.Provider, {
443
554
  store: store
555
+ }, /*#__PURE__*/_react["default"].createElement(ToolErrorBoundary, {
556
+ pushError: pushError
444
557
  }, /*#__PURE__*/_react["default"].createElement(_LiteKitchenConfigurator["default"], (0, _extends2["default"])({
445
558
  catalog: MyCatalog,
446
559
  width: width,
@@ -454,11 +567,8 @@ function LiteRenderer(props) {
454
567
  categoryData: categoryData,
455
568
  data: data,
456
569
  configData: configData,
457
- externalEvent: externalEvent,
458
- onEvent: onEvent,
459
- onSave: onSave,
460
- onError: onError
461
- }, passThrough))));
570
+ externalEvent: externalEvent
571
+ }, passThrough)))));
462
572
  }
463
573
 
464
574
  /* ============================== prop types ============================== */
@@ -481,8 +591,7 @@ LiteRenderer.propTypes = {
481
591
  dsn: _propTypes["default"].string,
482
592
  environment: _propTypes["default"].string
483
593
  }),
484
- onEvent: _propTypes["default"].func,
485
- onSave: _propTypes["default"].func,
594
+ externalEvent: _propTypes["default"].object,
486
595
  onError: _propTypes["default"].func,
487
596
  store: _propTypes["default"].object
488
597
  };
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.addCircularGuide = addCircularGuide;
7
+ exports.addElementToCatalog = addElementToCatalog;
7
8
  exports.addHorizontalGuide = addHorizontalGuide;
8
9
  exports.addVerticalGuide = addVerticalGuide;
9
10
  exports.changeCatalogPage = changeCatalogPage;
@@ -218,6 +219,12 @@ function initCatalog(catalog) {
218
219
  catalog: catalog
219
220
  };
220
221
  }
222
+ function addElementToCatalog(element) {
223
+ return {
224
+ type: _constants.ADD_ELEMENT_TO_CATALOG,
225
+ element: element
226
+ };
227
+ }
221
228
  function updateMouseCoord() {
222
229
  var coords = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
223
230
  x: x,
@@ -28,7 +28,7 @@ function updateCeilHeightUnit(value) {
28
28
  }
29
29
  function updateCameraView(value) {
30
30
  return {
31
- type: _constants.MOVE_PAN,
31
+ type: _constants.UPDATE_2D_CAMERA,
32
32
  value: value
33
33
  };
34
34
  }
@@ -601,6 +601,24 @@ var Project = exports["default"] = /*#__PURE__*/function () {
601
601
  };
602
602
  }
603
603
  }
604
+ }, {
605
+ key: "addElementToCatalog",
606
+ value: function addElementToCatalog(state, element) {
607
+ try {
608
+ var elements = state.getIn(['catalog', 'elements']).toJS();
609
+ elements[element.name] = element;
610
+ var newElements = (0, _models.safeLoadMapList)(elements, _models.CatalogElement);
611
+ state = state.setIn(['catalog', 'elements'], newElements);
612
+ return {
613
+ updatedState: state
614
+ };
615
+ } catch (error) {
616
+ console.log('initCatalogError', error);
617
+ return {
618
+ updatedState: state
619
+ };
620
+ }
621
+ }
604
622
  }, {
605
623
  key: "updateMouseCoord",
606
624
  value: function updateMouseCoord(state, coords) {
@@ -1363,9 +1363,8 @@ function Viewer2D(_ref, _ref2) {
1363
1363
  onMouseDown: onMouseDown,
1364
1364
  onMouseMove: onMouseMove,
1365
1365
  onMouseUp: onMouseUp,
1366
- toolbarProps: {
1367
- position: 'none'
1368
- },
1366
+ miniaturePosition: "none",
1367
+ toolbarPosition: "none",
1369
1368
  detectPinchGesture: false,
1370
1369
  disableDoubleClickZoomWithToolAuto: true,
1371
1370
  ref: Viewer
@@ -101,7 +101,9 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
101
101
  } else {
102
102
  if (_this.props.downloadFlag) window.__elevationRendererDownload[mode] = _this.renderer;else window.__elevationRenderer = _this.renderer;
103
103
  }
104
- _this.renderer.domElement.style.display = 'none';
104
+ if (_this.renderer && _this.renderer.domElement) {
105
+ _this.renderer.domElement.style.display = 'none';
106
+ }
105
107
  return _this;
106
108
  }
107
109
  (0, _inherits2["default"])(Scene3DViewer, _React$Component);
@@ -2365,7 +2367,9 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
2365
2367
  self.props.setIsLoadingElevation('front', false);
2366
2368
  }, 100);
2367
2369
  }
2368
- self.renderer.domElement.style.display = 'block';
2370
+ if (self.renderer && self.renderer.domElement) {
2371
+ self.renderer.domElement.style.display = 'block';
2372
+ }
2369
2373
  }
2370
2374
  }
2371
2375
  }
@@ -2509,7 +2513,9 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
2509
2513
  break;
2510
2514
  }
2511
2515
  }
2512
- self.renderer.domElement.style.display = 'none';
2516
+ if (self.renderer && self.renderer.domElement) {
2517
+ self.renderer.domElement.style.display = 'none';
2518
+ }
2513
2519
  }
2514
2520
  if (nextProps.state.scene.showfg == true) {
2515
2521
  implementBacksplash();
@@ -2546,7 +2552,9 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
2546
2552
  isLoadingCabinet = _this$state2.isLoadingCabinet;
2547
2553
  if (isLoading) {
2548
2554
  if (this.props.downloadFlag) {
2549
- this.renderer.domElement.style.display = 'none';
2555
+ if (this.renderer && this.renderer.domElement) {
2556
+ this.renderer.domElement.style.display = 'none';
2557
+ }
2550
2558
  return /*#__PURE__*/_react["default"].createElement("div", {
2551
2559
  style: {
2552
2560
  alignItems: ' center',
@@ -2567,7 +2575,9 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
2567
2575
  } else {
2568
2576
  document.getElementById('front') && (document.getElementById('front').style.display = 'none');
2569
2577
  document.getElementById('error').style.display = 'none';
2570
- this.renderer.domElement.style.display = 'none';
2578
+ if (this.renderer && this.renderer.domElement) {
2579
+ this.renderer.domElement.style.display = 'none';
2580
+ }
2571
2581
  return /*#__PURE__*/_react["default"].createElement("div", {
2572
2582
  style: {
2573
2583
  textAlign: 'center',