kitchen-simulator 3.15.0 → 3.16.0-test-renderer-fix

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.
@@ -6,9 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports["default"] = LiteRenderer;
9
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
11
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
14
12
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
@@ -20,75 +18,53 @@ var _react = _interopRequireWildcard(require("react"));
20
18
  var _propTypes = _interopRequireDefault(require("prop-types"));
21
19
  var _reactRedux = require("react-redux");
22
20
  var _redux = require("redux");
21
+ var _immutable = require("immutable");
22
+ var Sentry = _interopRequireWildcard(require("@sentry/react"));
23
+ var THREE = _interopRequireWildcard(require("three"));
23
24
  var _models = _interopRequireWildcard(require("./models"));
24
25
  var Models = _models;
25
26
  var _reducer = _interopRequireDefault(require("./reducers/reducer"));
26
27
  var _AppContext = _interopRequireDefault(require("./AppContext"));
27
28
  var _catalog = _interopRequireDefault(require("./catalog/catalog"));
28
- var _SVGLoader = require("three/addons/loaders/SVGLoader");
29
- var _constants = require("./constants");
30
29
  var Areas = _interopRequireWildcard(require("./catalog/areas/area/planner-element"));
31
30
  var Lines = _interopRequireWildcard(require("./catalog/lines/wall/planner-element"));
32
31
  var Holes = _interopRequireWildcard(require("./catalog/holes/export"));
33
32
  var _export2 = require("./plugins/export");
34
- var _immutable = require("immutable");
35
- var Sentry = _interopRequireWildcard(require("@sentry/react"));
36
- var THREE = _interopRequireWildcard(require("three"));
37
33
  var _LiteKitchenConfigurator = _interopRequireDefault(require("./LiteKitchenConfigurator"));
38
- var _excluded = ["width", "height", "configData", "options", "user", "auth", "featureFlags", "sentry", "analytics", "externalEvent", "onInternalEvent", "onError"];
34
+ var _excluded = ["width", "height", "configData", "externalEvent", "onInternalEvent", "onError"];
39
35
  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 _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
40
36
  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
37
  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; }
38
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
39
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
40
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
42
41
  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)); }
43
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
44
- if (typeof window !== 'undefined') window.THREE = THREE;
45
-
46
- /* ============================== component ============================= */
47
- var MyCatalog = new _catalog["default"]();
48
- var AppState = (0, _immutable.Map)({
49
- KitchenConfigurator: new _models.State()
50
- });
51
- console.log('Version: 378.45-202509_DIY-364-mbox-crash');
52
- isProduction && Sentry.init({
53
- dsn: process.env.SENTRY_DSN,
54
- environment: process.env.SENTRY_ENVIRONMENT
55
- });
42
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // LiteRenderer.jsx
43
+ var isBrowser = typeof window !== 'undefined';
44
+ if (isBrowser) window.THREE = THREE;
56
45
 
57
- //define reducer
58
- var reducer = function reducer(state, action) {
59
- state = state || AppState;
60
- state = state.update('KitchenConfigurator', function (plannerState) {
61
- return (0, _reducer["default"])(plannerState, action);
46
+ // ---- Sentry init: keep behavior but avoid re-init on multiple mounts ----
47
+ var __sentryInited = false;
48
+ function ensureSentryInit() {
49
+ // assumes isProduction is defined in your build env like before
50
+ if (!isBrowser) return;
51
+ if (!isProduction) return;
52
+ if (__sentryInited) return;
53
+ __sentryInited = true;
54
+ Sentry.init({
55
+ dsn: process.env.SENTRY_DSN,
56
+ environment: process.env.SENTRY_ENVIRONMENT
62
57
  });
63
- return state;
64
- };
65
- var store = (0, _redux.createStore)(reducer, null, !isProduction && window.devToolsExtension ? window.devToolsExtension({
66
- features: {
67
- pause: true,
68
- // start/pause recording of dispatched actions
69
- lock: true,
70
- // lock/unlock dispatching actions and side effects
71
- persist: true,
72
- // persist states on page reloading
73
- "export": true,
74
- // export history of actions in a file
75
- "import": 'custom',
76
- // import history of actions from a file
77
- jump: true,
78
- // jump back and forth (time travelling)
79
- skip: true,
80
- // skip (cancel) actions
81
- reorder: true,
82
- // drag and drop actions in the history list
83
- dispatch: true,
84
- // dispatch custom actions or action creators
85
- test: true // generate tests for the selected actions
86
- },
87
- maxAge: 999999
88
- }) : function (f) {
89
- return f;
90
- });
91
- var plugins = [(0, _export2.Keyboard)(), (0, _export2.ConsoleDebugger)()];
58
+ }
59
+
60
+ // ---------------- error helpers ----------------
61
+ function safeJson(v) {
62
+ try {
63
+ return JSON.parse(JSON.stringify(v));
64
+ } catch (_unused) {
65
+ return undefined;
66
+ }
67
+ }
92
68
  function serializeError(err) {
93
69
  try {
94
70
  if (!err) return {
@@ -105,19 +81,12 @@ function serializeError(err) {
105
81
  message: String(err),
106
82
  raw: safeJson(err)
107
83
  };
108
- } catch (_unused) {
84
+ } catch (_unused2) {
109
85
  return {
110
86
  message: 'Error serializing error'
111
87
  };
112
88
  }
113
89
  }
114
- function safeJson(v) {
115
- try {
116
- return JSON.parse(JSON.stringify(v));
117
- } catch (_unused2) {
118
- return undefined;
119
- }
120
- }
121
90
 
122
91
  /* ---------- Error Boundary that pushes into buffer ---------- */
123
92
  var ToolErrorBoundary = /*#__PURE__*/function (_React$Component) {
@@ -145,35 +114,144 @@ var ToolErrorBoundary = /*#__PURE__*/function (_React$Component) {
145
114
  }
146
115
  }]);
147
116
  }(_react["default"].Component);
117
+ ToolErrorBoundary.propTypes = {
118
+ pushError: _propTypes["default"].func.isRequired,
119
+ children: _propTypes["default"].any
120
+ };
121
+
122
+ // ----------------- catalog init -----------------
123
+ function initCatalogOnce(catalog) {
124
+ if (!catalog) return;
125
+ if (catalog.__ksInitialized) return;
126
+ for (var x in Areas) catalog.registerElement(Areas[x]);
127
+ for (var _x in Lines) catalog.registerElement(Lines[_x]);
128
+ for (var _x2 in Holes) catalog.registerElement(Holes[_x2]);
129
+ catalog.registerCategory('Windows', 'Windows', [Holes.windowClear, Holes.windowCross, Holes.windowDoubleHung, Holes.windowVertical]);
130
+ catalog.registerCategory('Doors', 'Doors', [Holes.doorInterior, Holes.doorExterior, Holes.doorCloset, Holes.doorSliding, Holes.doorwayFramed, Holes.doorwayFrameless]);
131
+ catalog.__ksInitialized = true;
132
+ }
133
+
134
+ // ----------------- store factory -----------------
135
+ function createInstanceStore() {
136
+ // keep your initial state semantics identical
137
+ var AppState = (0, _immutable.Map)({
138
+ KitchenConfigurator: new _models.State()
139
+ });
140
+ var reducer = function reducer(state, action) {
141
+ state = state || AppState;
142
+ return state.update('KitchenConfigurator', function (plannerState) {
143
+ return (0, _reducer["default"])(plannerState, action);
144
+ });
145
+ };
146
+
147
+ // keep devtools behavior identical; guard against missing window
148
+ var enhancer = !isProduction && isBrowser && window.devToolsExtension ? window.devToolsExtension({
149
+ features: {
150
+ pause: true,
151
+ lock: true,
152
+ persist: true,
153
+ "export": true,
154
+ "import": 'custom',
155
+ jump: true,
156
+ skip: true,
157
+ reorder: true,
158
+ dispatch: true,
159
+ test: true
160
+ },
161
+ maxAge: 999999
162
+ }) : function (f) {
163
+ return f;
164
+ };
165
+ return (0, _redux.createStore)(reducer, null, enhancer);
166
+ }
167
+
168
+ // ----------------- plugins -----------------
169
+ function createPlugins() {
170
+ return [(0, _export2.Keyboard)(), (0, _export2.ConsoleDebugger)()];
171
+ }
148
172
  function LiteRenderer(props) {
173
+ ensureSentryInit();
149
174
  var width = props.width,
150
175
  height = props.height,
151
176
  configData = props.configData,
152
- options = props.options,
153
- user = props.user,
154
- auth = props.auth,
155
- featureFlags = props.featureFlags,
156
- sentry = props.sentry,
157
- analytics = props.analytics,
158
177
  externalEvent = props.externalEvent,
159
178
  onInternalEvent = props.onInternalEvent,
160
179
  onError = props.onError,
161
180
  passThrough = (0, _objectWithoutProperties2["default"])(props, _excluded);
162
181
 
182
+ // ---- instance-scoped store + catalog (no module-level globals) ----
183
+ var storeRef = (0, _react.useRef)(null);
184
+ if (!storeRef.current) storeRef.current = createInstanceStore();
185
+ var catalogRef = (0, _react.useRef)(null);
186
+ if (!catalogRef.current) {
187
+ catalogRef.current = new _catalog["default"]();
188
+ initCatalogOnce(catalogRef.current);
189
+ }
190
+
191
+ // ---- plugins init once per instance + cleanup support ----
192
+ var pluginCleanupsRef = (0, _react.useRef)([]);
193
+ var plugins = (0, _react.useMemo)(function () {
194
+ return createPlugins();
195
+ }, []); // stable
196
+
197
+ (0, _react.useEffect)(function () {
198
+ var store = storeRef.current;
199
+ var stateExtractor = function stateExtractor(state) {
200
+ return state.get('KitchenConfigurator');
201
+ };
202
+
203
+ // plugins may or may not return cleanup; support both
204
+ var cleanups = [];
205
+ var _iterator = _createForOfIteratorHelper(plugins),
206
+ _step;
207
+ try {
208
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
209
+ var p = _step.value;
210
+ try {
211
+ var maybeCleanup = p === null || p === void 0 ? void 0 : p(store, stateExtractor);
212
+ if (typeof maybeCleanup === 'function') cleanups.push(maybeCleanup);
213
+ } catch (e) {
214
+ // keep behavior: don't crash; send to onError buffer
215
+ // (actual emitting is handled below)
216
+ }
217
+ }
218
+ } catch (err) {
219
+ _iterator.e(err);
220
+ } finally {
221
+ _iterator.f();
222
+ }
223
+ pluginCleanupsRef.current = cleanups;
224
+ return function () {
225
+ var _iterator2 = _createForOfIteratorHelper(pluginCleanupsRef.current),
226
+ _step2;
227
+ try {
228
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
229
+ var fn = _step2.value;
230
+ try {
231
+ fn();
232
+ } catch (_unused3) {}
233
+ }
234
+ } catch (err) {
235
+ _iterator2.e(err);
236
+ } finally {
237
+ _iterator2.f();
238
+ }
239
+ pluginCleanupsRef.current = [];
240
+ };
241
+ }, [plugins]);
242
+
163
243
  /* ---------- track last external event ---------- */
164
244
  var lastExternalEventRef = (0, _react.useRef)(null);
165
245
  (0, _react.useEffect)(function () {
166
- if (externalEvent) {
167
- lastExternalEventRef.current = externalEvent;
168
- }
246
+ if (externalEvent) lastExternalEventRef.current = externalEvent;
169
247
  }, [externalEvent]);
170
248
 
171
249
  /* ---------- error buffer + last emitted bundle ---------- */
172
- var errorsBufferRef = (0, _react.useRef)([]); // pending errors (not yet emitted)
250
+ var errorsBufferRef = (0, _react.useRef)([]);
173
251
  var lastEmittedRef = (0, _react.useRef)({
174
252
  externalEvent: null,
175
253
  errors: []
176
- }); // last bundle we sent
254
+ });
177
255
  var flushTimerRef = (0, _react.useRef)(null);
178
256
  var emit = (0, _react.useCallback)(function (external, errors) {
179
257
  var payload = {
@@ -182,13 +260,12 @@ function LiteRenderer(props) {
182
260
  };
183
261
  try {
184
262
  onError === null || onError === void 0 || onError(payload);
185
- } catch (_unused3) {}
263
+ } catch (_unused4) {}
264
+ // keep your debug
186
265
  // eslint-disable-next-line no-console
187
266
  console.debug('[LiteRenderer:onError]', payload);
188
267
  lastEmittedRef.current = payload;
189
268
  }, [onError]);
190
-
191
- // batch short bursts (e.g., multiple async errors in same tick)
192
269
  var scheduleFlush = (0, _react.useCallback)(function () {
193
270
  if (flushTimerRef.current) return;
194
271
  flushTimerRef.current = setTimeout(function () {
@@ -197,7 +274,7 @@ function LiteRenderer(props) {
197
274
  if (!errors.length) return;
198
275
  errorsBufferRef.current = [];
199
276
  emit(lastExternalEventRef.current, errors);
200
- }, 0); // micro-batch; increase (e.g. 50ms) if you want coarser batching
277
+ }, 0);
201
278
  }, [emit]);
202
279
  var pushError = (0, _react.useCallback)(function (errPayload) {
203
280
  errorsBufferRef.current.push(_objectSpread({
@@ -208,6 +285,7 @@ function LiteRenderer(props) {
208
285
 
209
286
  /* ---------- global runtime + async error capture ---------- */
210
287
  (0, _react.useEffect)(function () {
288
+ if (!isBrowser) return;
211
289
  var onWindowError = function onWindowError(event) {
212
290
  pushError({
213
291
  type: 'runtime-error',
@@ -239,64 +317,20 @@ function LiteRenderer(props) {
239
317
  var prev = prevExternalEventRef.current;
240
318
  if (prev === externalEvent) return;
241
319
  prevExternalEventRef.current = externalEvent;
242
-
243
- // if we already emitted something before, re-send it with the new event context
244
320
  var last = lastEmittedRef.current;
245
321
  if (last && last.errors && last.errors.length) {
246
322
  emit(lastExternalEventRef.current, last.errors);
247
323
  }
248
324
  }, [externalEvent, emit]);
249
- var id = configData.id,
250
- logoImg = configData.logoImg,
251
- companyUrl = configData.companyUrl;
252
- (0, _react.useEffect)(function () {
253
- var initMyCatalog = /*#__PURE__*/function () {
254
- var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
255
- var x, _x, _x2;
256
- return _regenerator["default"].wrap(function (_context) {
257
- while (1) switch (_context.prev = _context.next) {
258
- case 0:
259
- for (x in Areas) MyCatalog.registerElement(Areas[x]);
260
- for (_x in Lines) MyCatalog.registerElement(Lines[_x]);
261
- for (_x2 in Holes) MyCatalog.registerElement(Holes[_x2]);
262
- MyCatalog.registerCategory('Windows', 'Windows', [Holes.windowClear, Holes.windowCross, Holes.windowDoubleHung, Holes.windowVertical]);
263
- MyCatalog.registerCategory('Doors', 'Doors', [Holes.doorInterior, Holes.doorExterior, Holes.doorCloset, Holes.doorSliding, Holes.doorwayFramed, Holes.doorwayFrameless]);
264
- case 1:
265
- case "end":
266
- return _context.stop();
267
- }
268
- }, _callee);
269
- }));
270
- return function initMyCatalog() {
271
- return _ref.apply(this, arguments);
272
- };
273
- }();
274
- var initCatalog = /*#__PURE__*/function () {
275
- var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
276
- return _regenerator["default"].wrap(function (_context2) {
277
- while (1) switch (_context2.prev = _context2.next) {
278
- case 0:
279
- _context2.next = 1;
280
- return initMyCatalog();
281
- case 1:
282
- case "end":
283
- return _context2.stop();
284
- }
285
- }, _callee2);
286
- }));
287
- return function initCatalog() {
288
- return _ref2.apply(this, arguments);
289
- };
290
- }();
291
- initCatalog();
292
- // eslint-disable-next-line react-hooks/exhaustive-deps
293
- }, [id]);
325
+ var _ref = configData || {},
326
+ logoImg = _ref.logoImg,
327
+ companyUrl = _ref.companyUrl;
294
328
  return /*#__PURE__*/_react["default"].createElement(_AppContext["default"].Provider, null, /*#__PURE__*/_react["default"].createElement(_reactRedux.Provider, {
295
- store: store
329
+ store: storeRef.current
296
330
  }, /*#__PURE__*/_react["default"].createElement(ToolErrorBoundary, {
297
331
  pushError: pushError
298
332
  }, /*#__PURE__*/_react["default"].createElement(_LiteKitchenConfigurator["default"], (0, _extends2["default"])({
299
- catalog: MyCatalog,
333
+ catalog: catalogRef.current,
300
334
  width: width,
301
335
  height: height,
302
336
  logoImage: logoImg,
@@ -310,9 +344,6 @@ function LiteRenderer(props) {
310
344
  onInternalEvent: onInternalEvent
311
345
  }, passThrough)))));
312
346
  }
313
-
314
- /* ============================== prop types ============================== */
315
-
316
347
  LiteRenderer.propTypes = {
317
348
  width: _propTypes["default"].oneOfType([_propTypes["default"].number, _propTypes["default"].string]),
318
349
  height: _propTypes["default"].oneOfType([_propTypes["default"].number, _propTypes["default"].string]),
Binary file
@@ -847,85 +847,88 @@ var Project = exports["default"] = /*#__PURE__*/function () {
847
847
  state = state.merge({
848
848
  catalog: catalog
849
849
  });
850
- var _viewer2D = state.viewer2D;
851
- var viewer = _viewer2D.toJS();
852
- width = (0, _convertUnitsLite.convert)(width).from(state.getIn(['scene', 'layers', 'layer-1', 'unit'])).to('cm');
853
- height = (0, _convertUnitsLite.convert)(height).from(state.getIn(['scene', 'layers', 'layer-1', 'unit'])).to('cm');
854
- var layerID = state.scene.selectedLayer;
855
850
  state = _export2.Item.setInitialDoorStyle(state, doorStyle).updatedState;
856
- if ((0, _helper.isEmpty)(viewer)) return {
857
- updatedState: state
858
- };
859
- var halfWidth = width / 2;
860
- var halfHeight = height / 2;
861
- var viewerWidth = viewer.SVGWidth;
862
- var viewerHeight = viewer.SVGHeight;
863
- var centerPos = {
864
- x: viewerWidth / 2,
865
- y: viewerHeight / 2
866
- };
867
- var vtLB = {
868
- x: centerPos.x - halfWidth,
869
- y: centerPos.y - halfHeight
870
- };
871
- var vtRB = {
872
- x: centerPos.x + halfWidth,
873
- y: centerPos.y - halfHeight
874
- };
875
- var vtRT = {
876
- x: centerPos.x + halfWidth,
877
- y: centerPos.y + halfHeight
878
- };
879
- var vtLT = {
880
- x: centerPos.x - halfWidth,
881
- y: centerPos.y + halfHeight
882
- };
883
- var vertices = [];
884
- switch (roomShapeType) {
885
- case 'rectangle':
886
- vertices = [vtLB, vtLT, vtRT, vtRB];
887
- break;
888
- case constants.ROOM_SHAPE_TYPE.TWO_WALLS_RIGHT_BOTTOM:
889
- vertices = [vtLB, vtRB, vtRT];
890
- break;
891
- case constants.ROOM_SHAPE_TYPE.TWO_WALLS_RIGHT_TOP:
892
- vertices = [vtRB, vtRT, vtLT];
893
- break;
894
- case constants.ROOM_SHAPE_TYPE.TWO_WALLS_LEFT_TOP:
895
- vertices = [vtRT, vtLT, vtLB];
896
- break;
897
- case constants.ROOM_SHAPE_TYPE.TWO_WALLS_LEFT_BOTTOM:
898
- vertices = [vtLT, vtLB, vtRB];
899
- break;
900
- case constants.ROOM_SHAPE_TYPE.THREE_WALLS_LEFT_TOP_RIGHT:
901
- vertices = [vtRB, vtRT, vtLT, vtLB];
902
- break;
903
- case constants.ROOM_SHAPE_TYPE.THREE_WALLS_TOP_RIGHT_BOTTOM:
904
- vertices = [vtLB, vtRB, vtRT, vtLT];
905
- break;
906
- case constants.ROOM_SHAPE_TYPE.THREE_WALLS_RIGHT_BOTTOM_LEFT:
907
- vertices = [vtLT, vtLB, vtRB, vtRT];
908
- break;
909
- case constants.ROOM_SHAPE_TYPE.THREE_WALLS_BOTTOM_LEFT_TOP:
910
- vertices = [vtRT, vtLT, vtLB, vtRB];
911
- break;
912
- }
913
- for (var i = 0; i < vertices.length - 1; i++) {
914
- state = _export2.Line.create(state, layerID, 'wall', vertices[i].x, vertices[i].y, vertices[i + 1].x, vertices[i + 1].y).updatedState;
915
- }
916
- if (roomShapeType === constants.ROOM_SHAPE_TYPE.RECTANGLE) {
917
- state = _export2.Line.create(state, layerID, 'wall', vertices[vertices.length - 1].x, vertices[vertices.length - 1].y, vertices[0].x, vertices[0].y).updatedState;
918
- }
919
- var layer = state.getIn(['scene', 'layers', layerID]);
920
- var lines = layer.getIn(['lines']).toJS();
921
- var drawingInfo = {};
922
- var lineKey = Object.keys(lines);
923
- for (var _i = 0; _i < lineKey.length; _i++) {
924
- if (!(0, _helper.isEmpty)(lineKey)) {
925
- drawingInfo.drawingLine = layer.getIn(['lines', lineKey[_i]]);
851
+ var layerID = state.scene.selectedLayer;
852
+ if (roomShapeType !== constants.ROOM_SHAPE_TYPE.CUSTOM && !(0, _helper.isEmpty)(width) && !(0, _helper.isEmpty)(height) && width !== 0 && height !== 0) {
853
+ var _viewer2D = state.viewer2D;
854
+ var viewer = _viewer2D.toJS();
855
+ if ((0, _helper.isEmpty)(viewer)) return {
856
+ updatedState: state
857
+ };
858
+ width = (0, _convertUnitsLite.convert)(width).from(state.getIn(['scene', 'layers', 'layer-1', 'unit'])).to('cm');
859
+ height = (0, _convertUnitsLite.convert)(height).from(state.getIn(['scene', 'layers', 'layer-1', 'unit'])).to('cm');
860
+ var halfWidth = width / 2;
861
+ var halfHeight = height / 2;
862
+ var viewerWidth = viewer.SVGWidth;
863
+ var viewerHeight = viewer.SVGHeight;
864
+ var centerPos = {
865
+ x: viewerWidth / 2,
866
+ y: viewerHeight / 2
867
+ };
868
+ var vtLB = {
869
+ x: centerPos.x - halfWidth,
870
+ y: centerPos.y - halfHeight
871
+ };
872
+ var vtRB = {
873
+ x: centerPos.x + halfWidth,
874
+ y: centerPos.y - halfHeight
875
+ };
876
+ var vtRT = {
877
+ x: centerPos.x + halfWidth,
878
+ y: centerPos.y + halfHeight
879
+ };
880
+ var vtLT = {
881
+ x: centerPos.x - halfWidth,
882
+ y: centerPos.y + halfHeight
883
+ };
884
+ var vertices = [];
885
+ switch (roomShapeType) {
886
+ case 'rectangle':
887
+ vertices = [vtLB, vtLT, vtRT, vtRB];
888
+ break;
889
+ case constants.ROOM_SHAPE_TYPE.TWO_WALLS_RIGHT_BOTTOM:
890
+ vertices = [vtLB, vtRB, vtRT];
891
+ break;
892
+ case constants.ROOM_SHAPE_TYPE.TWO_WALLS_RIGHT_TOP:
893
+ vertices = [vtRB, vtRT, vtLT];
894
+ break;
895
+ case constants.ROOM_SHAPE_TYPE.TWO_WALLS_LEFT_TOP:
896
+ vertices = [vtRT, vtLT, vtLB];
897
+ break;
898
+ case constants.ROOM_SHAPE_TYPE.TWO_WALLS_LEFT_BOTTOM:
899
+ vertices = [vtLT, vtLB, vtRB];
900
+ break;
901
+ case constants.ROOM_SHAPE_TYPE.THREE_WALLS_LEFT_TOP_RIGHT:
902
+ vertices = [vtRB, vtRT, vtLT, vtLB];
903
+ break;
904
+ case constants.ROOM_SHAPE_TYPE.THREE_WALLS_TOP_RIGHT_BOTTOM:
905
+ vertices = [vtLB, vtRB, vtRT, vtLT];
906
+ break;
907
+ case constants.ROOM_SHAPE_TYPE.THREE_WALLS_RIGHT_BOTTOM_LEFT:
908
+ vertices = [vtLT, vtLB, vtRB, vtRT];
909
+ break;
910
+ case constants.ROOM_SHAPE_TYPE.THREE_WALLS_BOTTOM_LEFT_TOP:
911
+ vertices = [vtRT, vtLT, vtLB, vtRB];
912
+ break;
913
+ }
914
+ for (var i = 0; i < vertices.length - 1; i++) {
915
+ state = _export2.Line.create(state, layerID, 'wall', vertices[i].x, vertices[i].y, vertices[i + 1].x, vertices[i + 1].y).updatedState;
916
+ }
917
+ if (roomShapeType === constants.ROOM_SHAPE_TYPE.RECTANGLE) {
918
+ state = _export2.Line.create(state, layerID, 'wall', vertices[vertices.length - 1].x, vertices[vertices.length - 1].y, vertices[0].x, vertices[0].y).updatedState;
919
+ }
920
+ var layer = state.getIn(['scene', 'layers', layerID]);
921
+ var lines = layer.getIn(['lines']).toJS();
922
+ var drawingInfo = {};
923
+ var lineKey = Object.keys(lines);
924
+ for (var _i = 0; _i < lineKey.length; _i++) {
925
+ if (!(0, _helper.isEmpty)(lineKey)) {
926
+ drawingInfo.drawingLine = layer.getIn(['lines', lineKey[_i]]);
927
+ }
928
+ state = _export2.Layer.detectAndUpdateAreas(state, layerID, drawingInfo).updatedState;
926
929
  }
927
- state = _export2.Layer.detectAndUpdateAreas(state, layerID, drawingInfo).updatedState;
928
930
  }
931
+
929
932
  // copy keeped measurement unit
930
933
  state = state.setIn(['scene', 'layers', layerID, 'unit'], layerUnit);
931
934
  state = state.setIn(['scene', 'layers', layerID, 'ceilHeight'], ceilHeight);
@@ -39,6 +39,7 @@ function Ruler(_ref) {
39
39
  transform = _ref.transform,
40
40
  style = _ref.style;
41
41
  var distanceText = (0, _convertUnitsLite.convert)(length).from(unit).to(rulerUnit).toFixed(0);
42
+ distanceText = (Math.round((0, _convertUnitsLite.convert)(distanceText).from('in').to(layer.unit) * 100) / 100).toFixed(0);
42
43
  var textLength = (distanceText.length + layer.unit.length) * 9;
43
44
  return /*#__PURE__*/_react["default"].createElement("g", {
44
45
  transform: transform
@@ -59,7 +60,7 @@ function Ruler(_ref) {
59
60
  transform: "scale(1, -1)",
60
61
  style: STYLE_TEXT,
61
62
  fill: _constants.TEXT_COLOR_NEUTRAL_7
62
- }, Math.round((0, _convertUnitsLite.convert)(distanceText).from('in').to(layer.unit) * 100) / 100, layer.unit === 'in' ? '"' : layer.unit)), /*#__PURE__*/_react["default"].createElement("line", {
63
+ }, distanceText, layer.unit === 'in' ? '"' : layer.unit)), /*#__PURE__*/_react["default"].createElement("line", {
63
64
  x1: style === _line.STYLE_ROOM_SHAPE ? 0 : 4,
64
65
  y1: "0",
65
66
  x2: (length - textLength) / 2 < 0 ? 0 : (length - textLength) / 2,
@@ -301,7 +301,7 @@ function updateScene(planData, sceneData, oldSceneData, diffArray, actions, cata
301
301
  * Every 'doorStyle' change has a 'door_style_id' change.
302
302
  * So, if door_style_id changes, it indicates 'doorStyle' change.
303
303
  */
304
- if (['id'].includes(path[path.length - 1])) isSettingDoorStyle = true;
304
+ if (path[1] === 'layers' && path[3] === 'molding' || path[path.length - 2] === 'doorStyle' && path[path.length - 1] === 'id' || ['id'].includes(path[path.length - 1])) isSettingDoorStyle = true;
305
305
 
306
306
  // If there are any molding change of layer
307
307
  if (path[1] === 'layers' && path[3] === 'molding') isUpdateMolding = true;
@@ -986,9 +986,9 @@ function getLineDistance(obj, layer, isCalcWall, index) {
986
986
  obj.geometry.attributes.position.needsUpdate = true;
987
987
  obj.geometry.computeBoundingSphere();
988
988
  obj.geometry.computeBoundingBox();
989
- var dist = (0, _math.formatNumber)((0, _convertUnitsLite.convert)(intersects[i].distance).from('cm').to('in'), _constants.DECIMAL_PLACES_2);
989
+ var dist = (0, _convertUnitsLite.convert)(intersects[i].distance).from('cm').to('in');
990
990
  if (dist > 3) {
991
- var _canvas = getTextCanvas(dist);
991
+ var _canvas = getDistanceCanvas(dist, layer);
992
992
  var wid = _canvas.width / window.innerWidth * 30;
993
993
  var hei = _canvas.height / window.innerHeight * 30;
994
994
  var texture = new Three.Texture(_canvas);
@@ -1110,7 +1110,7 @@ function getLineDistance(obj, layer, isCalcWall, index) {
1110
1110
  obj.geometry.attributes.position.needsUpdate = true;
1111
1111
  var _dist = (0, _math.formatNumber)(distance, _constants.DECIMAL_PLACES_2);
1112
1112
  if (_dist > 3) {
1113
- var _canvas2 = getTextCanvas(_dist);
1113
+ var _canvas2 = getDistanceCanvas(_dist, layer);
1114
1114
  var _wid = _canvas2.width / window.innerWidth * 30;
1115
1115
  var _hei = _canvas2.height / window.innerHeight * 30;
1116
1116
  var _texture = new Three.Texture(_canvas2);
@@ -1238,12 +1238,17 @@ function getIntersectPoint(opX, opY, pX, pY) {
1238
1238
  function gcd(a, b) {
1239
1239
  return a % b ? gcd(b, a % b) : b;
1240
1240
  }
1241
- function getTextCanvas(text) {
1242
- var parameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1241
+ function getDistanceCanvas(distance, layer) {
1242
+ var _layer$unit;
1243
+ var parameters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1243
1244
  var canvas = document.createElement('canvas');
1244
1245
  var ctx = canvas.getContext('2d');
1246
+ var curUnit = (_layer$unit = layer === null || layer === void 0 ? void 0 : layer.unit) !== null && _layer$unit !== void 0 ? _layer$unit : 'in';
1247
+ var distText = String((Math.round((0, _convertUnitsLite.convert)(distance).from('in').to(curUnit) * 100) / 100).toFixed(0));
1245
1248
  var fontSize = 16;
1246
- var integral = String(text) + "''";
1249
+ var integral = distText + curUnit;
1250
+ // let integral = String(distance) + "''";
1251
+
1247
1252
  parameters.fontName = parameters.fontName || _constants.ARROW_TEXT_FONTFACE;
1248
1253
 
1249
1254
  // Prepare the font to be able to measure
@@ -238,6 +238,7 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
238
238
  });
239
239
  self.renderer.domElement.style.display = 'block';
240
240
  }, 1500);
241
+ self.planData = planData;
241
242
  });
242
243
  var area = scene.getIn(['layers', scene.selectedLayer, 'areas']);
243
244
  var layer = scene.getIn(['layers', scene.selectedLayer]);