kitchen-simulator 10.3.0 → 11.0.0-react-18

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 (41) hide show
  1. package/es/LiteKitchenConfigurator.js +11 -42
  2. package/es/LiteRenderer.js +24 -2
  3. package/es/actions/export.js +12 -25
  4. package/es/components/content.js +0 -3
  5. package/es/components/export.js +4 -6
  6. package/es/components/style/form-number-input.js +5 -7
  7. package/es/components/viewer2d/group.js +5 -6
  8. package/es/components/viewer2d/item.js +5 -6
  9. package/es/components/viewer2d/line.js +47 -18
  10. package/es/components/viewer2d/rulerX.js +8 -9
  11. package/es/components/viewer2d/rulerY.js +8 -9
  12. package/es/components/viewer2d/scene.js +9 -9
  13. package/es/components/viewer2d/state.js +1 -1
  14. package/es/components/viewer2d/viewer2d.js +28 -32
  15. package/es/components/viewer3d/viewer3d-first-person.js +8 -13
  16. package/es/components/viewer3d/viewer3d.js +8 -15
  17. package/es/utils/helper.js +0 -68
  18. package/lib/LiteKitchenConfigurator.js +11 -42
  19. package/lib/LiteRenderer.js +25 -3
  20. package/lib/actions/export.js +39 -35
  21. package/lib/components/content.js +0 -3
  22. package/lib/components/export.js +16 -6
  23. package/lib/components/style/form-number-input.js +5 -7
  24. package/lib/components/viewer2d/group.js +5 -6
  25. package/lib/components/viewer2d/item.js +4 -5
  26. package/lib/components/viewer2d/line.js +47 -18
  27. package/lib/components/viewer2d/rulerX.js +8 -9
  28. package/lib/components/viewer2d/rulerY.js +8 -9
  29. package/lib/components/viewer2d/scene.js +9 -9
  30. package/lib/components/viewer2d/state.js +1 -1
  31. package/lib/components/viewer2d/viewer2d.js +26 -30
  32. package/lib/components/viewer3d/viewer3d-first-person.js +8 -13
  33. package/lib/components/viewer3d/viewer3d.js +8 -15
  34. package/lib/utils/helper.js +1 -69
  35. package/package.json +6 -21
  36. package/es/analytics/ga4.js +0 -188
  37. package/es/components/style/form-submit-button.js +0 -25
  38. package/es/devLiteRenderer.js +0 -926
  39. package/lib/analytics/ga4.js +0 -194
  40. package/lib/components/style/form-submit-button.js +0 -35
  41. package/lib/devLiteRenderer.js +0 -930
@@ -11,9 +11,10 @@ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
11
11
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
12
12
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
13
13
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
15
  var _react = _interopRequireDefault(require("react"));
15
16
  var _propTypes = _interopRequireDefault(require("prop-types"));
16
- var _reactDom = _interopRequireDefault(require("react-dom"));
17
+ var _AppContext = _interopRequireDefault(require("../../AppContext"));
17
18
  var Three = _interopRequireWildcard(require("three"));
18
19
  var _sceneCreator = require("./scene-creator");
19
20
  var _threeMemoryCleaner = require("./three-memory-cleaner");
@@ -32,6 +33,7 @@ var Viewer3DFirstPerson = exports["default"] = /*#__PURE__*/function (_React$Com
32
33
  _this.width = props.width;
33
34
  _this.height = props.height;
34
35
  _this.stopRendering = false;
36
+ _this.canvasWrapperRef = /*#__PURE__*/_react["default"].createRef();
35
37
  _this.renderer = window.__threeRenderer || new Three.WebGLRenderer({
36
38
  preserveDrawingBuffer: true
37
39
  });
@@ -62,7 +64,7 @@ var Viewer3DFirstPerson = exports["default"] = /*#__PURE__*/function (_React$Com
62
64
  };
63
65
  var state = this.props.state;
64
66
  var data = state.scene;
65
- var canvasWrapper = _reactDom["default"].findDOMNode(this.refs.canvasWrapper);
67
+ var canvasWrapper = this.canvasWrapperRef.current;
66
68
  var scene3D = new Three.Scene();
67
69
 
68
70
  // As I need to show the pointer above all scene objects, I use this workaround http://stackoverflow.com/a/13309722
@@ -261,8 +263,8 @@ var Viewer3DFirstPerson = exports["default"] = /*#__PURE__*/function (_React$Com
261
263
  this.renderer.renderLists.dispose();
262
264
  }
263
265
  }, {
264
- key: "componentWillReceiveProps",
265
- value: function componentWillReceiveProps(nextProps) {
266
+ key: "UNSAFE_componentWillReceiveProps",
267
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
266
268
  var width = nextProps.width,
267
269
  height = nextProps.height;
268
270
  var camera = this.camera,
@@ -295,22 +297,15 @@ var Viewer3DFirstPerson = exports["default"] = /*#__PURE__*/function (_React$Com
295
297
  key: "render",
296
298
  value: function render() {
297
299
  return /*#__PURE__*/_react["default"].createElement('div', {
298
- ref: 'canvasWrapper'
300
+ ref: this.canvasWrapperRef
299
301
  });
300
302
  }
301
303
  }]);
302
304
  }(_react["default"].Component);
305
+ (0, _defineProperty2["default"])(Viewer3DFirstPerson, "contextType", _AppContext["default"]);
303
306
  Viewer3DFirstPerson.propTypes = {
304
307
  state: _propTypes["default"].object.isRequired,
305
308
  width: _propTypes["default"].number.isRequired,
306
309
  height: _propTypes["default"].number.isRequired
307
310
  };
308
- Viewer3DFirstPerson.contextTypes = {
309
- areaActions: _propTypes["default"].object.isRequired,
310
- holesActions: _propTypes["default"].object.isRequired,
311
- itemsActions: _propTypes["default"].object.isRequired,
312
- linesActions: _propTypes["default"].object.isRequired,
313
- projectActions: _propTypes["default"].object.isRequired,
314
- catalog: _propTypes["default"].object
315
- };
316
311
  module.exports = exports.default;
@@ -7,15 +7,15 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports["default"] = void 0;
9
9
  var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/readOnlyError"));
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
12
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
14
13
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
15
14
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
16
  var _react = _interopRequireDefault(require("react"));
17
17
  var _propTypes = _interopRequireDefault(require("prop-types"));
18
- var _reactDom = _interopRequireDefault(require("react-dom"));
18
+ var _AppContext = _interopRequireDefault(require("../../AppContext"));
19
19
  var Three = _interopRequireWildcard(require("three"));
20
20
  var _sceneCreator = require("./scene-creator");
21
21
  var _threeMemoryCleaner = require("./three-memory-cleaner");
@@ -57,6 +57,7 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
57
57
  _this.width = props.width;
58
58
  _this.height = props.height;
59
59
  _this.renderingID = 0;
60
+ _this.canvasWrapperRef = /*#__PURE__*/_react["default"].createRef();
60
61
  var mode = props.state.mode;
61
62
  if (!window.__elevationRendererDownload) {
62
63
  window.__elevationRendererDownload = {};
@@ -2172,7 +2173,7 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
2172
2173
  }
2173
2174
 
2174
2175
  // Add the output of the renderer to the html element
2175
- var canvasWrapper = _reactDom["default"].findDOMNode(this.refs.canvasWrapper);
2176
+ var canvasWrapper = this.canvasWrapperRef.current;
2176
2177
  canvasWrapper && canvasWrapper.appendChild(this.renderer.domElement);
2177
2178
 
2178
2179
  //
@@ -2441,8 +2442,8 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
2441
2442
  this.renderer.renderLists.dispose();
2442
2443
  }
2443
2444
  }, {
2444
- key: "componentWillReceiveProps",
2445
- value: function componentWillReceiveProps(nextProps) {
2445
+ key: "UNSAFE_componentWillReceiveProps",
2446
+ value: function UNSAFE_componentWillReceiveProps(nextProps) {
2446
2447
  var _this4 = this;
2447
2448
  if (this.props.downloadFlag && (0, _immutablediff["default"])(this.props.state, nextProps.state).toJS().length == 0 || (0, _helper.isEmpty)(nextProps.state.scene)) return;
2448
2449
  var width = nextProps.width,
@@ -2652,25 +2653,17 @@ var Scene3DViewer = exports["default"] = /*#__PURE__*/function (_React$Component
2652
2653
  this.renderer.domElement.style.opacity = '1';
2653
2654
  !this.props.downloadFlag && document.getElementById('front') && (document.getElementById('front').style.display = 'block');
2654
2655
  return /*#__PURE__*/_react["default"].createElement('div', {
2655
- ref: 'canvasWrapper'
2656
+ ref: this.canvasWrapperRef
2656
2657
  });
2657
2658
  }
2658
2659
  }
2659
2660
  }]);
2660
2661
  }(_react["default"].Component);
2662
+ (0, _defineProperty2["default"])(Scene3DViewer, "contextType", _AppContext["default"]);
2661
2663
  Scene3DViewer.propTypes = {
2662
2664
  state: _propTypes["default"].object.isRequired,
2663
2665
  width: _propTypes["default"].number.isRequired,
2664
2666
  height: _propTypes["default"].number.isRequired,
2665
2667
  replaceCabinet: _propTypes["default"].func.isRequired
2666
2668
  };
2667
- Scene3DViewer.contextTypes = {
2668
- areaActions: _propTypes["default"].object.isRequired,
2669
- holesActions: _propTypes["default"].object.isRequired,
2670
- itemsActions: _propTypes["default"].object.isRequired,
2671
- linesActions: _propTypes["default"].object.isRequired,
2672
- sceneActions: _propTypes["default"].object.isRequired,
2673
- projectActions: _propTypes["default"].object.isRequired,
2674
- catalog: _propTypes["default"].object
2675
- };
2676
2669
  module.exports = exports.default;
@@ -11,7 +11,7 @@ exports.base64Decode = void 0;
11
11
  exports.centering2D = centering2D;
12
12
  exports.compareSVGRect = void 0;
13
13
  exports.debugUtil = debugUtil;
14
- exports.getSignedUrl = exports.getPathInfo = exports.getPath = void 0;
14
+ exports.getPathInfo = exports.getPath = void 0;
15
15
  exports.getSkuAliasFromCatalog = getSkuAliasFromCatalog;
16
16
  exports.getSkuAliasFromCatalogElement = getSkuAliasFromCatalogElement;
17
17
  exports.handleCamRect = handleCamRect;
@@ -35,83 +35,15 @@ var Three = _interopRequireWildcard(require("three"));
35
35
  var _utils = require("./../components/viewer2d/utils");
36
36
  var _convertUnitsLite = require("./convert-units-lite");
37
37
  var _math = require("./math");
38
- var _awsSdk = _interopRequireDefault(require("aws-sdk"));
39
38
  var _export = require("./export");
40
39
  var _geometry = require("./geometry");
41
40
  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" != _typeof3(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); }
42
41
  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; }
43
42
  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; }
44
- var s3 = new _awsSdk["default"].S3({
45
- accessKeyId: process.env.REACT_APP_AWS_ID,
46
- secretAccessKey: process.env.REACT_APP_AWS_SECRET
47
- });
48
- var s3ParseUrl = function s3ParseUrl(url) {
49
- var _decodedUrl = decodeURIComponent(url);
50
- var _result = null;
51
-
52
- // http://s3.amazonaws.com/bucket/key1/key2
53
- var match = decodedUrl.match(/^https?:\/\/s3.amazonaws.com\/([^\/]+)\/?(.*?)$/);
54
- if (_match) {
55
- _result = {
56
- bucket: _match[1],
57
- key: _match[2],
58
- region: ''
59
- };
60
- }
61
-
62
- // http://s3-aws-region.amazonaws.com/bucket/key1/key2
63
- match = decodedUrl.match(/^https?:\/\/s3-([^.]+).amazonaws.com\/([^\/]+)\/?(.*?)$/);
64
- if (_match) {
65
- _result = {
66
- bucket: _match[2],
67
- key: _match[3],
68
- region: _match[1]
69
- };
70
- }
71
-
72
- // http://bucket.s3.amazonaws.com/key1/key2
73
- match = decodedUrl.match(/^https?:\/\/([^.]+).s3.amazonaws.com\/?(.*?)$/);
74
- if (_match) {
75
- _result = {
76
- bucket: _match[1],
77
- key: _match[2],
78
- region: ''
79
- };
80
- }
81
-
82
- // http://bucket.s3-aws-region.amazonaws.com/key1/key2 or,
83
- // http://bucket.s3.aws-region.amazonaws.com/key1/key2
84
- match = decodedUrl.match(/^https?:\/\/([^.]+).(?:s3-|s3\.)([^.]+).amazonaws.com\/?(.*?)$/);
85
- if (_match) {
86
- _result = {
87
- bucket: _match[1],
88
- key: _match[3],
89
- region: _match[2]
90
- };
91
- }
92
- return _result;
93
- };
94
43
  var textureCube = exports.textureCube = new _HDRCubeTextureLoader.HDRCubeTextureLoader().setPath('/catalog/envMap/').load(_constants.HDR_URLS, function () {
95
44
  textureCube.magFilter = Three.LinearFilter;
96
45
  textureCube.needsUpdate = true;
97
46
  });
98
- var getSignedUrl = exports.getSignedUrl = function getSignedUrl(url) {
99
- if (!url) return url;
100
- var signedUrl = url;
101
- try {
102
- var _s3ParseUrl = s3ParseUrl(url),
103
- bucket = _s3ParseUrl.bucket,
104
- key = _s3ParseUrl.key;
105
- signedUrl = s3.getSignedUrl('getObject', {
106
- Bucket: bucket,
107
- Key: key,
108
- ResponseCacheControl: 'no-cache'
109
- });
110
- } catch (e) {
111
- signedUrl = url;
112
- }
113
- return signedUrl;
114
- };
115
47
  var base64Decode = exports.base64Decode = function base64Decode(targetStr) {
116
48
  if (!targetStr) return null;
117
49
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kitchen-simulator",
3
- "version": "10.3.0",
3
+ "version": "11.0.0-react-18",
4
4
  "description": "It is a kitchen simulator (self-contained micro-frontend).",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
@@ -61,7 +61,6 @@
61
61
  "dependencies": {
62
62
  "@babel/runtime": "^7.28.4",
63
63
  "@sentry/react": "^9.10.1",
64
- "aws-sdk": "^2.984.0",
65
64
  "axios": "^0.20.0",
66
65
  "camera-controls": "^2.8.5",
67
66
  "clsx": "^2.1.1",
@@ -76,36 +75,26 @@
76
75
  "polylabel": "1.0.2",
77
76
  "posthog-js": "^1.271.0",
78
77
  "prop-types": "^15.8.1",
79
- "react": "^16.9.0",
80
- "react-container-dimensions": "1.4.1",
81
- "react-dom": "16.9.0",
82
- "react-hotjar": "^1.0.11",
83
- "react-icons": "3.5.0",
84
- "react-redux": "5.0.7",
85
- "react-svg-pan-zoom": "2.18.0",
86
- "redux": "4.0.1",
78
+ "react": "^18.2.0",
79
+ "react-dom": "^18.2.0",
80
+ "react-redux": "^8.1.0",
81
+ "react-svg-pan-zoom": "^3.12.1",
82
+ "redux": "^4.2.1",
87
83
  "three": "0.166.0",
88
84
  "moment": "^2.30.1",
89
85
  "jwt-decode": "^2.2.0",
90
- "react-ga4": "^1.4.1",
91
86
  "styled-components": "^5.2.0"
92
87
  },
93
88
  "devDependencies": {
94
89
  "localstorage-slim": "^1.3.0",
95
- "react-tabs": "3.0.0",
96
90
  "sass": "^1.29.0",
97
- "reactjs-popup": "^2.0.4",
98
91
  "sass-loader": "^10.0.5",
99
- "antd": "^4.24.16",
100
92
  "@babel/cli": "^7.28.3",
101
93
  "@babel/core": "^7.28.4",
102
94
  "@babel/plugin-transform-modules-commonjs": "^7.27.1",
103
95
  "@babel/plugin-transform-runtime": "^7.28.3",
104
96
  "@babel/preset-env": "^7.28.3",
105
97
  "@babel/preset-react": "^7.27.1",
106
- "@material-ui/core": "^4.12.3",
107
- "@material-ui/icons": "^4.11.2",
108
- "@material-ui/lab": "^4.0.0-alpha.61",
109
98
  "@sentry/webpack-plugin": "^3.2.4",
110
99
  "assert": "^2.1.0",
111
100
  "babel-loader": "^9.1.3",
@@ -121,11 +110,7 @@
121
110
  "css-loader": "*",
122
111
  "file-loader": "6.2.0",
123
112
  "html-webpack-plugin": "5.6.0",
124
- "immutable-devtools": "0.1.4",
125
- "mobile-detect": "^1.4.5",
126
113
  "path-browserify": "^1.0.1",
127
- "react-query": "^3.39.3",
128
- "react-router-dom": "5.1.2",
129
114
  "rimraf": "^2.6.3",
130
115
  "stream-browserify": "^3.0.0",
131
116
  "style-loader": "*",
@@ -1,188 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- 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; }
3
- 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; }
4
- import ReactGA from 'react-ga4';
5
-
6
- // ---------- Helpers ----------
7
- function nowMs() {
8
- return Date.now();
9
- }
10
- function getClientName() {
11
- return sessionStorage.getItem('visualizerName');
12
- }
13
- function isDesktopUA() {
14
- // Lightweight heuristic; GA4 also provides device.category. This flag can help ad-hoc filtering.
15
- var ua = navigator.userAgent.toLowerCase();
16
- var isMobile = /mobi|android|iphone|ipad|ipod|windows phone/.test(ua);
17
- return !isMobile;
18
- }
19
-
20
- // ---------- Keys for storage ----------
21
- var SSN_KEYS = {
22
- sessionStartMs: 'ga4_session_start_ms',
23
- introChoiceMs: 'ga4_intro_choice_ms',
24
- firstCabinetPlaced: 'ga4_first_cabinet_placed',
25
- contextBooted: 'ga4_context_booted',
26
- enteredCanvasSent: 'ga4_entered_canvas_sent'
27
- };
28
-
29
- // ---------- Core GA wrapper ----------
30
- export var GA = {
31
- init: function init(_ref) {
32
- var measurementId = _ref.measurementId;
33
- ReactGA.initialize([{
34
- trackingId: measurementId
35
- }], {
36
- testMode: false
37
- });
38
- },
39
- resetSessionKeys: function resetSessionKeys() {
40
- Object.values(SSN_KEYS).forEach(function (key) {
41
- sessionStorage.removeItem(key);
42
- });
43
- },
44
- /**
45
- * Must be called ONCE per page load, *before* other events.
46
- * Sets user properties (project_entry, cross_auth) and sends an initial page_view with client_name.
47
- */
48
- bootSessionContext: function bootSessionContext(_ref2) {
49
- var projectEntry = _ref2.projectEntry,
50
- crossAuth = _ref2.crossAuth;
51
- try {
52
- var resolvedClient = getClientName();
53
-
54
- // Persist session start for timing metrics (if not already set for this tab)
55
- if (!sessionStorage.getItem(SSN_KEYS.sessionStartMs)) {
56
- sessionStorage.setItem(SSN_KEYS.sessionStartMs, String(nowMs()));
57
- }
58
-
59
- // Mark context as booted to avoid duplicate property sets on hot reloads
60
- if (!sessionStorage.getItem(SSN_KEYS.contextBooted)) {
61
- sessionStorage.setItem(SSN_KEYS.contextBooted, '1');
62
-
63
- // Set GA4 user_properties (user-scoped dimensions)
64
- ReactGA.gtag('set', 'user_properties', {
65
- project_entry: projectEntry,
66
- // user scope dimension
67
- cross_auth: crossAuth // user scope dimension (boolean serialized)
68
- });
69
- }
70
-
71
- // Send first page_view hit enriched with event-scoped client_name
72
- ReactGA.send({
73
- hitType: 'pageview',
74
- page: window.location.pathname + window.location.search,
75
- // @ts-expect-error react-ga4 passes along additional params into gtag
76
- client_name: resolvedClient
77
- });
78
- } catch (e) {
79
- // eslint-disable-next-line no-console
80
- console.warn('GA.bootSessionContext error', e);
81
- }
82
- },
83
- // Utility to derive cross_auth from URL (token or details query params)
84
- deriveCrossAuthFromUrl: function deriveCrossAuthFromUrl(search) {
85
- var sp = new URLSearchParams(search);
86
- return sp.has('token') || sp.has('details');
87
- },
88
- // Utility to derive project entry (best-effort). You can also pass explicitly from router logic.
89
- deriveProjectEntry: function deriveProjectEntry() {
90
- var projectId = sessionStorage.getItem('projectId');
91
-
92
- // If a project id exists, consider it "open_existing"; otherwise fallback to "new"
93
- if (projectId) return 'open_existing';
94
- return 'new';
95
- },
96
- // ---------- Event API ----------
97
- events: {
98
- /**
99
- * intro_choice(option) — records the user's entry choice.
100
- * Also stores a timestamp for later time_to_canvas calculation.
101
- */
102
- introChoice: function introChoice(option, extra) {
103
- var client_name = getClientName();
104
- sessionStorage.setItem(SSN_KEYS.introChoiceMs, String(nowMs()));
105
- ReactGA.event('intro_choice', _objectSpread({
106
- client_name: client_name,
107
- option: option
108
- }, extra || {}));
109
- },
110
- /**
111
- * entered_canvas(time_to_canvas) — compute (now - intro_choice)
112
- */
113
- enteredCanvas: function enteredCanvas() {
114
- // fire only once per tab/session
115
- if (sessionStorage.getItem(SSN_KEYS.enteredCanvasSent)) return;
116
- var client_name = getClientName();
117
- var introMs = Number(sessionStorage.getItem(SSN_KEYS.introChoiceMs) || 0);
118
- var timeSec = introMs ? Math.max(0, Math.round((Date.now() - introMs) / 1000)) : undefined;
119
- ReactGA.event('entered_canvas', _objectSpread({
120
- client_name: client_name
121
- }, typeof timeSec === 'number' ? {
122
- time_to_canvas: timeSec
123
- } : {}));
124
- sessionStorage.setItem(SSN_KEYS.enteredCanvasSent, '1'); // 👈 lock it
125
- },
126
- /**
127
- * cabinet_placed(time_to_first_cabinet) — send only for the *first* cabinet of the session.
128
- */
129
- cabinetPlaced: function cabinetPlaced() {
130
- var already = sessionStorage.getItem(SSN_KEYS.firstCabinetPlaced);
131
- var client_name = getClientName();
132
- var params = {
133
- client_name: client_name
134
- };
135
- if (!already) {
136
- var startMs = Number(sessionStorage.getItem(SSN_KEYS.sessionStartMs) || 0);
137
- var timeSec = startMs ? Math.max(0, Math.round((nowMs() - startMs) / 1000)) : undefined;
138
- if (typeof timeSec === 'number') params.time_to_first_cabinet = timeSec; // custom metric (seconds)
139
- sessionStorage.setItem(SSN_KEYS.firstCabinetPlaced, '1');
140
- }
141
- ReactGA.event('cabinet_placed', params);
142
- },
143
- /**
144
- * door_changed(door_id)
145
- */
146
- doorChanged: function doorChanged(door_id) {
147
- var client_name = getClientName();
148
- ReactGA.event('door_changed', {
149
- client_name: client_name,
150
- door_id: door_id
151
- });
152
- },
153
- /**
154
- * project_saved(project_id, save_method) — mark as conversion in GA UI.
155
- */
156
- projectSaved: function projectSaved(project_id, save_method) {
157
- var client_name = getClientName();
158
- ReactGA.event('project_saved', {
159
- client_name: client_name,
160
- project_id: project_id,
161
- save_method: save_method
162
- });
163
- },
164
- /**
165
- * assistance_requested(method, project_id) — mark as conversion in GA UI.
166
- */
167
- assistanceRequested: function assistanceRequested(method, project_id) {
168
- var client_name = getClientName();
169
- ReactGA.event('assistance_requested', {
170
- client_name: client_name,
171
- method: method,
172
- project_id: project_id
173
- });
174
- },
175
- /**
176
- * add_to_cart(project_id, sku_count, price_total) — mark as conversion in GA UI.
177
- */
178
- addToCart: function addToCart(project_id, sku_count, price_total) {
179
- var client_name = getClientName();
180
- ReactGA.event('add_to_cart', {
181
- client_name: client_name,
182
- project_id: project_id,
183
- sku_count: sku_count,
184
- price_total: price_total
185
- });
186
- }
187
- }
188
- };
@@ -1,25 +0,0 @@
1
- import _extends from "@babel/runtime/helpers/esm/extends";
2
- import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
- var _excluded = ["children"];
4
- import React from 'react';
5
- import Button from "./button";
6
- import * as SharedStyle from "../../shared-style";
7
- var STYLE = {
8
- borderColor: '#415375',
9
- backgroundColor: '#415375',
10
- color: SharedStyle.COLORS.white
11
- };
12
- var STYLE_HOVER = {
13
- borderColor: '#1f3149',
14
- backgroundColor: '#1f3149',
15
- color: SharedStyle.COLORS.white
16
- };
17
- export default function FormSubmitButton(_ref) {
18
- var children = _ref.children,
19
- rest = _objectWithoutProperties(_ref, _excluded);
20
- return /*#__PURE__*/React.createElement(Button, _extends({
21
- type: "submit",
22
- style: STYLE,
23
- styleHover: STYLE_HOVER
24
- }, rest), children);
25
- }