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.
- package/es/LiteKitchenConfigurator.js +11 -42
- package/es/LiteRenderer.js +24 -2
- package/es/actions/export.js +12 -25
- package/es/components/content.js +0 -3
- package/es/components/export.js +4 -6
- package/es/components/style/form-number-input.js +5 -7
- package/es/components/viewer2d/group.js +5 -6
- package/es/components/viewer2d/item.js +5 -6
- package/es/components/viewer2d/line.js +47 -18
- package/es/components/viewer2d/rulerX.js +8 -9
- package/es/components/viewer2d/rulerY.js +8 -9
- package/es/components/viewer2d/scene.js +9 -9
- package/es/components/viewer2d/state.js +1 -1
- package/es/components/viewer2d/viewer2d.js +28 -32
- package/es/components/viewer3d/viewer3d-first-person.js +8 -13
- package/es/components/viewer3d/viewer3d.js +8 -15
- package/es/utils/helper.js +0 -68
- package/lib/LiteKitchenConfigurator.js +11 -42
- package/lib/LiteRenderer.js +25 -3
- package/lib/actions/export.js +39 -35
- package/lib/components/content.js +0 -3
- package/lib/components/export.js +16 -6
- package/lib/components/style/form-number-input.js +5 -7
- package/lib/components/viewer2d/group.js +5 -6
- package/lib/components/viewer2d/item.js +4 -5
- package/lib/components/viewer2d/line.js +47 -18
- package/lib/components/viewer2d/rulerX.js +8 -9
- package/lib/components/viewer2d/rulerY.js +8 -9
- package/lib/components/viewer2d/scene.js +9 -9
- package/lib/components/viewer2d/state.js +1 -1
- package/lib/components/viewer2d/viewer2d.js +26 -30
- package/lib/components/viewer3d/viewer3d-first-person.js +8 -13
- package/lib/components/viewer3d/viewer3d.js +8 -15
- package/lib/utils/helper.js +1 -69
- package/package.json +6 -21
- package/es/analytics/ga4.js +0 -188
- package/es/components/style/form-submit-button.js +0 -25
- package/es/devLiteRenderer.js +0 -926
- package/lib/analytics/ga4.js +0 -194
- package/lib/components/style/form-submit-button.js +0 -35
- 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
|
|
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 =
|
|
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: "
|
|
265
|
-
value: function
|
|
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:
|
|
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
|
|
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 =
|
|
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: "
|
|
2445
|
-
value: function
|
|
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:
|
|
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;
|
package/lib/utils/helper.js
CHANGED
|
@@ -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.
|
|
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": "
|
|
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": "^
|
|
80
|
-
"react-
|
|
81
|
-
"react-
|
|
82
|
-
"react-
|
|
83
|
-
"
|
|
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": "*",
|
package/es/analytics/ga4.js
DELETED
|
@@ -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
|
-
}
|