kitchen-simulator 4.0.0-react-18 → 4.0.0

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.
Files changed (180) hide show
  1. package/README.md +3 -0
  2. package/es/AppContext.js +1 -1
  3. package/es/LiteKitchenConfigurator.js +156 -108
  4. package/es/LiteRenderer.js +159 -130
  5. package/es/actions/export.js +25 -12
  6. package/es/assets/gltf/door_sliding.bin +0 -0
  7. package/es/assets/img/png/helper/video_preview_start.png +0 -0
  8. package/es/assets/img/svg/bottombar/elevation.svg +12 -5
  9. package/es/catalog/catalog.js +21 -5
  10. package/es/catalog/holes/window-clear/planner-element.js +2 -2
  11. package/es/catalog/properties/export.js +21 -0
  12. package/es/catalog/properties/property-checkbox.js +68 -0
  13. package/es/catalog/properties/property-color.js +39 -0
  14. package/es/catalog/properties/property-enum.js +50 -0
  15. package/es/catalog/properties/property-hidden.js +19 -0
  16. package/es/catalog/properties/property-lenght-measure.js +100 -0
  17. package/es/catalog/properties/property-length-measure.js +84 -0
  18. package/es/catalog/properties/property-length-measure_hole.js +100 -0
  19. package/es/catalog/properties/property-number.js +48 -0
  20. package/es/catalog/properties/property-read-only.js +26 -0
  21. package/es/catalog/properties/property-string.js +48 -0
  22. package/es/catalog/properties/property-toggle.js +39 -0
  23. package/es/catalog/properties/shared-property-style.js +14 -0
  24. package/es/catalog/utils/exporter.js +1 -0
  25. package/es/catalog/utils/item-loader.js +17 -12
  26. package/es/class/hole.js +0 -2
  27. package/es/class/item.js +95 -69
  28. package/es/class/line.js +4 -8
  29. package/es/class/project.js +91 -80
  30. package/es/components/content.js +5 -2
  31. package/es/components/export.js +4 -6
  32. package/es/components/style/button.js +106 -0
  33. package/es/components/style/cancel-button.js +21 -0
  34. package/es/components/style/content-container.js +30 -0
  35. package/es/components/style/content-title.js +25 -0
  36. package/es/components/style/delete-button.js +24 -0
  37. package/es/components/style/export.js +28 -2
  38. package/es/components/style/form-block.js +20 -0
  39. package/es/components/style/form-color-input.js +26 -0
  40. package/es/components/style/form-label.js +22 -0
  41. package/es/components/style/form-number-input.js +11 -22
  42. package/es/components/style/form-number-input_2.js +200 -0
  43. package/es/components/style/form-select.js +19 -0
  44. package/es/components/style/form-slider.js +60 -0
  45. package/es/components/style/form-submit-button.js +25 -0
  46. package/es/components/style/form-text-input.js +69 -0
  47. package/es/components/viewer2d/group.js +5 -4
  48. package/es/components/viewer2d/item.js +41 -16
  49. package/es/components/viewer2d/layer.js +1 -1
  50. package/es/components/viewer2d/line.js +17 -47
  51. package/es/components/viewer2d/ruler.js +5 -3
  52. package/es/components/viewer2d/rulerDist.js +8 -7
  53. package/es/components/viewer2d/rulerX.js +3 -0
  54. package/es/components/viewer2d/rulerY.js +3 -0
  55. package/es/components/viewer2d/scene.js +4 -1
  56. package/es/components/viewer2d/state.js +1 -1
  57. package/es/components/viewer2d/utils.js +2 -2
  58. package/es/components/viewer2d/viewer2d.js +51 -84
  59. package/es/components/viewer3d/scene-creator.js +51 -15
  60. package/es/components/viewer3d/viewer3d-first-person.js +8 -0
  61. package/es/components/viewer3d/viewer3d.js +80 -88
  62. package/es/constants.js +6 -2
  63. package/es/devLiteRenderer.js +491 -150
  64. package/es/index.js +567 -25
  65. package/es/models.js +2 -1
  66. package/es/plugins/SVGLoader.js +1414 -0
  67. package/es/plugins/console-debugger.js +0 -2
  68. package/es/styles/export.js +5 -0
  69. package/es/styles/tabs.css +40 -0
  70. package/es/utils/geometry.js +52 -96
  71. package/es/utils/helper.js +38 -1
  72. package/es/utils/isolate-event-handler.js +781 -577
  73. package/es/utils/molding.js +457 -11
  74. package/lib/AppContext.js +1 -1
  75. package/lib/LiteKitchenConfigurator.js +155 -108
  76. package/lib/LiteRenderer.js +158 -130
  77. package/lib/actions/export.js +35 -39
  78. package/lib/assets/gltf/door_sliding.bin +0 -0
  79. package/lib/assets/img/png/helper/video_preview_start.png +0 -0
  80. package/lib/assets/img/svg/bottombar/elevation.svg +12 -5
  81. package/lib/catalog/catalog.js +20 -4
  82. package/lib/catalog/holes/window-clear/planner-element.js +2 -2
  83. package/lib/catalog/properties/export.js +81 -0
  84. package/lib/catalog/properties/property-checkbox.js +76 -0
  85. package/lib/catalog/properties/property-color.js +47 -0
  86. package/lib/catalog/properties/property-enum.js +58 -0
  87. package/lib/catalog/properties/property-hidden.js +27 -0
  88. package/lib/catalog/properties/property-lenght-measure.js +108 -0
  89. package/lib/catalog/properties/property-length-measure.js +92 -0
  90. package/lib/catalog/properties/property-length-measure_hole.js +108 -0
  91. package/lib/catalog/properties/property-number.js +56 -0
  92. package/lib/catalog/properties/property-read-only.js +34 -0
  93. package/lib/catalog/properties/property-string.js +56 -0
  94. package/lib/catalog/properties/property-toggle.js +47 -0
  95. package/lib/catalog/properties/shared-property-style.js +21 -0
  96. package/lib/catalog/utils/exporter.js +1 -0
  97. package/lib/catalog/utils/item-loader.js +17 -12
  98. package/lib/class/hole.js +0 -2
  99. package/lib/class/item.js +93 -67
  100. package/lib/class/line.js +3 -7
  101. package/lib/class/project.js +91 -80
  102. package/lib/components/content.js +5 -2
  103. package/lib/components/export.js +6 -26
  104. package/lib/components/style/button.js +115 -0
  105. package/lib/components/style/cancel-button.js +29 -0
  106. package/lib/components/style/content-container.js +38 -0
  107. package/lib/components/style/content-title.js +35 -0
  108. package/lib/components/style/delete-button.js +34 -0
  109. package/lib/components/style/export.js +105 -1
  110. package/lib/components/style/form-block.js +28 -0
  111. package/lib/components/style/form-color-input.js +34 -0
  112. package/lib/components/style/form-label.js +30 -0
  113. package/lib/components/style/form-number-input.js +11 -22
  114. package/lib/components/style/form-number-input_2.js +209 -0
  115. package/lib/components/style/form-select.js +29 -0
  116. package/lib/components/style/form-slider.js +68 -0
  117. package/lib/components/style/form-submit-button.js +35 -0
  118. package/lib/components/style/form-text-input.js +78 -0
  119. package/lib/components/viewer2d/group.js +5 -4
  120. package/lib/components/viewer2d/item.js +41 -16
  121. package/lib/components/viewer2d/layer.js +1 -1
  122. package/lib/components/viewer2d/line.js +17 -47
  123. package/lib/components/viewer2d/ruler.js +4 -2
  124. package/lib/components/viewer2d/rulerDist.js +8 -7
  125. package/lib/components/viewer2d/rulerX.js +3 -0
  126. package/lib/components/viewer2d/rulerY.js +3 -0
  127. package/lib/components/viewer2d/scene.js +4 -1
  128. package/lib/components/viewer2d/state.js +1 -1
  129. package/lib/components/viewer2d/utils.js +2 -2
  130. package/lib/components/viewer2d/viewer2d.js +49 -81
  131. package/lib/components/viewer3d/scene-creator.js +49 -13
  132. package/lib/components/viewer3d/viewer3d-first-person.js +8 -0
  133. package/lib/components/viewer3d/viewer3d.js +77 -84
  134. package/lib/constants.js +11 -7
  135. package/lib/devLiteRenderer.js +489 -148
  136. package/lib/index.js +567 -25
  137. package/lib/models.js +2 -1
  138. package/lib/plugins/SVGLoader.js +1419 -0
  139. package/lib/plugins/console-debugger.js +0 -2
  140. package/lib/styles/export.js +13 -0
  141. package/lib/styles/tabs.css +40 -0
  142. package/lib/utils/geometry.js +52 -96
  143. package/lib/utils/helper.js +40 -1
  144. package/lib/utils/isolate-event-handler.js +781 -576
  145. package/lib/utils/molding.js +458 -9
  146. package/package.json +21 -16
  147. package/es/mocks/appliancePayload.json +0 -27
  148. package/es/mocks/cabinetPayload.json +0 -1914
  149. package/es/mocks/cabinetPayload2.json +0 -76
  150. package/es/mocks/dataBundle2.json +0 -4
  151. package/es/mocks/distancePayload.json +0 -6
  152. package/es/mocks/doorStylePayload2.json +0 -84
  153. package/es/mocks/furnishingPayload.json +0 -23
  154. package/es/mocks/itemCDSPayload.json +0 -27
  155. package/es/mocks/lightingPayload.json +0 -23
  156. package/es/mocks/mockProps.json +0 -43
  157. package/es/mocks/mockProps2.json +0 -9
  158. package/es/mocks/moldingPayload.json +0 -19
  159. package/es/mocks/projectItemsCatalog.json +0 -133
  160. package/es/mocks/rectangleShape.json +0 -238
  161. package/es/mocks/replaceCabinetPayload.json +0 -81
  162. package/es/mocks/roomShapePayload.json +0 -5
  163. package/es/useAppContext.js +0 -8
  164. package/lib/mocks/appliancePayload.json +0 -27
  165. package/lib/mocks/cabinetPayload.json +0 -1914
  166. package/lib/mocks/cabinetPayload2.json +0 -76
  167. package/lib/mocks/dataBundle2.json +0 -4
  168. package/lib/mocks/distancePayload.json +0 -6
  169. package/lib/mocks/doorStylePayload2.json +0 -84
  170. package/lib/mocks/furnishingPayload.json +0 -23
  171. package/lib/mocks/itemCDSPayload.json +0 -27
  172. package/lib/mocks/lightingPayload.json +0 -23
  173. package/lib/mocks/mockProps.json +0 -43
  174. package/lib/mocks/mockProps2.json +0 -9
  175. package/lib/mocks/moldingPayload.json +0 -19
  176. package/lib/mocks/projectItemsCatalog.json +0 -133
  177. package/lib/mocks/rectangleShape.json +0 -238
  178. package/lib/mocks/replaceCabinetPayload.json +0 -81
  179. package/lib/mocks/roomShapePayload.json +0 -5
  180. package/lib/useAppContext.js +0 -16
package/README.md CHANGED
@@ -44,12 +44,15 @@ You need to check **webpack.config.js** to change the API server.
44
44
  Webpack is used as the module bundler. The source code is in the **src** folder.
45
45
 
46
46
  entry: {
47
+ // app: './src/renderer.jsx', // For production build WITH API
47
48
  app: './src/devLiteRenderer.jsx', // For development of LiteRenderer
48
49
  vendor: VENDORS_LIBRARIES
49
50
  },
50
51
 
51
52
  - **index.html**: The main HTML file.
52
53
 
54
+ - **[renderer.jsx](src/renderer.jsx)**: The main JavaScript file that bootstraps the React application. WTH API CALLS
55
+
53
56
  - **[devLiteRenderer.jsx](src/devLiteRenderer.jsx).jsx**: The main JavaScript file that bootstraps the React application. For development lite version without API calls. WITH MOCKS
54
57
  - **[LiteRenderer.js](src/LiteRenderer.js)**: The Lite React component that uses mock data and creates the store / catalog etc
55
58
  - [LiteKitchenConfigurator.jsx](src/LiteKitchenConfigurator.jsx)
package/es/AppContext.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
- var AppContext = /*#__PURE__*/React.createContext(null);
2
+ var AppContext = /*#__PURE__*/React.createContext({});
3
3
  export default AppContext;
@@ -1,17 +1,21 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4
3
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
4
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
5
5
  import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
6
6
  import _createClass from "@babel/runtime/helpers/esm/createClass";
7
7
  import _possibleConstructorReturn from "@babel/runtime/helpers/esm/possibleConstructorReturn";
8
8
  import _getPrototypeOf from "@babel/runtime/helpers/esm/getPrototypeOf";
9
9
  import _inherits from "@babel/runtime/helpers/esm/inherits";
10
- var _excluded = ["width", "height", "state", "stateExtractor"];
10
+ import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
11
+ var _excluded = ["width", "height", "extractedState"];
12
+ var _templateObject, _templateObject2;
11
13
  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; }
12
14
  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; }
13
15
  function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
14
16
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
17
+ // LiteKitchenConfigurator.jsx
18
+ import styled from 'styled-components';
15
19
  import { convert } from "./utils/convert-units-lite";
16
20
  import PropTypes from 'prop-types';
17
21
  import React, { Component } from 'react';
@@ -26,20 +30,21 @@ import Translator from "./translator/translator";
26
30
  import { objectsMap } from "./utils/objects-utils";
27
31
  import { VERSION } from "./version";
28
32
  import { handleExternalEvent } from "./utils/isolate-event-handler";
29
- import AppContext from "./AppContext";
30
33
  var toolbarW = 0;
31
34
  var wrapperStyle = {
32
35
  display: 'flex',
33
36
  flexFlow: 'row nowrap'
34
37
  };
38
+ var WarningItem = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\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"])));
39
+ var SubCategoryItemImage = styled.img(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\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) {
40
+ return props.maskImage + '?nocache=2025';
41
+ });
35
42
  var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
36
43
  function LiteKitchenConfigurator(props) {
37
44
  var _utmRequestData2, _utmRequestData3, _utmRequestData4, _utmRequestData5, _utmRequestData6, _utmRequestData7, _utmRequestData8, _utmRequestData9, _utmRequestData0;
38
45
  var _this;
39
46
  _classCallCheck(this, LiteKitchenConfigurator);
40
47
  _this = _callSuper(this, LiteKitchenConfigurator, [props]);
41
-
42
- // utm tracking
43
48
  var utmDetailParams = new URLSearchParams(_this.props.location && _this.props.location.search);
44
49
  var utmStrEncoded = utmDetailParams.get('details');
45
50
  var utmRequestData = null;
@@ -49,7 +54,7 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
49
54
  utmRequestData = JSON.parse(base64Decode(utmStrEncoded));
50
55
  utmRequestData = JSON.parse((_utmRequestData = utmRequestData) === null || _utmRequestData === void 0 ? void 0 : _utmRequestData.utm);
51
56
  } catch (e) {
52
- console.error('Cannot parse utm parameter: ', error);
57
+ console.error('Cannot parse utm parameter: ', e);
53
58
  utmRequestData = null;
54
59
  }
55
60
  }
@@ -68,7 +73,6 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
68
73
  myProjectsOpen: false,
69
74
  myProjectsToLogin: false,
70
75
  downloadPopupVisible: false,
71
- // For Toolbar Item
72
76
  toolbar: '',
73
77
  reviewQuotePopupOpened: false,
74
78
  floorOpened: false,
@@ -86,8 +90,6 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
86
90
  isSaved: false,
87
91
  isLeaving: false
88
92
  };
89
-
90
- // For UTM tracking
91
93
  _this.utm = {
92
94
  utm_source: ((_utmRequestData2 = utmRequestData) === null || _utmRequestData2 === void 0 ? void 0 : _utmRequestData2.source) || 'source',
93
95
  utm_medium: ((_utmRequestData3 = utmRequestData) === null || _utmRequestData3 === void 0 ? void 0 : _utmRequestData3.medium) || 'medium',
@@ -118,10 +120,13 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
118
120
  _this.setDownloadPopupVisible = _this.setDownloadPopupVisible.bind(_this);
119
121
  _this.neverShowInput = /*#__PURE__*/React.createRef(null);
120
122
  _this.setShowProperty = _this.setShowProperty.bind(_this);
123
+
124
+ // cache for viewer2D init so we don't allocate merges every render
125
+ _this._lastExtractedStateRef = null;
126
+ _this._cachedViewer2DKey = null;
127
+ _this._cachedExtractedState = null;
121
128
  return _this;
122
129
  }
123
-
124
- // Toolbar control functions
125
130
  _inherits(LiteKitchenConfigurator, _Component);
126
131
  return _createClass(LiteKitchenConfigurator, [{
127
132
  key: "setToolbar",
@@ -205,26 +210,32 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
205
210
  }, {
206
211
  key: "openFloor",
207
212
  value: function openFloor() {
213
+ var _el$parentElement;
208
214
  this.setState({
209
215
  floorOpened: true
210
216
  });
211
- document.getElementById('make_floorplan_inactive').parentElement.parentElement.style.zIndex = 999;
217
+ var el = document.getElementById('make_floorplan_inactive');
218
+ if (el !== null && el !== void 0 && (_el$parentElement = el.parentElement) !== null && _el$parentElement !== void 0 && _el$parentElement.parentElement) el.parentElement.parentElement.style.zIndex = 999;
212
219
  }
213
220
  }, {
214
221
  key: "openCabinet",
215
222
  value: function openCabinet() {
223
+ var _el$parentElement2;
216
224
  this.setState({
217
225
  cabinetOpened: true
218
226
  });
219
- document.getElementById('add_cabinets_inactive').parentElement.parentElement.style.zIndex = 999;
227
+ var el = document.getElementById('add_cabinets_inactive');
228
+ if (el !== null && el !== void 0 && (_el$parentElement2 = el.parentElement) !== null && _el$parentElement2 !== void 0 && _el$parentElement2.parentElement) el.parentElement.parentElement.style.zIndex = 999;
220
229
  }
221
230
  }, {
222
231
  key: "toggleDoorStyle",
223
232
  value: function toggleDoorStyle(visible) {
233
+ var _el$parentElement3;
224
234
  this.setState({
225
235
  doorStyleOpen: visible
226
236
  });
227
- document.getElementById('select_doorstyle_inactive').parentElement.parentElement.style.zIndex = visible ? 999 : 6;
237
+ var el = document.getElementById('select_doorstyle_inactive');
238
+ if (el !== null && el !== void 0 && (_el$parentElement3 = el.parentElement) !== null && _el$parentElement3 !== void 0 && _el$parentElement3.parentElement) el.parentElement.parentElement.style.zIndex = visible ? 999 : 6;
228
239
  }
229
240
  }, {
230
241
  key: "replaceCabinet",
@@ -236,70 +247,83 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
236
247
  }, {
237
248
  key: "openAppliance",
238
249
  value: function openAppliance() {
250
+ var _el$parentElement4;
239
251
  this.setState({
240
252
  applianceOpened: true
241
253
  });
242
- document.getElementById('add_appliances_inactive').parentElement.parentElement.style.zIndex = 999;
254
+ var el = document.getElementById('add_appliances_inactive');
255
+ if (el !== null && el !== void 0 && (_el$parentElement4 = el.parentElement) !== null && _el$parentElement4 !== void 0 && _el$parentElement4.parentElement) el.parentElement.parentElement.style.zIndex = 999;
243
256
  }
244
257
  }, {
245
258
  key: "openFinishing",
246
259
  value: function openFinishing() {
260
+ var _el$parentElement5;
247
261
  this.setState({
248
262
  finishingOpened: true
249
263
  });
250
- document.getElementById('finishing_touches_inactive').parentElement.parentElement.style.zIndex = 999;
264
+ var el = document.getElementById('finishing_touches_inactive');
265
+ if (el !== null && el !== void 0 && (_el$parentElement5 = el.parentElement) !== null && _el$parentElement5 !== void 0 && _el$parentElement5.parentElement) el.parentElement.parentElement.style.zIndex = 999;
251
266
  }
252
267
  }, {
253
268
  key: "onReviewQuoteClicked",
254
269
  value: function onReviewQuoteClicked(visible) {
270
+ var _el$parentElement6;
255
271
  this.setState({
256
272
  reviewQuotePopupOpened: visible
257
273
  });
258
- document.getElementById('review_quote_inactive').parentElement.parentElement.style.zIndex = visible ? 999 : 6;
274
+ var el = document.getElementById('review_quote_inactive');
275
+ if (el !== null && el !== void 0 && (_el$parentElement6 = el.parentElement) !== null && _el$parentElement6 !== void 0 && _el$parentElement6.parentElement) el.parentElement.parentElement.style.zIndex = visible ? 999 : 6;
259
276
  }
260
277
  }, {
261
278
  key: "closeFloorTB",
262
279
  value: function closeFloorTB() {
280
+ var _el$parentElement7;
263
281
  this.setState({
264
282
  floorOpened: false
265
283
  });
266
- document.getElementById('make_floorplan_inactive') && (document.getElementById('make_floorplan_inactive').parentElement.parentElement.style.zIndex = 6);
284
+ var el = document.getElementById('make_floorplan_inactive');
285
+ if (el !== null && el !== void 0 && (_el$parentElement7 = el.parentElement) !== null && _el$parentElement7 !== void 0 && _el$parentElement7.parentElement) el.parentElement.parentElement.style.zIndex = 6;
267
286
  }
268
287
  }, {
269
288
  key: "closeCabinetTB",
270
289
  value: function closeCabinetTB() {
290
+ var _el$parentElement8;
271
291
  this.setState({
272
292
  cabinetOpened: false
273
293
  });
274
- document.getElementById('add_cabinets_inactive').parentElement.parentElement.style.zIndex = 6;
294
+ var el = document.getElementById('add_cabinets_inactive');
295
+ if (el !== null && el !== void 0 && (_el$parentElement8 = el.parentElement) !== null && _el$parentElement8 !== void 0 && _el$parentElement8.parentElement) el.parentElement.parentElement.style.zIndex = 6;
275
296
  }
276
297
  }, {
277
298
  key: "closeFinishingTB",
278
299
  value: function closeFinishingTB() {
300
+ var _el$parentElement9;
279
301
  this.setState({
280
302
  finishingOpened: false
281
303
  });
282
- document.getElementById('finishing_touches_inactive').parentElement.parentElement.style.zIndex = 6;
304
+ var el = document.getElementById('finishing_touches_inactive');
305
+ if (el !== null && el !== void 0 && (_el$parentElement9 = el.parentElement) !== null && _el$parentElement9 !== void 0 && _el$parentElement9.parentElement) el.parentElement.parentElement.style.zIndex = 6;
283
306
  }
284
307
  }, {
285
308
  key: "closeApplianceTB",
286
309
  value: function closeApplianceTB() {
310
+ var _el$parentElement0;
287
311
  this.setState({
288
312
  applianceOpened: false
289
313
  });
290
- document.getElementById('add_appliances_inactive').parentElement.parentElement.style.zIndex = 6;
291
- }
292
- }, {
293
- key: "closeDoorstyle",
294
- value: function closeDoorstyle() {
295
- this.setState({});
296
- document.getElementById('select_doorstyle_inactive').parentElement.parentElement.style.zIndex = 6;
314
+ var el = document.getElementById('add_appliances_inactive');
315
+ if (el !== null && el !== void 0 && (_el$parentElement0 = el.parentElement) !== null && _el$parentElement0 !== void 0 && _el$parentElement0.parentElement) el.parentElement.parentElement.style.zIndex = 6;
297
316
  }
298
317
  }, {
299
- key: "closeReviewQuote",
300
- value: function closeReviewQuote() {
301
- this.setState({});
302
- document.getElementById('review_quote_inactive').parentElement.parentElement.style.zIndex = 6;
318
+ key: "getChildContext",
319
+ value: function getChildContext() {
320
+ var _this2 = this;
321
+ return _objectSpread(_objectSpread({}, objectsMap(actions, function (actionNamespace) {
322
+ return _this2.props[actionNamespace];
323
+ })), {}, {
324
+ translator: this.props.translator,
325
+ catalog: this.props.catalog
326
+ });
303
327
  }
304
328
  }, {
305
329
  key: "componentDidMount",
@@ -309,30 +333,31 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
309
333
  var _this$props = this.props,
310
334
  stateExtractor = _this$props.stateExtractor,
311
335
  plugins = _this$props.plugins;
336
+
337
+ // keep old behavior: run plugins once on mount
312
338
  var newplugins = _toConsumableArray(plugins);
313
339
  newplugins.forEach(function (newplugin) {
314
340
  return newplugin(store, stateExtractor);
315
341
  });
316
342
  }
317
343
  }, {
318
- key: "componentWillReceiveProps",
319
- value: function componentWillReceiveProps(nextProps) {
320
- var stateExtractor = nextProps.stateExtractor,
321
- state = nextProps.state,
322
- projectActions = nextProps.projectActions,
323
- catalog = nextProps.catalog,
324
- externalEvent = nextProps.externalEvent,
325
- onInternalEvent = nextProps.onInternalEvent;
344
+ key: "componentDidUpdate",
345
+ value: function componentDidUpdate(prevProps) {
346
+ var _extractedState$getIn;
347
+ var _this$props2 = this.props,
348
+ externalEvent = _this$props2.externalEvent,
349
+ extractedState = _this$props2.extractedState,
350
+ projectActions = _this$props2.projectActions,
351
+ catalog = _this$props2.catalog;
326
352
 
327
- // handle external events
328
- if (this.props.externalEvent !== externalEvent) {
329
- handleExternalEvent(nextProps);
330
- }
331
- var plannerState = stateExtractor(state);
332
- var catalogReady = plannerState.getIn(['catalog', 'ready']);
333
- if (!catalogReady) {
334
- projectActions.initCatalog(catalog);
353
+ // same behavior: handle external event when it changes
354
+ if (prevProps.externalEvent !== externalEvent) {
355
+ handleExternalEvent(this.props);
335
356
  }
357
+
358
+ // same behavior: init catalog until ready
359
+ 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
+ if (!catalogReady) projectActions.initCatalog(catalog);
336
361
  }
337
362
  }, {
338
363
  key: "isProjectEmpty",
@@ -342,24 +367,51 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
342
367
  var layer = layers.get(selectedLayer);
343
368
  return layer.areas.size + layer.lines.size + layer.holes.size + layer.items.size === 0;
344
369
  }
370
+ }, {
371
+ key: "getExtractedStateWithViewer2DInit",
372
+ value: function getExtractedStateWithViewer2DInit(extractedState, width, height) {
373
+ if (!extractedState) return extractedState;
374
+
375
+ // ✅ If the extractedState reference changed, drop cache immediately.
376
+ if (this._lastExtractedStateRef !== extractedState) {
377
+ this._lastExtractedStateRef = extractedState;
378
+ this._cachedViewer2DKey = null;
379
+ this._cachedExtractedState = null;
380
+ }
381
+ var _viewer2D = extractedState.getIn(['viewer2D']);
382
+ if (!_viewer2D || _viewer2D.size <= 0) return extractedState;
383
+ var v = _viewer2D.toJS();
384
+
385
+ // Only do the "center viewer2D if e/f are zero" logic.
386
+ // ✅ No need to build keys from unrelated parts of state.
387
+ if (v.e !== 0 || v.f !== 0) return extractedState;
388
+
389
+ // Build a cache key ONLY for this viewer2D-centering computation.
390
+ var cacheKey = "".concat(width, ":").concat(height, ":").concat(v.viewerWidth, ":").concat(v.viewerHeight, ":").concat(v.SVGWidth, ":").concat(v.SVGHeight);
391
+ if (this._cachedViewer2DKey === cacheKey && this._cachedExtractedState) {
392
+ return this._cachedExtractedState;
393
+ }
394
+ var centeredViewer2D = _viewer2D.merge({
395
+ e: v.viewerWidth / 2 - v.SVGWidth / 2,
396
+ f: v.viewerHeight / 2 - v.SVGHeight / 2,
397
+ a: 0.99,
398
+ d: 0.99
399
+ });
400
+ var merged = extractedState.merge({
401
+ viewer2D: centeredViewer2D
402
+ });
403
+ this._cachedViewer2DKey = cacheKey;
404
+ this._cachedExtractedState = merged;
405
+ return merged;
406
+ }
345
407
  }, {
346
408
  key: "render",
347
409
  value: function render() {
348
- var _this2 = this;
349
- var actionsFromProps = objectsMap(actions, function (ns) {
350
- return _this2.props[ns];
351
- });
352
- var appCtxValue = _objectSpread(_objectSpread({}, actionsFromProps), {}, {
353
- translator: this.props.translator,
354
- // instance (defaultProps already gives one)
355
- catalog: this.props.catalog
356
- });
357
- var _this$props2 = this.props,
358
- width = _this$props2.width,
359
- height = _this$props2.height,
360
- state = _this$props2.state,
361
- stateExtractor = _this$props2.stateExtractor,
362
- props = _objectWithoutProperties(_this$props2, _excluded);
410
+ var _this$props3 = this.props,
411
+ width = _this$props3.width,
412
+ height = _this$props3.height,
413
+ extractedState = _this$props3.extractedState,
414
+ props = _objectWithoutProperties(_this$props3, _excluded);
363
415
  var _this$state = this.state,
364
416
  savePopupVisible = _this$state.savePopupVisible,
365
417
  quotePopupVisible = _this$state.quotePopupVisible,
@@ -367,53 +419,22 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
367
419
  signOpen = _this$state.signOpen,
368
420
  myProjectsOpen = _this$state.myProjectsOpen;
369
421
  var contentW = width - toolbarW;
370
- // let contentW = width - toolbarW - sidebarW;
371
- // let toolbarH = height - footerBarH;
372
- // let contentH = height - footerBarH;
373
- // let sidebarH = height - footerBarH;
374
- var toolbarH = height;
375
422
  var contentH = height;
376
- var sidebarH = height;
377
- var headerW = width;
378
- var headerH = 60;
379
- var extractedState = stateExtractor(state);
380
- var firstVisit = this.state.wizardStepOpend && this.isProjectEmpty(extractedState.scene);
423
+ var extracted = this.getExtractedStateWithViewer2DInit(extractedState, width, height);
424
+ var firstVisit = this.state.wizardStepOpend && this.isProjectEmpty(extracted.scene);
381
425
  var allVisible = firstVisit || signOpen || myProjectsOpen;
382
- var _scene = extractedState.getIn(['scene']);
383
- var len = convert(_scene.width).from(_scene.unit).to('cm');
384
- var _viewer2D = extractedState.getIn(['viewer2D']);
385
- if (_viewer2D.size > 0) {
386
- var scaleX = width / len * 3;
387
- var scaleY = height / len * 3;
388
- var scale = scaleX > scaleY ? scaleY : scaleX;
389
- var _e = width - len * scale,
390
- _f = height - len * scale;
391
- var viewer = _viewer2D.toJS();
392
- if (viewer.e === 0 && viewer.f === 0) {
393
- _viewer2D = _viewer2D.merge({
394
- e: viewer.viewerWidth / 2 - viewer.SVGWidth / 2,
395
- f: viewer.viewerHeight / 2 - viewer.SVGHeight / 2,
396
- a: 0.99,
397
- d: 0.99
398
- });
399
- }
400
- }
401
- extractedState = extractedState.merge({
402
- viewer2D: _viewer2D
403
- });
404
- return /*#__PURE__*/React.createElement(AppContext.Provider, {
405
- value: appCtxValue
406
- }, /*#__PURE__*/React.createElement("section", null, /*#__PURE__*/React.createElement("div", {
426
+ return /*#__PURE__*/React.createElement("section", null, /*#__PURE__*/React.createElement("div", {
407
427
  style: _objectSpread(_objectSpread({}, wrapperStyle), {}, {
408
428
  height: height,
409
429
  display: 'flex',
410
- justifyContent: 'center'
430
+ justifyContent: 'center',
431
+ position: 'relative'
411
432
  })
412
433
  }, /*#__PURE__*/React.createElement(Content, _extends({
413
434
  width: contentW,
414
435
  height: contentH,
415
436
  catalog: this.props.catalog,
416
- state: extractedState,
437
+ state: extracted,
417
438
  toolBar: this.state.toolbar,
418
439
  setToolbar: this.setToolbar,
419
440
  replaceCabinet: this.replaceCabinet,
@@ -423,7 +444,20 @@ var LiteKitchenConfigurator = /*#__PURE__*/function (_Component) {
423
444
  return event.preventDefault();
424
445
  },
425
446
  onInternalEvent: this.props.onInternalEvent
426
- })))));
447
+ })), /*#__PURE__*/React.createElement(WarningItem, {
448
+ id: "warning_box_2d",
449
+ style: {
450
+ display: 'none'
451
+ }
452
+ }, /*#__PURE__*/React.createElement(SubCategoryItemImage, {
453
+ maskImage: "/assets/img/svg/3d_item_warning_info.svg",
454
+ style: {
455
+ backgroundColor: constants.BG_COLOR_1,
456
+ marginRight: 10,
457
+ height: 30,
458
+ width: 30
459
+ }
460
+ }), "This item is not available in the current door style. Replace it with another one.")));
427
461
  }
428
462
  }]);
429
463
  }(Component);
@@ -437,13 +471,21 @@ LiteKitchenConfigurator.propTypes = {
437
471
  width: PropTypes.number.isRequired,
438
472
  height: PropTypes.number.isRequired,
439
473
  stateExtractor: PropTypes.func.isRequired,
440
- sidebarComponents: PropTypes.array,
441
- footerbarComponents: PropTypes.array,
442
- customContents: PropTypes.object,
443
- softwareSignature: PropTypes.string,
444
474
  configData: PropTypes.object,
445
- onInternalEvent: PropTypes.func
475
+ onInternalEvent: PropTypes.func,
476
+ extractedState: PropTypes.object,
477
+ // ✅ injected by connect
478
+ externalEvent: PropTypes.object
446
479
  };
480
+ LiteKitchenConfigurator.contextTypes = {
481
+ store: PropTypes.object.isRequired
482
+ };
483
+ LiteKitchenConfigurator.childContextTypes = _objectSpread(_objectSpread({}, objectsMap(actions, function () {
484
+ return PropTypes.object;
485
+ })), {}, {
486
+ translator: PropTypes.object,
487
+ catalog: PropTypes.object
488
+ });
447
489
  LiteKitchenConfigurator.defaultProps = {
448
490
  translator: new Translator(),
449
491
  catalog: new Catalog(),
@@ -456,10 +498,16 @@ LiteKitchenConfigurator.defaultProps = {
456
498
  configData: {}
457
499
  };
458
500
 
459
- //redux connect
460
- function mapStateToProps(reduxState) {
501
+ // ✅ Only select the slice you actually use.
502
+ // This preserves behavior but massively reduces rerenders.
503
+ function mapStateToProps(reduxState, ownProps) {
504
+ var stateExtractor = ownProps.stateExtractor || function (s) {
505
+ return s;
506
+ };
507
+ var extractedState = stateExtractor(reduxState);
461
508
  return {
462
- state: reduxState
509
+ extractedState: extractedState,
510
+ state: extractedState
463
511
  };
464
512
  }
465
513
  function mapDispatchToProps(dispatch) {