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.
@@ -335,6 +335,104 @@ function WorkSpace(props) {
335
335
  setExternalEvent(evt);
336
336
  }
337
337
  }, "Add Room shape(rectangle)"), /*#__PURE__*/React.createElement(Button, {
338
+ actionType: "danger",
339
+ onClick: function onClick() {
340
+ var evt = {
341
+ type: EXTERNAL_EVENT_ADD_ROOM_SHAPE,
342
+ payload: {
343
+ roomShapeType: 'custom',
344
+ width: 0,
345
+ height: 0,
346
+ doorStyle: {
347
+ id: 36,
348
+ type: 'door',
349
+ name: 'Brilliant White Shaker',
350
+ thumbnail: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/thumbnail/Brilliant%20White%20Shaker%20-%20RTA.jpg',
351
+ texture: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
352
+ color: '#ffffff',
353
+ glossness: 1,
354
+ door_style_id: 42,
355
+ brightness: 1,
356
+ sku: 'SW',
357
+ color_family: ',10,',
358
+ color_sku_alias: 'SW',
359
+ door_style_name: 'Shaker',
360
+ install: '',
361
+ doorStyles: {
362
+ base: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
363
+ counttop: 'https://media.test.diydesignspace.com/uploads/CountTop/202105074107_5/texture/Unique_Calcatta_texture.jpg',
364
+ interior: 'http://127.0.0.1:4002/uploads/assets/default/maple.jpg',
365
+ base_door_1: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
366
+ base_fixed_drawer_door_1: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
367
+ base_drawer_1: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
368
+ base_drawer_door_1: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
369
+ door_handle_1: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
370
+ fixed_drawer_door_handle_1: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
371
+ drawer_door_handle_1: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
372
+ base_door_2: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
373
+ base_fixed_drawer_door_2: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
374
+ base_drawer_2: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
375
+ base_drawer_door_2: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
376
+ door_handle_2: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
377
+ fixed_drawer_door_handle_2: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
378
+ drawer_door_handle_2: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
379
+ base_door_3: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
380
+ base_fixed_drawer_door_3: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
381
+ base_drawer_3: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
382
+ base_drawer_door_3: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
383
+ door_handle_3: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
384
+ fixed_drawer_door_handle_3: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
385
+ drawer_door_handle_3: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
386
+ base_door_4: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
387
+ base_fixed_drawer_door_4: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
388
+ base_drawer_4: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
389
+ base_drawer_door_4: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
390
+ door_handle_4: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
391
+ fixed_drawer_door_handle_4: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
392
+ drawer_door_handle_4: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
393
+ base_door_5: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
394
+ base_fixed_drawer_door_5: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
395
+ base_drawer_5: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
396
+ base_drawer_door_5: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
397
+ door_handle_5: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
398
+ fixed_drawer_door_handle_5: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
399
+ drawer_door_handle_5: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
400
+ base_door_6: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
401
+ base_fixed_drawer_door_6: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
402
+ base_drawer_6: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
403
+ base_drawer_door_6: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
404
+ door_handle_6: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
405
+ fixed_drawer_door_handle_6: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
406
+ drawer_door_handle_6: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
407
+ base_door_7: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
408
+ base_fixed_drawer_door_7: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
409
+ base_drawer_7: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
410
+ base_drawer_door_7: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
411
+ door_handle_7: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
412
+ fixed_drawer_door_handle_7: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
413
+ drawer_door_handle_7: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
414
+ base_door_8: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
415
+ base_fixed_drawer_door_8: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
416
+ base_drawer_8: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
417
+ base_drawer_door_8: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
418
+ door_handle_8: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
419
+ fixed_drawer_door_handle_8: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
420
+ drawer_door_handle_8: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
421
+ base_door_9: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
422
+ base_fixed_drawer_door_9: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
423
+ base_drawer_9: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
424
+ base_drawer_door_9: 'https://media.test.diydesignspace.com/uploads/DoorColor/202105065453_36/texture/White1px.jpeg',
425
+ door_handle_9: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
426
+ fixed_drawer_door_handle_9: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg',
427
+ drawer_door_handle_9: 'http://127.0.0.1:4002/uploads/assets/default/steel.jpg'
428
+ },
429
+ installation_types: [125, 124]
430
+ }
431
+ }
432
+ };
433
+ setExternalEvent(evt);
434
+ }
435
+ }, "Add Room shape(custom)"), /*#__PURE__*/React.createElement(Button, {
338
436
  actionType: "danger",
339
437
  onClick: function onClick() {
340
438
  var evt = {
@@ -729,6 +729,7 @@ function initPropData(element, catalog) {
729
729
  function updateAttributeOfSelectedElement(element, attrPayload, state, layer, catalog, projectActions) {
730
730
  var _attributesFormData;
731
731
  var callback = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
732
+ var layerUnit = state.getIn(['scene', 'layers', 'layer-1', 'unit']);
732
733
  var attributesFormData = initAttrData(element, layer, state);
733
734
  var value = attrPayload.value;
734
735
  var attributeName = attrPayload.attributeName;
@@ -736,28 +737,8 @@ function updateAttributeOfSelectedElement(element, attrPayload, state, layer, ca
736
737
  if (attributeName === ATT_ITEM_POS) {
737
738
  // calculate the new position of movement
738
739
  var rotRad = (value.directionAng + element.rotation) / 180 * Math.PI;
739
- var newX = element.x + convert((value.oldDistance - value.newDistance) * Math.cos(rotRad)).from('in').to('cm');
740
- var newY = element.y + convert((value.oldDistance - value.newDistance) * Math.sin(rotRad)).from('in').to('cm');
741
- // const reversedDirection =
742
- // value.directionAng === LEFT_DIST_ANG
743
- // ? RIGHT_DIST_ANG
744
- // : value.directionAng === RIGHT_DIST_ANG
745
- // ? LEFT_DIST_ANG
746
- // : value.directionAng === BACK_DIST_ANG
747
- // ? FRONT_DIST_ANG
748
- // : BACK_DIST_ANG;
749
- // let dist = convert(
750
- // element.distArray?.find(v => v[1] === reversedDirection)
751
- // ? element.distArray?.find(v => v[1] === reversedDirection)[0]
752
- // : 0
753
- // )
754
- // .from('cm')
755
- // .to('in');
756
- // if (dist + (value.oldDistance - value.newDistance) <= 0 || value.newDistance < 0) {
757
- // // confirm "The item will be placed outside the floor plan. Are you sure?"
758
- // setPopupOpen(true);
759
- // return;
760
- // }
740
+ var newX = element.x + convert((value.oldDistance - value.newDistance) * Math.cos(rotRad)).from(layerUnit).to('cm');
741
+ var newY = element.y + convert((value.oldDistance - value.newDistance) * Math.sin(rotRad)).from(layerUnit).to('cm');
761
742
  value = {
762
743
  x: newX,
763
744
  y: newY
@@ -766,8 +747,8 @@ function updateAttributeOfSelectedElement(element, attrPayload, state, layer, ca
766
747
  var att = attributesFormData.has(attributeName) ? attributesFormData.get(attributeName) : element[attributeName];
767
748
  if (att) value = att.merge({
768
749
  _length: value,
769
- _unit: UNIT_INCH,
770
- length: convert(value).from(UNIT_INCH).to(UNIT_CENTIMETER)
750
+ _unit: layerUnit,
751
+ length: convert(value).from(layerUnit).to(UNIT_CENTIMETER)
771
752
  });
772
753
  }
773
754
  // make the new attrivutes
@@ -1179,9 +1160,16 @@ function _handleExternalEvent() {
1179
1160
  while (1) switch (_context8.prev = _context8.next) {
1180
1161
  case 0:
1181
1162
  it = evt === null || evt === void 0 || (_evt$payload2 = evt.payload) === null || _evt$payload2 === void 0 || (_evt$payload2 = _evt$payload2.layers['layer-1']) === null || _evt$payload2 === void 0 ? void 0 : _evt$payload2.items[itemKeys[i]]; //////// check altitude of item property and change length from _length (convert length from 'in' fo 'cm')
1182
- if (it.properties.altitude.length !== convert(it.properties.altitude._length).from('in').to('cm')) {
1183
- it.properties.altitude.length = convert(it.properties.altitude._length).from('in').to('cm');
1184
- }
1163
+ // if (
1164
+ // it.properties.altitude.length !==
1165
+ // convert(it.properties.altitude._length).from('in').to('cm')
1166
+ // ) {
1167
+ // it.properties.altitude.length = convert(
1168
+ // it.properties.altitude._length
1169
+ // )
1170
+ // .from('in')
1171
+ // .to('cm');
1172
+ // }
1185
1173
  /////////
1186
1174
  if (!cdsItems.some(function (v) {
1187
1175
  var _it$doorStyle;
@@ -1254,7 +1242,7 @@ function _handleExternalEvent() {
1254
1242
  return _ref2.apply(this, arguments);
1255
1243
  };
1256
1244
  }());
1257
- }
1245
+ } else props.projectActions.loadProject(evt.payload);
1258
1246
  case 5:
1259
1247
  return _context1.abrupt("continue", 44);
1260
1248
  case 6:
@@ -1401,7 +1389,7 @@ function _handleExternalEvent() {
1401
1389
  } else props.itemsActions.setDoorStyle(doorStyle, itemCDS, isAll);
1402
1390
  return _context1.abrupt("continue", 44);
1403
1391
  case 20:
1404
- _evt$payload6 = evt.payload, roomShapeType = _evt$payload6.roomShapeType, width = _evt$payload6.width, height = _evt$payload6.height, _doorStyle = _evt$payload6.doorStyle; // console.log('****', layer);
1392
+ _evt$payload6 = evt.payload, roomShapeType = _evt$payload6.roomShapeType, width = _evt$payload6.width, height = _evt$payload6.height, _doorStyle = _evt$payload6.doorStyle;
1405
1393
  props.projectActions.createRoomWithShape(roomShapeType, width, height, _doorStyle);
1406
1394
  return _context1.abrupt("continue", 44);
1407
1395
  case 21:
@@ -31,8 +31,8 @@ var _translator = _interopRequireDefault(require("./translator/translator"));
31
31
  var _objectsUtils = require("./utils/objects-utils");
32
32
  var _version = require("./version");
33
33
  var _isolateEventHandler = require("./utils/isolate-event-handler");
34
- var _excluded = ["width", "height", "state", "stateExtractor", "measurementUnit"];
35
- var _templateObject, _templateObject2;
34
+ var _excluded = ["width", "height", "extractedState", "measurementUnit"];
35
+ var _templateObject, _templateObject2; // LiteKitchenConfigurator.jsx
36
36
  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); }
37
37
  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; }
38
38
  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; }
@@ -43,7 +43,7 @@ var wrapperStyle = {
43
43
  display: 'flex',
44
44
  flexFlow: 'row nowrap'
45
45
  };
46
- var WarningItem = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n opacity: 0.8;\n position: absolute;\n border-radius: 6px;\n z-index: 11;\n background-color: #ff7400;\n width: max-content;\n align-items: center;\n padding: 10px;\n display: none;\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2),\n 0px 6px 10px 0px rgba(0, 0, 0, 0.39), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);\n top: -50px;\n left: 5px;\n color: white;\n"])));
46
+ var WarningItem = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n opacity: 0.8;\n position: absolute;\n border-radius: 6px;\n z-index: 11;\n background-color: #ff7400;\n width: max-content;\n align-items: center;\n padding: 10px;\n display: none;\n box-shadow:\n 0px 3px 5px -1px rgba(0, 0, 0, 0.2),\n 0px 6px 10px 0px rgba(0, 0, 0, 0.39),\n 0px 1px 18px 0px rgba(0, 0, 0, 0.12);\n top: -50px;\n left: 5px;\n color: white;\n"])));
47
47
  var SubCategoryItemImage = _styledComponents["default"].img(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n height: 30px;\n width: 30px;\n -webkit-mask-image: url(", ");\n -webkit-mask-size: calc(100% - 2px) calc(100% - 2px);\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-position: 1px 1px;\n"])), constants.SECONDARY_PURPLE_COLOR, function (props) {
48
48
  return props.maskImage + '?nocache=2025';
49
49
  });
@@ -53,8 +53,6 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
53
53
  var _this;
54
54
  (0, _classCallCheck2["default"])(this, LiteKitchenConfigurator);
55
55
  _this = _callSuper(this, LiteKitchenConfigurator, [props]);
56
-
57
- // utm tracking
58
56
  var utmDetailParams = new URLSearchParams(_this.props.location && _this.props.location.search);
59
57
  var utmStrEncoded = utmDetailParams.get('details');
60
58
  var utmRequestData = null;
@@ -64,7 +62,7 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
64
62
  utmRequestData = JSON.parse((0, _helper.base64Decode)(utmStrEncoded));
65
63
  utmRequestData = JSON.parse((_utmRequestData = utmRequestData) === null || _utmRequestData === void 0 ? void 0 : _utmRequestData.utm);
66
64
  } catch (e) {
67
- console.error('Cannot parse utm parameter: ', error);
65
+ console.error('Cannot parse utm parameter: ', e);
68
66
  utmRequestData = null;
69
67
  }
70
68
  }
@@ -83,7 +81,6 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
83
81
  myProjectsOpen: false,
84
82
  myProjectsToLogin: false,
85
83
  downloadPopupVisible: false,
86
- // For Toolbar Item
87
84
  toolbar: '',
88
85
  reviewQuotePopupOpened: false,
89
86
  floorOpened: false,
@@ -101,8 +98,6 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
101
98
  isSaved: false,
102
99
  isLeaving: false
103
100
  };
104
-
105
- // For UTM tracking
106
101
  _this.utm = {
107
102
  utm_source: ((_utmRequestData2 = utmRequestData) === null || _utmRequestData2 === void 0 ? void 0 : _utmRequestData2.source) || 'source',
108
103
  utm_medium: ((_utmRequestData3 = utmRequestData) === null || _utmRequestData3 === void 0 ? void 0 : _utmRequestData3.medium) || 'medium',
@@ -133,10 +128,12 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
133
128
  _this.setDownloadPopupVisible = _this.setDownloadPopupVisible.bind(_this);
134
129
  _this.neverShowInput = /*#__PURE__*/_react["default"].createRef(null);
135
130
  _this.setShowProperty = _this.setShowProperty.bind(_this);
131
+
132
+ // cache to avoid immutable merge allocations every render
133
+ _this._cachedViewer2DKey = null;
134
+ _this._cachedExtractedState = null;
136
135
  return _this;
137
136
  }
138
-
139
- // Toolbar control functions
140
137
  (0, _inherits2["default"])(LiteKitchenConfigurator, _Component);
141
138
  return (0, _createClass2["default"])(LiteKitchenConfigurator, [{
142
139
  key: "setToolbar",
@@ -220,26 +217,32 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
220
217
  }, {
221
218
  key: "openFloor",
222
219
  value: function openFloor() {
220
+ var _el$parentElement;
223
221
  this.setState({
224
222
  floorOpened: true
225
223
  });
226
- document.getElementById('make_floorplan_inactive').parentElement.parentElement.style.zIndex = 999;
224
+ var el = document.getElementById('make_floorplan_inactive');
225
+ el && ((_el$parentElement = el.parentElement) === null || _el$parentElement === void 0 ? void 0 : _el$parentElement.parentElement) && (el.parentElement.parentElement.style.zIndex = 999);
227
226
  }
228
227
  }, {
229
228
  key: "openCabinet",
230
229
  value: function openCabinet() {
230
+ var _el$parentElement2;
231
231
  this.setState({
232
232
  cabinetOpened: true
233
233
  });
234
- document.getElementById('add_cabinets_inactive').parentElement.parentElement.style.zIndex = 999;
234
+ var el = document.getElementById('add_cabinets_inactive');
235
+ el && ((_el$parentElement2 = el.parentElement) === null || _el$parentElement2 === void 0 ? void 0 : _el$parentElement2.parentElement) && (el.parentElement.parentElement.style.zIndex = 999);
235
236
  }
236
237
  }, {
237
238
  key: "toggleDoorStyle",
238
239
  value: function toggleDoorStyle(visible) {
240
+ var _el$parentElement3;
239
241
  this.setState({
240
242
  doorStyleOpen: visible
241
243
  });
242
- document.getElementById('select_doorstyle_inactive').parentElement.parentElement.style.zIndex = visible ? 999 : 6;
244
+ var el = document.getElementById('select_doorstyle_inactive');
245
+ el && ((_el$parentElement3 = el.parentElement) === null || _el$parentElement3 === void 0 ? void 0 : _el$parentElement3.parentElement) && (el.parentElement.parentElement.style.zIndex = visible ? 999 : 6);
243
246
  }
244
247
  }, {
245
248
  key: "replaceCabinet",
@@ -251,70 +254,72 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
251
254
  }, {
252
255
  key: "openAppliance",
253
256
  value: function openAppliance() {
257
+ var _el$parentElement4;
254
258
  this.setState({
255
259
  applianceOpened: true
256
260
  });
257
- document.getElementById('add_appliances_inactive').parentElement.parentElement.style.zIndex = 999;
261
+ var el = document.getElementById('add_appliances_inactive');
262
+ el && ((_el$parentElement4 = el.parentElement) === null || _el$parentElement4 === void 0 ? void 0 : _el$parentElement4.parentElement) && (el.parentElement.parentElement.style.zIndex = 999);
258
263
  }
259
264
  }, {
260
265
  key: "openFinishing",
261
266
  value: function openFinishing() {
267
+ var _el$parentElement5;
262
268
  this.setState({
263
269
  finishingOpened: true
264
270
  });
265
- document.getElementById('finishing_touches_inactive').parentElement.parentElement.style.zIndex = 999;
271
+ var el = document.getElementById('finishing_touches_inactive');
272
+ el && ((_el$parentElement5 = el.parentElement) === null || _el$parentElement5 === void 0 ? void 0 : _el$parentElement5.parentElement) && (el.parentElement.parentElement.style.zIndex = 999);
266
273
  }
267
274
  }, {
268
275
  key: "onReviewQuoteClicked",
269
276
  value: function onReviewQuoteClicked(visible) {
277
+ var _el$parentElement6;
270
278
  this.setState({
271
279
  reviewQuotePopupOpened: visible
272
280
  });
273
- document.getElementById('review_quote_inactive').parentElement.parentElement.style.zIndex = visible ? 999 : 6;
281
+ var el = document.getElementById('review_quote_inactive');
282
+ el && ((_el$parentElement6 = el.parentElement) === null || _el$parentElement6 === void 0 ? void 0 : _el$parentElement6.parentElement) && (el.parentElement.parentElement.style.zIndex = visible ? 999 : 6);
274
283
  }
275
284
  }, {
276
285
  key: "closeFloorTB",
277
286
  value: function closeFloorTB() {
287
+ var _el$parentElement7;
278
288
  this.setState({
279
289
  floorOpened: false
280
290
  });
281
- document.getElementById('make_floorplan_inactive') && (document.getElementById('make_floorplan_inactive').parentElement.parentElement.style.zIndex = 6);
291
+ var el = document.getElementById('make_floorplan_inactive');
292
+ el && ((_el$parentElement7 = el.parentElement) === null || _el$parentElement7 === void 0 ? void 0 : _el$parentElement7.parentElement) && (el.parentElement.parentElement.style.zIndex = 6);
282
293
  }
283
294
  }, {
284
295
  key: "closeCabinetTB",
285
296
  value: function closeCabinetTB() {
297
+ var _el$parentElement8;
286
298
  this.setState({
287
299
  cabinetOpened: false
288
300
  });
289
- document.getElementById('add_cabinets_inactive').parentElement.parentElement.style.zIndex = 6;
301
+ var el = document.getElementById('add_cabinets_inactive');
302
+ el && ((_el$parentElement8 = el.parentElement) === null || _el$parentElement8 === void 0 ? void 0 : _el$parentElement8.parentElement) && (el.parentElement.parentElement.style.zIndex = 6);
290
303
  }
291
304
  }, {
292
305
  key: "closeFinishingTB",
293
306
  value: function closeFinishingTB() {
307
+ var _el$parentElement9;
294
308
  this.setState({
295
309
  finishingOpened: false
296
310
  });
297
- document.getElementById('finishing_touches_inactive').parentElement.parentElement.style.zIndex = 6;
311
+ var el = document.getElementById('finishing_touches_inactive');
312
+ el && ((_el$parentElement9 = el.parentElement) === null || _el$parentElement9 === void 0 ? void 0 : _el$parentElement9.parentElement) && (el.parentElement.parentElement.style.zIndex = 6);
298
313
  }
299
314
  }, {
300
315
  key: "closeApplianceTB",
301
316
  value: function closeApplianceTB() {
317
+ var _el$parentElement0;
302
318
  this.setState({
303
319
  applianceOpened: false
304
320
  });
305
- document.getElementById('add_appliances_inactive').parentElement.parentElement.style.zIndex = 6;
306
- }
307
- }, {
308
- key: "closeDoorstyle",
309
- value: function closeDoorstyle() {
310
- this.setState({});
311
- document.getElementById('select_doorstyle_inactive').parentElement.parentElement.style.zIndex = 6;
312
- }
313
- }, {
314
- key: "closeReviewQuote",
315
- value: function closeReviewQuote() {
316
- this.setState({});
317
- document.getElementById('review_quote_inactive').parentElement.parentElement.style.zIndex = 6;
321
+ var el = document.getElementById('add_appliances_inactive');
322
+ el && ((_el$parentElement0 = el.parentElement) === null || _el$parentElement0 === void 0 ? void 0 : _el$parentElement0.parentElement) && (el.parentElement.parentElement.style.zIndex = 6);
318
323
  }
319
324
  }, {
320
325
  key: "getChildContext",
@@ -330,7 +335,6 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
330
335
  }, {
331
336
  key: "componentDidMount",
332
337
  value: function componentDidMount() {
333
- console.log('context =>', this.context);
334
338
  window.forRedo = [];
335
339
  var store = this.context.store;
336
340
  var _this$props = this.props,
@@ -342,21 +346,23 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
342
346
  });
343
347
  }
344
348
  }, {
345
- key: "componentWillReceiveProps",
346
- value: function componentWillReceiveProps(nextProps) {
347
- var stateExtractor = nextProps.stateExtractor,
348
- state = nextProps.state,
349
- projectActions = nextProps.projectActions,
350
- catalog = nextProps.catalog,
351
- externalEvent = nextProps.externalEvent,
352
- onInternalEvent = nextProps.onInternalEvent;
349
+ key: "componentDidUpdate",
350
+ value: function componentDidUpdate(prevProps) {
351
+ var _extractedState$getIn;
352
+ var _this$props2 = this.props,
353
+ externalEvent = _this$props2.externalEvent,
354
+ stateExtractor = _this$props2.stateExtractor,
355
+ extractedState = _this$props2.extractedState,
356
+ projectActions = _this$props2.projectActions,
357
+ catalog = _this$props2.catalog;
353
358
 
354
- // handle external events
355
- if (this.props.externalEvent !== externalEvent) {
356
- (0, _isolateEventHandler.handleExternalEvent)(nextProps);
359
+ // handle external events (same behavior as before)
360
+ if (prevProps.externalEvent !== externalEvent) {
361
+ (0, _isolateEventHandler.handleExternalEvent)(this.props);
357
362
  }
358
- var plannerState = stateExtractor(state);
359
- var catalogReady = plannerState.getIn(['catalog', 'ready']);
363
+
364
+ // init catalog once ready flag says not ready (same behavior)
365
+ var catalogReady = extractedState === null || extractedState === void 0 || (_extractedState$getIn = extractedState.getIn) === null || _extractedState$getIn === void 0 ? void 0 : _extractedState$getIn.call(extractedState, ['catalog', 'ready']);
360
366
  if (!catalogReady) {
361
367
  projectActions.initCatalog(catalog);
362
368
  }
@@ -369,16 +375,55 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
369
375
  var layer = layers.get(selectedLayer);
370
376
  return layer.areas.size + layer.lines.size + layer.holes.size + layer.items.size === 0;
371
377
  }
378
+
379
+ // Compute viewer2D transform only when needed, and cache it.
380
+ // This preserves the exact visual result but avoids merge allocations every render.
381
+ }, {
382
+ key: "getExtractedStateWithViewer2DInit",
383
+ value: function getExtractedStateWithViewer2DInit(extractedState, width, height) {
384
+ if (!extractedState) return extractedState;
385
+ var _scene = extractedState.getIn(['scene']);
386
+ var len = (0, _convertUnitsLite.convert)(_scene.width).from(_scene.unit).to('cm');
387
+ var _viewer2D = extractedState.getIn(['viewer2D']);
388
+ if (!_viewer2D || _viewer2D.size <= 0) return extractedState;
389
+
390
+ // build a stable cache key based on inputs that affect the result
391
+ var v = _viewer2D.toJS();
392
+ var cacheKey = "".concat(width, ":").concat(height, ":").concat(len, ":").concat(v.e, ":").concat(v.f, ":").concat(v.viewerWidth, ":").concat(v.viewerHeight, ":").concat(v.SVGWidth, ":").concat(v.SVGHeight);
393
+ if (this._cachedViewer2DKey === cacheKey && this._cachedExtractedState) {
394
+ return this._cachedExtractedState;
395
+ }
396
+
397
+ // your original logic
398
+ if (v.e === 0 && v.f === 0) {
399
+ _viewer2D = _viewer2D.merge({
400
+ e: v.viewerWidth / 2 - v.SVGWidth / 2,
401
+ f: v.viewerHeight / 2 - v.SVGHeight / 2,
402
+ a: 0.99,
403
+ d: 0.99
404
+ });
405
+ var merged = extractedState.merge({
406
+ viewer2D: _viewer2D
407
+ });
408
+ this._cachedViewer2DKey = cacheKey;
409
+ this._cachedExtractedState = merged;
410
+ return merged;
411
+ }
412
+
413
+ // no merge needed
414
+ this._cachedViewer2DKey = cacheKey;
415
+ this._cachedExtractedState = extractedState;
416
+ return extractedState;
417
+ }
372
418
  }, {
373
419
  key: "render",
374
420
  value: function render() {
375
- var _this$props2 = this.props,
376
- width = _this$props2.width,
377
- height = _this$props2.height,
378
- state = _this$props2.state,
379
- stateExtractor = _this$props2.stateExtractor,
380
- measurementUnit = _this$props2.measurementUnit,
381
- props = (0, _objectWithoutProperties2["default"])(_this$props2, _excluded);
421
+ var _this$props3 = this.props,
422
+ width = _this$props3.width,
423
+ height = _this$props3.height,
424
+ extractedState = _this$props3.extractedState,
425
+ measurementUnit = _this$props3.measurementUnit,
426
+ props = (0, _objectWithoutProperties2["default"])(_this$props3, _excluded);
382
427
  var _this$state = this.state,
383
428
  savePopupVisible = _this$state.savePopupVisible,
384
429
  quotePopupVisible = _this$state.quotePopupVisible,
@@ -386,40 +431,12 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
386
431
  signOpen = _this$state.signOpen,
387
432
  myProjectsOpen = _this$state.myProjectsOpen;
388
433
  var contentW = width - toolbarW;
389
- // let contentW = width - toolbarW - sidebarW;
390
- // let toolbarH = height - footerBarH;
391
- // let contentH = height - footerBarH;
392
- // let sidebarH = height - footerBarH;
393
- var toolbarH = height;
394
434
  var contentH = height;
395
- var sidebarH = height;
396
435
  var headerW = width;
397
436
  var headerH = 60;
398
- var extractedState = stateExtractor(state);
399
- var firstVisit = this.state.wizardStepOpend && this.isProjectEmpty(extractedState.scene);
437
+ var extracted = this.getExtractedStateWithViewer2DInit(extractedState, width, height);
438
+ var firstVisit = this.state.wizardStepOpend && this.isProjectEmpty(extracted.scene);
400
439
  var allVisible = firstVisit || signOpen || myProjectsOpen;
401
- var _scene = extractedState.getIn(['scene']);
402
- var len = (0, _convertUnitsLite.convert)(_scene.width).from(_scene.unit).to('cm');
403
- var _viewer2D = extractedState.getIn(['viewer2D']);
404
- if (_viewer2D.size > 0) {
405
- var scaleX = width / len * 3;
406
- var scaleY = height / len * 3;
407
- var scale = scaleX > scaleY ? scaleY : scaleX;
408
- var _e = width - len * scale,
409
- _f = height - len * scale;
410
- var viewer = _viewer2D.toJS();
411
- if (viewer.e === 0 && viewer.f === 0) {
412
- _viewer2D = _viewer2D.merge({
413
- e: viewer.viewerWidth / 2 - viewer.SVGWidth / 2,
414
- f: viewer.viewerHeight / 2 - viewer.SVGHeight / 2,
415
- a: 0.99,
416
- d: 0.99
417
- });
418
- }
419
- }
420
- extractedState = extractedState.merge({
421
- viewer2D: _viewer2D
422
- });
423
440
  return /*#__PURE__*/_react["default"].createElement("section", null, /*#__PURE__*/_react["default"].createElement("div", {
424
441
  style: _objectSpread(_objectSpread({}, wrapperStyle), {}, {
425
442
  height: height,
@@ -431,7 +448,7 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
431
448
  width: contentW,
432
449
  height: contentH,
433
450
  catalog: this.props.catalog,
434
- state: extractedState,
451
+ state: extracted,
435
452
  toolBar: this.state.toolbar,
436
453
  setToolbar: this.setToolbar,
437
454
  replaceCabinet: this.replaceCabinet,
@@ -473,7 +490,8 @@ LiteKitchenConfigurator.propTypes = {
473
490
  customContents: _propTypes["default"].object,
474
491
  softwareSignature: _propTypes["default"].string,
475
492
  configData: _propTypes["default"].object,
476
- onInternalEvent: _propTypes["default"].func
493
+ onInternalEvent: _propTypes["default"].func,
494
+ extractedState: _propTypes["default"].object // <-- new injected prop
477
495
  };
478
496
  LiteKitchenConfigurator.contextTypes = {
479
497
  store: _propTypes["default"].object.isRequired
@@ -496,10 +514,14 @@ LiteKitchenConfigurator.defaultProps = {
496
514
  configData: {}
497
515
  };
498
516
 
499
- //redux connect
500
- function mapStateToProps(reduxState) {
517
+ // IMPORTANT: select only the extracted slice so top component doesn't rerender on every dispatch
518
+ function mapStateToProps(reduxState, ownProps) {
519
+ var stateExtractor = ownProps.stateExtractor || function (s) {
520
+ return s;
521
+ };
522
+ var extractedState = stateExtractor(reduxState);
501
523
  return {
502
- state: reduxState
524
+ extractedState: extractedState
503
525
  };
504
526
  }
505
527
  function mapDispatchToProps(dispatch) {