@atlaskit/react-ufo 2.14.2 → 2.15.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.
- package/CHANGELOG.md +20 -0
- package/dist/cjs/create-payload/index.js +11 -0
- package/dist/cjs/experience-trace-id-context/index.js +5 -1
- package/dist/cjs/segment/segment.js +7 -1
- package/dist/cjs/vc/vc-observer/heatmap/heatmap.js +275 -0
- package/dist/cjs/vc/vc-observer/index.js +133 -29
- package/dist/cjs/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
- package/dist/cjs/vc/vc-observer/revisions/ViewportUpdateClassifier.js +52 -0
- package/dist/cjs/vc/vc-observer/revisions/fy24_01.js +39 -0
- package/dist/cjs/vc/vc-observer/revisions/fy25_01.js +39 -0
- package/dist/cjs/vc/vc-observer/revisions/revisions.js +23 -0
- package/dist/cjs/vc/vc-observer/revisions/types.js +5 -0
- package/dist/es2019/create-payload/index.js +11 -0
- package/dist/es2019/experience-trace-id-context/index.js +4 -0
- package/dist/es2019/segment/segment.js +11 -3
- package/dist/es2019/vc/vc-observer/heatmap/heatmap.js +238 -0
- package/dist/es2019/vc/vc-observer/index.js +115 -7
- package/dist/es2019/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
- package/dist/es2019/vc/vc-observer/revisions/ViewportUpdateClassifier.js +35 -0
- package/dist/es2019/vc/vc-observer/revisions/fy24_01.js +21 -0
- package/dist/es2019/vc/vc-observer/revisions/fy25_01.js +21 -0
- package/dist/es2019/vc/vc-observer/revisions/revisions.js +19 -0
- package/dist/es2019/vc/vc-observer/revisions/types.js +1 -0
- package/dist/esm/create-payload/index.js +11 -0
- package/dist/esm/experience-trace-id-context/index.js +4 -0
- package/dist/esm/segment/segment.js +7 -1
- package/dist/esm/vc/vc-observer/heatmap/heatmap.js +268 -0
- package/dist/esm/vc/vc-observer/index.js +133 -29
- package/dist/esm/vc/vc-observer/observers/ssr-placeholders/index.js +16 -27
- package/dist/esm/vc/vc-observer/revisions/ViewportUpdateClassifier.js +45 -0
- package/dist/esm/vc/vc-observer/revisions/fy24_01.js +32 -0
- package/dist/esm/vc/vc-observer/revisions/fy25_01.js +32 -0
- package/dist/esm/vc/vc-observer/revisions/revisions.js +17 -0
- package/dist/esm/vc/vc-observer/revisions/types.js +1 -0
- package/dist/types/common/vc/types.d.ts +28 -9
- package/dist/types/create-payload/index.d.ts +16 -0
- package/dist/types/experience-trace-id-context/index.d.ts +1 -0
- package/dist/types/interaction-ignore/ufo-interaction-ignore.d.ts +2 -2
- package/dist/types/label/UFOLabel.d.ts +2 -2
- package/dist/types/load-hold/UFOLoadHold.d.ts +2 -2
- package/dist/types/placeholder/Placeholder.d.ts +2 -2
- package/dist/types/placeholder/loosely-lazy/lazy-suspense.d.ts +2 -2
- package/dist/types/segment/segment-highlight.d.ts +2 -2
- package/dist/types/segment/segment.d.ts +2 -2
- package/dist/types/vc/vc-observer/heatmap/heatmap.d.ts +75 -0
- package/dist/types/vc/vc-observer/index.d.ts +6 -1
- package/dist/types/vc/vc-observer/media-wrapper/MediaWrapper.d.ts +1 -1
- package/dist/types/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +25 -0
- package/dist/types/vc/vc-observer/revisions/fy24_01.d.ts +11 -0
- package/dist/types/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
- package/dist/types/vc/vc-observer/revisions/revisions.d.ts +2 -0
- package/dist/types/vc/vc-observer/revisions/types.d.ts +5 -0
- package/dist/types-ts4.5/common/vc/types.d.ts +28 -9
- package/dist/types-ts4.5/create-payload/index.d.ts +16 -0
- package/dist/types-ts4.5/experience-trace-id-context/index.d.ts +1 -0
- package/dist/types-ts4.5/interaction-ignore/ufo-interaction-ignore.d.ts +2 -2
- package/dist/types-ts4.5/label/UFOLabel.d.ts +2 -2
- package/dist/types-ts4.5/load-hold/UFOLoadHold.d.ts +2 -2
- package/dist/types-ts4.5/placeholder/Placeholder.d.ts +2 -2
- package/dist/types-ts4.5/placeholder/loosely-lazy/lazy-suspense.d.ts +2 -2
- package/dist/types-ts4.5/segment/segment-highlight.d.ts +2 -2
- package/dist/types-ts4.5/segment/segment.d.ts +2 -2
- package/dist/types-ts4.5/vc/vc-observer/heatmap/heatmap.d.ts +75 -0
- package/dist/types-ts4.5/vc/vc-observer/index.d.ts +16 -1
- package/dist/types-ts4.5/vc/vc-observer/media-wrapper/MediaWrapper.d.ts +1 -1
- package/dist/types-ts4.5/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +25 -0
- package/dist/types-ts4.5/vc/vc-observer/revisions/fy24_01.d.ts +11 -0
- package/dist/types-ts4.5/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
- package/dist/types-ts4.5/vc/vc-observer/revisions/revisions.d.ts +2 -0
- package/dist/types-ts4.5/vc/vc-observer/revisions/types.d.ts +5 -0
- package/package.json +17 -6
|
@@ -8,7 +8,6 @@ exports.SSRPlaceholderHandlers = void 0;
|
|
|
8
8
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
9
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
10
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
-
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
12
11
|
var EQUALITY_THRESHOLD = 0.1;
|
|
13
12
|
var ANCESTOR_LOOKUP_LIMIT = 10;
|
|
14
13
|
var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/function () {
|
|
@@ -36,20 +35,15 @@ var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/funct
|
|
|
36
35
|
return;
|
|
37
36
|
}
|
|
38
37
|
var rect = _this.staticPlaceholders.get(staticKey);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
_resolve(hasSameSizePosition);
|
|
43
|
-
} else {
|
|
44
|
-
requestAnimationFrame(function () {
|
|
45
|
-
var targetRect = target.getBoundingClientRect();
|
|
46
|
-
var hasSameSizePosition = _this.hasSameSizePosition(rect, targetRect);
|
|
47
|
-
_resolve(hasSameSizePosition);
|
|
48
|
-
});
|
|
49
|
-
}
|
|
38
|
+
var hasSameSizePosition = _this.hasSameSizePosition(rect, boundingClientRect);
|
|
39
|
+
if (hasSameSizePosition || _this.isDummyRect(rect)) {
|
|
40
|
+
_resolve(hasSameSizePosition);
|
|
50
41
|
} else {
|
|
51
|
-
|
|
52
|
-
|
|
42
|
+
requestAnimationFrame(function () {
|
|
43
|
+
var targetRect = target.getBoundingClientRect();
|
|
44
|
+
var hasSameSizePosition = _this.hasSameSizePosition(rect, targetRect);
|
|
45
|
+
_resolve(hasSameSizePosition);
|
|
46
|
+
});
|
|
53
47
|
}
|
|
54
48
|
_this.callbacks.delete(staticKey);
|
|
55
49
|
}
|
|
@@ -60,20 +54,15 @@ var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/funct
|
|
|
60
54
|
return;
|
|
61
55
|
}
|
|
62
56
|
var _rect = _this.staticPlaceholders.get(key);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
_resolve2(_hasSameSizePosition2);
|
|
67
|
-
} else {
|
|
68
|
-
requestAnimationFrame(function () {
|
|
69
|
-
var targetRect = target.getBoundingClientRect();
|
|
70
|
-
var hasSameSizePosition = _this.hasSameSizePosition(_rect, targetRect);
|
|
71
|
-
_resolve2(hasSameSizePosition);
|
|
72
|
-
});
|
|
73
|
-
}
|
|
57
|
+
var _hasSameSizePosition = _this.hasSameSizePosition(_rect, boundingClientRect);
|
|
58
|
+
if (_hasSameSizePosition || _this.isDummyRect(_rect)) {
|
|
59
|
+
_resolve2(_hasSameSizePosition);
|
|
74
60
|
} else {
|
|
75
|
-
|
|
76
|
-
|
|
61
|
+
requestAnimationFrame(function () {
|
|
62
|
+
var targetRect = target.getBoundingClientRect();
|
|
63
|
+
var hasSameSizePosition = _this.hasSameSizePosition(_rect, targetRect);
|
|
64
|
+
_resolve2(hasSameSizePosition);
|
|
65
|
+
});
|
|
77
66
|
}
|
|
78
67
|
_this.staticPlaceholders.delete(staticKey);
|
|
79
68
|
_this.reactValidateCallbacks.delete(staticKey);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.ViewportUpdateClassifier = void 0;
|
|
8
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
9
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
11
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
12
|
+
var ViewportUpdateClassifier = exports.ViewportUpdateClassifier = /*#__PURE__*/function () {
|
|
13
|
+
function ViewportUpdateClassifier() {
|
|
14
|
+
(0, _classCallCheck2.default)(this, ViewportUpdateClassifier);
|
|
15
|
+
(0, _defineProperty2.default)(this, "types", []);
|
|
16
|
+
(0, _defineProperty2.default)(this, "filters", []);
|
|
17
|
+
(0, _defineProperty2.default)(this, "removedFilters", []);
|
|
18
|
+
(0, _defineProperty2.default)(this, "__combinedTypes", []);
|
|
19
|
+
(0, _defineProperty2.default)(this, "__combinedFilters", []);
|
|
20
|
+
}
|
|
21
|
+
return (0, _createClass2.default)(ViewportUpdateClassifier, [{
|
|
22
|
+
key: "mergeConfig",
|
|
23
|
+
value: function mergeConfig() {
|
|
24
|
+
var _this = this;
|
|
25
|
+
this.__combinedTypes = [].concat((0, _toConsumableArray2.default)(this.types), (0, _toConsumableArray2.default)((this === null || this === void 0 ? void 0 : this.__combinedTypes) || []));
|
|
26
|
+
var previousFilters = this.removedFilters.length === 0 ? this.__combinedFilters : this.__combinedFilters.filter(function (filter) {
|
|
27
|
+
return !_this.removedFilters.includes(filter.name);
|
|
28
|
+
});
|
|
29
|
+
this.__combinedFilters = [].concat((0, _toConsumableArray2.default)(this.filters), (0, _toConsumableArray2.default)(previousFilters));
|
|
30
|
+
}
|
|
31
|
+
}, {
|
|
32
|
+
key: "classifyUpdate",
|
|
33
|
+
value: function classifyUpdate(_ref) {
|
|
34
|
+
var element = _ref.element,
|
|
35
|
+
type = _ref.type,
|
|
36
|
+
tags = _ref.tags,
|
|
37
|
+
ignoreReason = _ref.ignoreReason;
|
|
38
|
+
if (!this.__combinedTypes.includes(type)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return this.__combinedFilters.every(function (_ref2) {
|
|
42
|
+
var filter = _ref2.filter,
|
|
43
|
+
name = _ref2.name;
|
|
44
|
+
return filter({
|
|
45
|
+
type: type,
|
|
46
|
+
tags: tags,
|
|
47
|
+
ignoreReason: ignoreReason
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}]);
|
|
52
|
+
}();
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.revFY24_01Classifier = exports.FY24_01Classifier = void 0;
|
|
8
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
9
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
11
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
12
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
13
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
|
+
var _ViewportUpdateClassifier = require("./ViewportUpdateClassifier");
|
|
15
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
|
|
16
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
17
|
+
var legacyIgnoreReasons = ['image', 'ssr-hydration', 'editor-lazy-node-view', 'editor-container-mutation'];
|
|
18
|
+
var FY24_01Classifier = exports.FY24_01Classifier = /*#__PURE__*/function (_ViewportUpdateClassi) {
|
|
19
|
+
function FY24_01Classifier() {
|
|
20
|
+
var _this;
|
|
21
|
+
(0, _classCallCheck2.default)(this, FY24_01Classifier);
|
|
22
|
+
_this = _callSuper(this, FY24_01Classifier);
|
|
23
|
+
(0, _defineProperty2.default)(_this, "revision", 'fy24.01');
|
|
24
|
+
(0, _defineProperty2.default)(_this, "types", ['html', 'text']);
|
|
25
|
+
(0, _defineProperty2.default)(_this, "filters", [{
|
|
26
|
+
name: 'default-ignore-reasons',
|
|
27
|
+
filter: function filter(_ref) {
|
|
28
|
+
var type = _ref.type,
|
|
29
|
+
ignoreReason = _ref.ignoreReason;
|
|
30
|
+
return !ignoreReason || !legacyIgnoreReasons.includes(ignoreReason);
|
|
31
|
+
}
|
|
32
|
+
}]);
|
|
33
|
+
_this.mergeConfig();
|
|
34
|
+
return _this;
|
|
35
|
+
}
|
|
36
|
+
(0, _inherits2.default)(FY24_01Classifier, _ViewportUpdateClassi);
|
|
37
|
+
return (0, _createClass2.default)(FY24_01Classifier);
|
|
38
|
+
}(_ViewportUpdateClassifier.ViewportUpdateClassifier);
|
|
39
|
+
var revFY24_01Classifier = exports.revFY24_01Classifier = new FY24_01Classifier();
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.revFY25_01Classifier = exports.FY25_01Classifier = void 0;
|
|
8
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
9
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
11
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
12
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
13
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
|
+
var _fy24_ = require("./fy24_01");
|
|
15
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
|
|
16
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
17
|
+
var FY25_01Classifier = exports.FY25_01Classifier = /*#__PURE__*/function (_FY24_01Classifier) {
|
|
18
|
+
function FY25_01Classifier() {
|
|
19
|
+
var _this;
|
|
20
|
+
(0, _classCallCheck2.default)(this, FY25_01Classifier);
|
|
21
|
+
_this = _callSuper(this, FY25_01Classifier);
|
|
22
|
+
(0, _defineProperty2.default)(_this, "revision", 'fy25.01');
|
|
23
|
+
(0, _defineProperty2.default)(_this, "types", ['attr']);
|
|
24
|
+
(0, _defineProperty2.default)(_this, "filters", [{
|
|
25
|
+
name: 'not-visible',
|
|
26
|
+
filter: function filter(_ref) {
|
|
27
|
+
var type = _ref.type,
|
|
28
|
+
ignoreReason = _ref.ignoreReason;
|
|
29
|
+
return !(ignoreReason !== null && ignoreReason !== void 0 && ignoreReason.includes('not-visible'));
|
|
30
|
+
}
|
|
31
|
+
}]);
|
|
32
|
+
(0, _defineProperty2.default)(_this, "removedFilters", []);
|
|
33
|
+
_this.mergeConfig();
|
|
34
|
+
return _this;
|
|
35
|
+
}
|
|
36
|
+
(0, _inherits2.default)(FY25_01Classifier, _FY24_01Classifier);
|
|
37
|
+
return (0, _createClass2.default)(FY25_01Classifier);
|
|
38
|
+
}(_fy24_.FY24_01Classifier);
|
|
39
|
+
var revFY25_01Classifier = exports.revFY25_01Classifier = new FY25_01Classifier();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getRevisions = void 0;
|
|
7
|
+
var _fy24_ = require("./fy24_01");
|
|
8
|
+
var _fy25_ = require("./fy25_01");
|
|
9
|
+
var Revisions = [{
|
|
10
|
+
name: 'fy24.01',
|
|
11
|
+
classifier: _fy24_.revFY24_01Classifier
|
|
12
|
+
}, {
|
|
13
|
+
name: 'fy25.01',
|
|
14
|
+
classifier: _fy25_.revFY25_01Classifier
|
|
15
|
+
}];
|
|
16
|
+
var revisionResultCache = null;
|
|
17
|
+
var getRevisions = exports.getRevisions = function getRevisions() {
|
|
18
|
+
if (revisionResultCache !== null) {
|
|
19
|
+
return revisionResultCache;
|
|
20
|
+
}
|
|
21
|
+
revisionResultCache = [].concat(Revisions);
|
|
22
|
+
return revisionResultCache;
|
|
23
|
+
};
|
|
@@ -201,6 +201,16 @@ const getVCMetrics = interaction => {
|
|
|
201
201
|
if (interactionStatus.originalInteractionStatus !== 'SUCCEEDED' || pageVisibilityUpToTTAI !== 'visible') {
|
|
202
202
|
return result;
|
|
203
203
|
}
|
|
204
|
+
if (fg('ufo_vc_multiheatmap')) {
|
|
205
|
+
var _result;
|
|
206
|
+
(_result = result[`${prefix}:vc:rev`]) === null || _result === void 0 ? void 0 : _result.forEach(element => {
|
|
207
|
+
var _element$vcDetails, _element$vcDetails$;
|
|
208
|
+
if ((_element$vcDetails = element.vcDetails) !== null && _element$vcDetails !== void 0 && (_element$vcDetails$ = _element$vcDetails['90']) !== null && _element$vcDetails$ !== void 0 && _element$vcDetails$.t) {
|
|
209
|
+
var _element$vcDetails$2;
|
|
210
|
+
element['metric:vc90'] = (_element$vcDetails$2 = element.vcDetails['90']) === null || _element$vcDetails$2 === void 0 ? void 0 : _element$vcDetails$2.t;
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
204
214
|
return {
|
|
205
215
|
...result,
|
|
206
216
|
'metric:vc90': VC['90']
|
|
@@ -615,6 +625,7 @@ function getPayloadSize(payload) {
|
|
|
615
625
|
return Math.round(new TextEncoder().encode(JSON.stringify(payload)).length / 1024);
|
|
616
626
|
}
|
|
617
627
|
function getStylesheetMetrics() {
|
|
628
|
+
// eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
|
|
618
629
|
if (!fg('ufo_capture_stylesheet_metrics')) {
|
|
619
630
|
return {};
|
|
620
631
|
}
|
|
@@ -28,4 +28,8 @@ export const getActiveTraceHttpRequestHeaders = _url => {
|
|
|
28
28
|
spanId
|
|
29
29
|
} = state.context;
|
|
30
30
|
return makeTraceHttpRequestHeaders(traceId, spanId);
|
|
31
|
+
};
|
|
32
|
+
export const getActiveTraceAsQueryParams = _url => {
|
|
33
|
+
const traceHeaders = getActiveTraceHttpRequestHeaders(_url);
|
|
34
|
+
return traceHeaders ? new URLSearchParams(traceHeaders).toString().toLowerCase() : null;
|
|
31
35
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { lazy, Profiler, Suspense, useCallback, useContext, useEffect, useMemo, useRef } from 'react';
|
|
2
2
|
import { unstable_NormalPriority as NormalPriority, unstable_scheduleCallback as scheduleCallback } from 'scheduler';
|
|
3
3
|
import { v4 as createUUID } from 'uuid';
|
|
4
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
4
5
|
import coinflip from '../coinflip';
|
|
5
6
|
import { getConfig, getInteractionRate } from '../config';
|
|
6
7
|
import { getActiveTrace, setInteractionActiveTrace } from '../experience-trace-id-context';
|
|
@@ -31,7 +32,9 @@ export default function UFOSegment({
|
|
|
31
32
|
}], [parentContext, segmentName, segmentId]);
|
|
32
33
|
const interactionId = useContext(UFOInteractionIDContext);
|
|
33
34
|
const interactionContext = useMemo(() => {
|
|
34
|
-
|
|
35
|
+
if (!fg('platform-ufo-add-segment-use-effect')) {
|
|
36
|
+
addSegment(labelStack);
|
|
37
|
+
}
|
|
35
38
|
let lastCompleteEndTime = 0;
|
|
36
39
|
function complete(endTime = performance.now()) {
|
|
37
40
|
if (interactionId.current) {
|
|
@@ -205,8 +208,13 @@ export default function UFOSegment({
|
|
|
205
208
|
interactionContext.onRender(phase, actualDuration, baseDuration, startTime, commitTime);
|
|
206
209
|
}
|
|
207
210
|
}, [interactionContext]);
|
|
208
|
-
useEffect(() =>
|
|
209
|
-
|
|
211
|
+
useEffect(() => {
|
|
212
|
+
if (fg('platform-ufo-add-segment-use-effect')) {
|
|
213
|
+
addSegment(labelStack);
|
|
214
|
+
}
|
|
215
|
+
return () => {
|
|
216
|
+
removeSegment(labelStack);
|
|
217
|
+
};
|
|
210
218
|
}, [interactionId, parentContext, interactionContext, labelStack]);
|
|
211
219
|
const reactProfilerId = useMemo(() => labelStack.map(l => l.name).join('/'), [labelStack]);
|
|
212
220
|
const enableSegmentHighlighting = (_getConfig2 = getConfig()) === null || _getConfig2 === void 0 ? void 0 : _getConfig2.enableSegmentHighlighting;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
const UNUSED_SECTOR = 0;
|
|
3
|
+
export class MultiRevisionHeatmap {
|
|
4
|
+
constructor({
|
|
5
|
+
viewport,
|
|
6
|
+
revisions,
|
|
7
|
+
arraySize,
|
|
8
|
+
devToolsEnabled
|
|
9
|
+
}) {
|
|
10
|
+
_defineProperty(this, "arraySize", {
|
|
11
|
+
w: 200,
|
|
12
|
+
h: 200
|
|
13
|
+
});
|
|
14
|
+
_defineProperty(this, "mapPixelsToHeatmap", (left, top, width, height) => {
|
|
15
|
+
const {
|
|
16
|
+
w,
|
|
17
|
+
h
|
|
18
|
+
} = this.viewport;
|
|
19
|
+
const l = Math.floor(left / w * this.arraySize.w);
|
|
20
|
+
const t = Math.floor(top / h * this.arraySize.h);
|
|
21
|
+
const r = Math.ceil((left + width) / w * this.arraySize.w);
|
|
22
|
+
const b = Math.ceil((top + height) / h * this.arraySize.h);
|
|
23
|
+
|
|
24
|
+
// correct values to min - 0, max - arraySize
|
|
25
|
+
const result = {
|
|
26
|
+
l: Math.max(0, l),
|
|
27
|
+
t: Math.max(0, t),
|
|
28
|
+
r: Math.min(this.arraySize.w, r),
|
|
29
|
+
b: Math.min(this.arraySize.h, b)
|
|
30
|
+
};
|
|
31
|
+
return result;
|
|
32
|
+
});
|
|
33
|
+
_defineProperty(this, "getElementRatio", mappedValues => {
|
|
34
|
+
const {
|
|
35
|
+
r,
|
|
36
|
+
l,
|
|
37
|
+
b,
|
|
38
|
+
t
|
|
39
|
+
} = mappedValues;
|
|
40
|
+
return (r - l) * (b - t) / (this.arraySize.w * this.arraySize.h);
|
|
41
|
+
});
|
|
42
|
+
this.viewport = viewport;
|
|
43
|
+
this.revisions = revisions;
|
|
44
|
+
if (arraySize) {
|
|
45
|
+
this.arraySize = arraySize;
|
|
46
|
+
}
|
|
47
|
+
this.heatmaps = new Array(revisions.length);
|
|
48
|
+
this.componentsLogs = new Array(revisions.length);
|
|
49
|
+
this.vcRatios = new Array(revisions.length);
|
|
50
|
+
this.devToolsEnabled = devToolsEnabled || false;
|
|
51
|
+
revisions.forEach(({}, i) => {
|
|
52
|
+
this.heatmaps[i] = this.getCleanHeatmap();
|
|
53
|
+
this.componentsLogs[i] = {};
|
|
54
|
+
this.vcRatios[i] = {};
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
handleUpdate({
|
|
58
|
+
time,
|
|
59
|
+
type,
|
|
60
|
+
classification,
|
|
61
|
+
intersectionRect,
|
|
62
|
+
element,
|
|
63
|
+
targetName,
|
|
64
|
+
ignoreReason,
|
|
65
|
+
onError
|
|
66
|
+
}) {
|
|
67
|
+
const mappedValues = this.mapPixelsToHeatmap(intersectionRect.left, intersectionRect.top, intersectionRect.width, intersectionRect.height);
|
|
68
|
+
const result = this.applyChangesToHeatMap(mappedValues, time, classification);
|
|
69
|
+
if (result !== true) {
|
|
70
|
+
onError(result);
|
|
71
|
+
}
|
|
72
|
+
const componentRatio = this.getElementRatio(mappedValues);
|
|
73
|
+
this.revisions.forEach((_, i) => {
|
|
74
|
+
if (classification[i]) {
|
|
75
|
+
this.vcRatios[i][targetName] = componentRatio;
|
|
76
|
+
}
|
|
77
|
+
if (!this.componentsLogs[i][time]) {
|
|
78
|
+
this.componentsLogs[i][time] = [];
|
|
79
|
+
}
|
|
80
|
+
this.componentsLogs[i][time].push({
|
|
81
|
+
__debug__element: this.devToolsEnabled ? new WeakRef(element) : null,
|
|
82
|
+
intersectionRect,
|
|
83
|
+
targetName,
|
|
84
|
+
ignoreReason
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
getData() {
|
|
89
|
+
return {
|
|
90
|
+
heatmaps: this.heatmaps
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
getPayloadShapedData(args) {
|
|
94
|
+
const result = this.processData(args);
|
|
95
|
+
const payload = this.revisions.map((rev, i) => {
|
|
96
|
+
const vcDetails = {};
|
|
97
|
+
args.VCParts.forEach(VCPart => {
|
|
98
|
+
vcDetails[VCPart] = {
|
|
99
|
+
t: result[i].VC[VCPart] || 0,
|
|
100
|
+
e: Array.from(result[i].VCBox[VCPart] || [])
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
revision: rev.name,
|
|
105
|
+
vcDetails,
|
|
106
|
+
clean: args.clean,
|
|
107
|
+
'metric:vc90': null // will be set or not in the payload generator
|
|
108
|
+
};
|
|
109
|
+
});
|
|
110
|
+
return payload;
|
|
111
|
+
}
|
|
112
|
+
processData({
|
|
113
|
+
VCParts,
|
|
114
|
+
ssr = UNUSED_SECTOR
|
|
115
|
+
}) {
|
|
116
|
+
return this.heatmaps.map((heatmap, i) => {
|
|
117
|
+
const lastUpdate = {};
|
|
118
|
+
let totalPainted = 0;
|
|
119
|
+
let componentsLog = this.componentsLogs[i];
|
|
120
|
+
if (ssr !== UNUSED_SECTOR) {
|
|
121
|
+
var _window$document;
|
|
122
|
+
const element = {
|
|
123
|
+
__debug__element: new WeakRef((_window$document = window.document) === null || _window$document === void 0 ? void 0 : _window$document.body),
|
|
124
|
+
intersectionRect: {
|
|
125
|
+
top: 0,
|
|
126
|
+
left: 0,
|
|
127
|
+
right: 0,
|
|
128
|
+
bottom: 0,
|
|
129
|
+
x: 0,
|
|
130
|
+
y: 0,
|
|
131
|
+
width: this.viewport.w,
|
|
132
|
+
height: this.viewport.h,
|
|
133
|
+
toJSON() {
|
|
134
|
+
return {};
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
targetName: 'SSR'
|
|
138
|
+
};
|
|
139
|
+
if (!componentsLog[ssr]) {
|
|
140
|
+
componentsLog[ssr] = [];
|
|
141
|
+
}
|
|
142
|
+
componentsLog[ssr].push(element);
|
|
143
|
+
}
|
|
144
|
+
for (let i = 0; i < heatmap.length; i++) {
|
|
145
|
+
const rounded = Math.floor(heatmap[i] === UNUSED_SECTOR && ssr !== UNUSED_SECTOR ? ssr : heatmap[i]);
|
|
146
|
+
totalPainted += rounded !== UNUSED_SECTOR ? 1 : 0;
|
|
147
|
+
if (rounded !== UNUSED_SECTOR) {
|
|
148
|
+
lastUpdate[rounded] = lastUpdate[rounded] ? lastUpdate[rounded] + 1 : 1;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const entries = Object.entries(lastUpdate).map(a => [parseInt(a[0], 10), a[1]]).sort((a, b) => a[0] > b[0] ? 1 : -1);
|
|
152
|
+
const VC = MultiRevisionHeatmap.makeVCReturnObj(VCParts);
|
|
153
|
+
const VCBox = MultiRevisionHeatmap.makeVCReturnObj(VCParts);
|
|
154
|
+
entries.reduce((acc = 0, v) => {
|
|
155
|
+
const VCRatio = v[1] / totalPainted + acc;
|
|
156
|
+
const time = v[0];
|
|
157
|
+
VCParts.forEach(value => {
|
|
158
|
+
if ((VC[value] === null || VC[value] === undefined) && VCRatio >= value / 100) {
|
|
159
|
+
var _componentsLog$time;
|
|
160
|
+
VC[value] = time;
|
|
161
|
+
VCBox[value] = new Set();
|
|
162
|
+
(_componentsLog$time = componentsLog[time]) === null || _componentsLog$time === void 0 ? void 0 : _componentsLog$time.forEach(v => {
|
|
163
|
+
var _VCBox$value;
|
|
164
|
+
return (_VCBox$value = VCBox[value]) === null || _VCBox$value === void 0 ? void 0 : _VCBox$value.add(v.targetName);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
return VCRatio;
|
|
169
|
+
}, 0);
|
|
170
|
+
const VCEntries = entries.reduce((acc, [timestamp, entryPainted], i) => {
|
|
171
|
+
var _acc$abs, _componentsLog$timest;
|
|
172
|
+
const currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
|
|
173
|
+
const currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
|
|
174
|
+
const logEntry = (_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.map(v => v.targetName);
|
|
175
|
+
acc.abs.push([timestamp, currentlyPainted]);
|
|
176
|
+
acc.rel.push({
|
|
177
|
+
time: timestamp,
|
|
178
|
+
vc: currentlyPaintedRatio,
|
|
179
|
+
elements: logEntry
|
|
180
|
+
});
|
|
181
|
+
return acc;
|
|
182
|
+
}, {
|
|
183
|
+
abs: [],
|
|
184
|
+
rel: []
|
|
185
|
+
});
|
|
186
|
+
return {
|
|
187
|
+
VC,
|
|
188
|
+
VCBox,
|
|
189
|
+
VCEntries,
|
|
190
|
+
totalPainted
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
applyChangesToHeatMap(a, time, classification) {
|
|
195
|
+
const {
|
|
196
|
+
l,
|
|
197
|
+
t,
|
|
198
|
+
r,
|
|
199
|
+
b
|
|
200
|
+
} = a;
|
|
201
|
+
const size = classification.length;
|
|
202
|
+
for (let row = t; row < b; row++) {
|
|
203
|
+
if (this.heatmaps[0][row] === undefined) {
|
|
204
|
+
try {
|
|
205
|
+
return {
|
|
206
|
+
error: `index - ${row}`,
|
|
207
|
+
time
|
|
208
|
+
};
|
|
209
|
+
} catch (e) {
|
|
210
|
+
return {
|
|
211
|
+
error: 'row error',
|
|
212
|
+
time
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
for (let heatmapIndex = 0; heatmapIndex < size; heatmapIndex++) {
|
|
217
|
+
if (classification[heatmapIndex]) {
|
|
218
|
+
this.heatmaps[heatmapIndex].fill(time, this.getIndex(l, row), this.getIndex(r, row));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
getIndex(x, y) {
|
|
226
|
+
return x + this.arraySize.w * y;
|
|
227
|
+
}
|
|
228
|
+
getCleanHeatmap() {
|
|
229
|
+
return new Uint32Array(this.arraySize.w * this.arraySize.h);
|
|
230
|
+
}
|
|
231
|
+
static makeVCReturnObj(VCParts) {
|
|
232
|
+
const vc = {};
|
|
233
|
+
VCParts.forEach(v => {
|
|
234
|
+
vc[v] = null;
|
|
235
|
+
});
|
|
236
|
+
return vc;
|
|
237
|
+
}
|
|
238
|
+
}
|