@atlaskit/react-ufo 2.14.3 → 2.16.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 (73) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/assets/index.js +96 -0
  3. package/dist/cjs/assets/utils.js +32 -0
  4. package/dist/cjs/common/assets/types.js +5 -0
  5. package/dist/cjs/create-payload/index.js +42 -5
  6. package/dist/cjs/experience-trace-id-context/index.js +5 -1
  7. package/dist/cjs/segment/segment.js +7 -1
  8. package/dist/cjs/vc/vc-observer/heatmap/heatmap.js +264 -0
  9. package/dist/cjs/vc/vc-observer/index.js +119 -26
  10. package/dist/cjs/vc/vc-observer/revisions/ViewportUpdateClassifier.js +60 -0
  11. package/dist/cjs/vc/vc-observer/revisions/fy24_01.js +71 -0
  12. package/dist/cjs/vc/vc-observer/revisions/fy25_01.js +39 -0
  13. package/dist/cjs/vc/vc-observer/revisions/revisions.js +23 -0
  14. package/dist/cjs/vc/vc-observer/revisions/types.js +5 -0
  15. package/dist/es2019/assets/index.js +82 -0
  16. package/dist/es2019/assets/utils.js +26 -0
  17. package/dist/es2019/common/assets/types.js +1 -0
  18. package/dist/es2019/create-payload/index.js +43 -3
  19. package/dist/es2019/experience-trace-id-context/index.js +4 -0
  20. package/dist/es2019/segment/segment.js +11 -3
  21. package/dist/es2019/vc/vc-observer/heatmap/heatmap.js +230 -0
  22. package/dist/es2019/vc/vc-observer/index.js +97 -3
  23. package/dist/es2019/vc/vc-observer/revisions/ViewportUpdateClassifier.js +41 -0
  24. package/dist/es2019/vc/vc-observer/revisions/fy24_01.js +50 -0
  25. package/dist/es2019/vc/vc-observer/revisions/fy25_01.js +21 -0
  26. package/dist/es2019/vc/vc-observer/revisions/revisions.js +19 -0
  27. package/dist/es2019/vc/vc-observer/revisions/types.js +1 -0
  28. package/dist/esm/assets/index.js +89 -0
  29. package/dist/esm/assets/utils.js +26 -0
  30. package/dist/esm/common/assets/types.js +1 -0
  31. package/dist/esm/create-payload/index.js +42 -5
  32. package/dist/esm/experience-trace-id-context/index.js +4 -0
  33. package/dist/esm/segment/segment.js +7 -1
  34. package/dist/esm/vc/vc-observer/heatmap/heatmap.js +257 -0
  35. package/dist/esm/vc/vc-observer/index.js +119 -26
  36. package/dist/esm/vc/vc-observer/revisions/ViewportUpdateClassifier.js +53 -0
  37. package/dist/esm/vc/vc-observer/revisions/fy24_01.js +64 -0
  38. package/dist/esm/vc/vc-observer/revisions/fy25_01.js +32 -0
  39. package/dist/esm/vc/vc-observer/revisions/revisions.js +17 -0
  40. package/dist/esm/vc/vc-observer/revisions/types.js +1 -0
  41. package/dist/types/assets/index.d.ts +25 -0
  42. package/dist/types/assets/utils.d.ts +6 -0
  43. package/dist/types/common/assets/types.d.ts +18 -0
  44. package/dist/types/common/index.d.ts +1 -0
  45. package/dist/types/common/vc/types.d.ts +27 -8
  46. package/dist/types/config/index.d.ts +2 -1
  47. package/dist/types/create-payload/index.d.ts +11616 -0
  48. package/dist/types/experience-trace-id-context/index.d.ts +1 -0
  49. package/dist/types/resource-timing/index.d.ts +1 -1
  50. package/dist/types/vc/vc-observer/heatmap/heatmap.d.ts +72 -0
  51. package/dist/types/vc/vc-observer/index.d.ts +5 -1
  52. package/dist/types/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +30 -0
  53. package/dist/types/vc/vc-observer/revisions/fy24_01.d.ts +13 -0
  54. package/dist/types/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  55. package/dist/types/vc/vc-observer/revisions/revisions.d.ts +2 -0
  56. package/dist/types/vc/vc-observer/revisions/types.d.ts +23 -0
  57. package/dist/types-ts4.5/assets/index.d.ts +25 -0
  58. package/dist/types-ts4.5/assets/utils.d.ts +6 -0
  59. package/dist/types-ts4.5/common/assets/types.d.ts +18 -0
  60. package/dist/types-ts4.5/common/index.d.ts +1 -0
  61. package/dist/types-ts4.5/common/vc/types.d.ts +27 -8
  62. package/dist/types-ts4.5/config/index.d.ts +2 -1
  63. package/dist/types-ts4.5/create-payload/index.d.ts +11616 -0
  64. package/dist/types-ts4.5/experience-trace-id-context/index.d.ts +1 -0
  65. package/dist/types-ts4.5/resource-timing/index.d.ts +1 -1
  66. package/dist/types-ts4.5/vc/vc-observer/heatmap/heatmap.d.ts +72 -0
  67. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +15 -1
  68. package/dist/types-ts4.5/vc/vc-observer/revisions/ViewportUpdateClassifier.d.ts +30 -0
  69. package/dist/types-ts4.5/vc/vc-observer/revisions/fy24_01.d.ts +13 -0
  70. package/dist/types-ts4.5/vc/vc-observer/revisions/fy25_01.d.ts +13 -0
  71. package/dist/types-ts4.5/vc/vc-observer/revisions/revisions.d.ts +2 -0
  72. package/dist/types-ts4.5/vc/vc-observer/revisions/types.d.ts +23 -0
  73. package/package.json +11 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 2.16.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#109616](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/109616)
8
+ [`5feb3a695a6d9`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/5feb3a695a6d9) -
9
+ Add Assets API to rUFO
10
+
11
+ ## 2.15.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#115462](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/115462)
16
+ [`17a3ace9d5f67`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/17a3ace9d5f67) -
17
+ Moved addSegment to useEffect to prevent it added multiple times when running on concurrent mode
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies
22
+
3
23
  ## 2.14.3
4
24
 
5
25
  ### Patch Changes
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.CHRSummary = exports.CHRReporter = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
+ var _defineProperty4 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _utils = require("./utils");
13
+ var CHRSummary = exports.CHRSummary = /*#__PURE__*/function () {
14
+ function CHRSummary() {
15
+ (0, _classCallCheck2.default)(this, CHRSummary);
16
+ (0, _defineProperty4.default)(this, "bundles", (0, _defineProperty4.default)((0, _defineProperty4.default)((0, _defineProperty4.default)({}, _utils.MEMORY_KEY, 0), _utils.DISK_KEY, 0), _utils.NETWORK_KEY, 0));
17
+ (0, _defineProperty4.default)(this, "bundlesCount", 0);
18
+ (0, _defineProperty4.default)(this, "size", (0, _defineProperty4.default)((0, _defineProperty4.default)((0, _defineProperty4.default)({}, _utils.MEMORY_KEY, 0), _utils.DISK_KEY, 0), _utils.NETWORK_KEY, 0));
19
+ (0, _defineProperty4.default)(this, "sizeTotal", 0);
20
+ }
21
+ return (0, _createClass2.default)(CHRSummary, [{
22
+ key: "add",
23
+ value: function add(asset) {
24
+ var size = 'size' in asset ? asset.size : undefined;
25
+ var encodedSize = 'encodedSize' in asset ? Number(asset.encodedSize) : 0;
26
+ var type = (0, _utils.calculateTransferType)(asset.type, asset.duration, size);
27
+ if (type === null) {
28
+ return;
29
+ }
30
+ this.bundles[type] += 1;
31
+ this.bundlesCount += 1;
32
+ this.size[type] += encodedSize;
33
+ this.sizeTotal += encodedSize;
34
+ }
35
+ }], [{
36
+ key: "makePayload",
37
+ value: function makePayload(summary) {
38
+ var size = summary.size,
39
+ bundlesCount = summary.bundlesCount,
40
+ sizeTotal = summary.sizeTotal;
41
+ var cachedSize = size[_utils.MEMORY_KEY] + size[_utils.DISK_KEY];
42
+ var sizeRatio = (0, _utils.round)(cachedSize / summary.sizeTotal);
43
+ return {
44
+ size: sizeTotal,
45
+ chr: sizeRatio,
46
+ count: bundlesCount
47
+ };
48
+ }
49
+ }]);
50
+ }();
51
+ var CHRReporter = exports.CHRReporter = /*#__PURE__*/function () {
52
+ function CHRReporter() {
53
+ (0, _classCallCheck2.default)(this, CHRReporter);
54
+ (0, _defineProperty4.default)(this, "all", new CHRSummary());
55
+ (0, _defineProperty4.default)(this, "allAtlassian", new CHRSummary());
56
+ (0, _defineProperty4.default)(this, "preloaded", new CHRSummary());
57
+ }
58
+ return (0, _createClass2.default)(CHRReporter, [{
59
+ key: "get",
60
+ value: function get(resourceTimings, assetsClassification) {
61
+ var _this = this;
62
+ try {
63
+ Object.entries(resourceTimings).map(function (_ref) {
64
+ var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
65
+ label = _ref2[0],
66
+ entry = _ref2[1];
67
+ if (assetsClassification.all) {
68
+ _this.all.add(entry);
69
+ }
70
+ if (assetsClassification.allAtlassian({
71
+ label: label,
72
+ entry: entry
73
+ })) {
74
+ _this.allAtlassian.add(entry);
75
+ }
76
+ if (assetsClassification.preloaded({
77
+ label: label,
78
+ entry: entry
79
+ })) {
80
+ _this.preloaded.add(entry);
81
+ }
82
+ });
83
+ if (this.all.bundlesCount === 0) {
84
+ return null;
85
+ }
86
+ return {
87
+ all: CHRSummary.makePayload(this.all),
88
+ allAtlassian: CHRSummary.makePayload(this.allAtlassian),
89
+ preloaded: CHRSummary.makePayload(this.preloaded)
90
+ };
91
+ } catch (error) {
92
+ return null;
93
+ }
94
+ }
95
+ }]);
96
+ }();
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.round = exports.calculateTransferType = exports.cacheableTypes = exports.NETWORK_KEY = exports.MEMORY_KEY = exports.DISK_KEY = void 0;
7
+ /* Borrowed from https://bitbucket.org/atlassian/atlassian-frontend/src/master/packages/performance/browser-metrics/src/plugins/timings/resource.ts */
8
+ var cacheableTypes = exports.cacheableTypes = ['script', 'link'];
9
+ var MEMORY_KEY = exports.MEMORY_KEY = 'mem';
10
+ var DISK_KEY = exports.DISK_KEY = 'disk';
11
+ var NETWORK_KEY = exports.NETWORK_KEY = 'net';
12
+ var calculateTransferType = exports.calculateTransferType = function calculateTransferType(type, duration, size) {
13
+ if (!cacheableTypes.includes(type)) {
14
+ return null;
15
+ }
16
+ if ((size === undefined || size === 0) && duration === 0) {
17
+ return MEMORY_KEY;
18
+ }
19
+ if (size === 0 && duration > 0) {
20
+ return DISK_KEY;
21
+ }
22
+ if (size === undefined) {
23
+ return null;
24
+ }
25
+ return NETWORK_KEY;
26
+ };
27
+ var round = exports.round = function round(n) {
28
+ if (isNaN(n)) {
29
+ return 0;
30
+ }
31
+ return Math.round(n * 10000) / 10000;
32
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -14,6 +14,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
14
14
  var _bowserUltralight = _interopRequireDefault(require("bowser-ultralight"));
15
15
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
16
  var _additionalPayload = require("../additional-payload");
17
+ var _assets = require("../assets");
17
18
  var bundleEvalTiming = _interopRequireWildcard(require("../bundle-eval-timing"));
18
19
  var _coinflip = _interopRequireDefault(require("../coinflip"));
19
20
  var _constants = require("../common/constants");
@@ -222,6 +223,16 @@ var getVCMetrics = function getVCMetrics(interaction) {
222
223
  if (interactionStatus.originalInteractionStatus !== 'SUCCEEDED' || pageVisibilityUpToTTAI !== 'visible') {
223
224
  return result;
224
225
  }
226
+ if ((0, _platformFeatureFlags.fg)('ufo_vc_multiheatmap')) {
227
+ var _result;
228
+ (_result = result["".concat(prefix, ":vc:rev")]) === null || _result === void 0 || _result.forEach(function (element) {
229
+ var _element$vcDetails;
230
+ if ((_element$vcDetails = element.vcDetails) !== null && _element$vcDetails !== void 0 && (_element$vcDetails = _element$vcDetails['90']) !== null && _element$vcDetails !== void 0 && _element$vcDetails.t) {
231
+ var _element$vcDetails$;
232
+ element['metric:vc90'] = (_element$vcDetails$ = element.vcDetails['90']) === null || _element$vcDetails$ === void 0 ? void 0 : _element$vcDetails$.t;
233
+ }
234
+ });
235
+ }
225
236
  return _objectSpread(_objectSpread({}, result), {}, {
226
237
  'metric:vc90': VC['90']
227
238
  });
@@ -305,6 +316,31 @@ function getSSRProperties(type) {
305
316
  'ssr:featureFlags': getSSRFeatureFlags(type)
306
317
  };
307
318
  }
319
+ var getAssetsMetrics = function getAssetsMetrics(interaction, resourceTimings) {
320
+ try {
321
+ var config = (0, _config.getConfig)();
322
+ var type = interaction.type;
323
+ var isCHREnabled = (0, _platformFeatureFlags.fg)('ufo_chr_config');
324
+ var allowedTypes = ['page_load', 'transition'];
325
+ var assetsClassification = config === null || config === void 0 ? void 0 : config.assetsClassification;
326
+ if (!isCHREnabled || !allowedTypes.includes(type) || !assetsClassification) {
327
+ // Skip if: FG disabled, not allowed type or assetsClassification isn't configured
328
+ return {};
329
+ }
330
+ var reporter = new _assets.CHRReporter();
331
+ var assets = reporter.get(resourceTimings, assetsClassification);
332
+ if (assets) {
333
+ // Only add assets in case it exists
334
+ return {
335
+ 'event:assets': assets
336
+ };
337
+ }
338
+ return {};
339
+ } catch (error) {
340
+ // Skip CHR in case of error
341
+ return {};
342
+ }
343
+ };
308
344
  var getBrowserMetadata = function getBrowserMetadata() {
309
345
  var data = {};
310
346
  var now = new Date();
@@ -719,7 +755,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
719
755
  });
720
756
  };
721
757
  // Detailed payload. Page visibility = visible
722
- var getDetailedInteractionMetrics = function getDetailedInteractionMetrics() {
758
+ var getDetailedInteractionMetrics = function getDetailedInteractionMetrics(resourceTimings) {
723
759
  if (experimental || window.__UFO_COMPACT_PAYLOAD__ || !isDetailedPayload) {
724
760
  return {};
725
761
  }
@@ -740,7 +776,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
740
776
  requestInfo: optimizeRequestInfo(interaction.requestInfo, start),
741
777
  customTimings: optimizeCustomTimings(interaction.customTimings, start),
742
778
  bundleEvalTimings: objectToArray(getBundleEvalTimings(start)),
743
- resourceTimings: objectToArray(getResourceTimings(start, end))
779
+ resourceTimings: objectToArray(resourceTimings)
744
780
  };
745
781
  };
746
782
  // Page load & detailed payload
@@ -761,6 +797,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
761
797
  regularTTAI = getTTAI(interaction);
762
798
  }
763
799
  var newUFOName = (0, _utils.sanitizeUfoName)(ufoName);
800
+ var resourceTimings = getResourceTimings(start, end);
764
801
  var payload = {
765
802
  actionSubject: 'experience',
766
803
  action: 'measured',
@@ -768,7 +805,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
768
805
  source: 'measured',
769
806
  tags: ['observability'],
770
807
  attributes: {
771
- properties: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
808
+ properties: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
772
809
  // basic
773
810
  'event:hostname': ((_window$location = window.location) === null || _window$location === void 0 ? void 0 : _window$location.hostname) || 'unknown',
774
811
  'event:product': config.product,
@@ -782,7 +819,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
782
819
  'event:region': config.region || 'unknown',
783
820
  'experience:key': experimental ? 'custom.experimental-interaction-metrics' : 'custom.interaction-metrics',
784
821
  'experience:name': newUFOName
785
- }, getBrowserMetadata()), getSSRProperties(type)), getPPSMetrics(interaction)), getPaintMetrics(type)), getNavigationMetrics(type)), getVCMetrics(interaction)), experimental ? (0, _createExperimentalInteractionMetricsPayload.getExperimentalVCMetrics)(interaction) : undefined), (_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)), getTracingContextData(interaction)), getStylesheetMetrics()), getErrorCounts(interaction)), {}, {
822
+ }, getBrowserMetadata()), getSSRProperties(type)), getAssetsMetrics(interaction, resourceTimings)), getPPSMetrics(interaction)), getPaintMetrics(type)), getNavigationMetrics(type)), getVCMetrics(interaction)), experimental ? (0, _createExperimentalInteractionMetricsPayload.getExperimentalVCMetrics)(interaction) : undefined), (_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)), getTracingContextData(interaction)), getStylesheetMetrics()), getErrorCounts(interaction)), {}, {
786
823
  interactionMetrics: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
787
824
  namePrefix: config.namePrefix || '',
788
825
  segmentPrefix: config.segmentPrefix || '',
@@ -814,7 +851,7 @@ function createInteractionMetricsPayload(interaction, interactionId, experimenta
814
851
  marks: optimizeMarks(interaction.marks),
815
852
  customData: optimizeCustomData(interaction),
816
853
  reactProfilerTimings: optimizeReactProfilerTimings(interaction.reactProfilerTimings, start)
817
- }, labelStack), getPageLoadInteractionMetrics()), getDetailedInteractionMetrics()), getPageLoadDetailedInteractionMetrics()), getBm3TrackerTimings(interaction)), {}, {
854
+ }, labelStack), getPageLoadInteractionMetrics()), getDetailedInteractionMetrics(resourceTimings)), getPageLoadDetailedInteractionMetrics()), getBm3TrackerTimings(interaction)), {}, {
818
855
  'metric:ttai': experimental ? regularTTAI || expTTAI : undefined,
819
856
  'metric:experimental:ttai': expTTAI
820
857
  }),
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.setInteractionActiveTrace = exports.setActiveTrace = exports.getActiveTraceHttpRequestHeaders = exports.getActiveTrace = exports.generateSpanId = exports.clearActiveTrace = void 0;
6
+ exports.setInteractionActiveTrace = exports.setActiveTrace = exports.getActiveTraceHttpRequestHeaders = exports.getActiveTraceAsQueryParams = exports.getActiveTrace = exports.generateSpanId = exports.clearActiveTrace = void 0;
7
7
  var _makeTraceHttpRequestHeaders = require("./utils/make-trace-http-request-headers");
8
8
  var state = {
9
9
  context: null
@@ -37,4 +37,8 @@ var getActiveTraceHttpRequestHeaders = exports.getActiveTraceHttpRequestHeaders
37
37
  traceId = _state$context.traceId,
38
38
  spanId = _state$context.spanId;
39
39
  return (0, _makeTraceHttpRequestHeaders.makeTraceHttpRequestHeaders)(traceId, spanId);
40
+ };
41
+ var getActiveTraceAsQueryParams = exports.getActiveTraceAsQueryParams = function getActiveTraceAsQueryParams(_url) {
42
+ var traceHeaders = getActiveTraceHttpRequestHeaders(_url);
43
+ return traceHeaders ? new URLSearchParams(traceHeaders).toString().toLowerCase() : null;
40
44
  };
@@ -11,6 +11,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _scheduler = require("scheduler");
13
13
  var _uuid = require("uuid");
14
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
15
  var _coinflip = _interopRequireDefault(require("../coinflip"));
15
16
  var _config = require("../config");
16
17
  var _experienceTraceIdContext = require("../experience-trace-id-context");
@@ -54,7 +55,9 @@ function UFOSegment(_ref) {
54
55
  }, [parentContext, segmentName, segmentId]);
55
56
  var interactionId = (0, _react.useContext)(_interactionIdContext.default);
56
57
  var interactionContext = (0, _react.useMemo)(function () {
57
- (0, _interactionMetrics.addSegment)(labelStack);
58
+ if (!(0, _platformFeatureFlags.fg)('platform-ufo-add-segment-use-effect')) {
59
+ (0, _interactionMetrics.addSegment)(labelStack);
60
+ }
58
61
  var lastCompleteEndTime = 0;
59
62
  function complete() {
60
63
  var endTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : performance.now();
@@ -233,6 +236,9 @@ function UFOSegment(_ref) {
233
236
  }
234
237
  }, [interactionContext]);
235
238
  (0, _react.useEffect)(function () {
239
+ if ((0, _platformFeatureFlags.fg)('platform-ufo-add-segment-use-effect')) {
240
+ (0, _interactionMetrics.addSegment)(labelStack);
241
+ }
236
242
  return function () {
237
243
  (0, _interactionMetrics.removeSegment)(labelStack);
238
244
  };
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.MultiRevisionHeatmap = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _objectDestructuringEmpty2 = _interopRequireDefault(require("@babel/runtime/helpers/objectDestructuringEmpty"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+ var UNUSED_SECTOR = 0;
14
+ var MultiRevisionHeatmap = exports.MultiRevisionHeatmap = /*#__PURE__*/function () {
15
+ function MultiRevisionHeatmap(_ref) {
16
+ var _this = this;
17
+ var viewport = _ref.viewport,
18
+ revisions = _ref.revisions,
19
+ arraySize = _ref.arraySize,
20
+ devToolsEnabled = _ref.devToolsEnabled;
21
+ (0, _classCallCheck2.default)(this, MultiRevisionHeatmap);
22
+ (0, _defineProperty2.default)(this, "arraySize", {
23
+ w: 200,
24
+ h: 200
25
+ });
26
+ (0, _defineProperty2.default)(this, "mapPixelsToHeatmap", function (left, top, width, height) {
27
+ var _this$viewport = _this.viewport,
28
+ w = _this$viewport.w,
29
+ h = _this$viewport.h;
30
+ var l = Math.floor(left / w * _this.arraySize.w);
31
+ var t = Math.floor(top / h * _this.arraySize.h);
32
+ var r = Math.ceil((left + width) / w * _this.arraySize.w);
33
+ var b = Math.ceil((top + height) / h * _this.arraySize.h);
34
+
35
+ // correct values to min - 0, max - arraySize
36
+ var result = {
37
+ l: Math.max(0, l),
38
+ t: Math.max(0, t),
39
+ r: Math.min(_this.arraySize.w, r),
40
+ b: Math.min(_this.arraySize.h, b)
41
+ };
42
+ return result;
43
+ });
44
+ (0, _defineProperty2.default)(this, "getElementRatio", function (mappedValues) {
45
+ var r = mappedValues.r,
46
+ l = mappedValues.l,
47
+ b = mappedValues.b,
48
+ t = mappedValues.t;
49
+ return (r - l) * (b - t) / (_this.arraySize.w * _this.arraySize.h);
50
+ });
51
+ this.viewport = viewport;
52
+ this.revisions = revisions;
53
+ if (arraySize) {
54
+ this.arraySize = arraySize;
55
+ }
56
+ this.heatmaps = new Array(revisions.length);
57
+ this.componentsLogs = new Array(revisions.length);
58
+ this.vcRatios = new Array(revisions.length);
59
+ this.devToolsEnabled = devToolsEnabled || false;
60
+ revisions.forEach(function (_ref2, i) {
61
+ (0, _objectDestructuringEmpty2.default)(_ref2);
62
+ _this.heatmaps[i] = _this.getCleanHeatmap();
63
+ _this.componentsLogs[i] = {};
64
+ _this.vcRatios[i] = {};
65
+ });
66
+ }
67
+ return (0, _createClass2.default)(MultiRevisionHeatmap, [{
68
+ key: "handleUpdate",
69
+ value: function handleUpdate(_ref3) {
70
+ var _this2 = this;
71
+ var time = _ref3.time,
72
+ type = _ref3.type,
73
+ classification = _ref3.classification,
74
+ intersectionRect = _ref3.intersectionRect,
75
+ element = _ref3.element,
76
+ targetName = _ref3.targetName,
77
+ ignoreReason = _ref3.ignoreReason,
78
+ onError = _ref3.onError;
79
+ var mappedValues = this.mapPixelsToHeatmap(intersectionRect.left, intersectionRect.top, intersectionRect.width, intersectionRect.height);
80
+ var result = this.applyChangesToHeatMap(mappedValues, time, classification);
81
+ if (result !== true) {
82
+ onError(result);
83
+ }
84
+ var componentRatio = this.getElementRatio(mappedValues);
85
+ this.revisions.forEach(function (_, i) {
86
+ if (classification[i]) {
87
+ _this2.vcRatios[i][targetName] = componentRatio;
88
+ }
89
+ if (!_this2.componentsLogs[i][time]) {
90
+ _this2.componentsLogs[i][time] = [];
91
+ }
92
+ _this2.componentsLogs[i][time].push({
93
+ __debug__element: _this2.devToolsEnabled ? new WeakRef(element) : null,
94
+ intersectionRect: intersectionRect,
95
+ targetName: targetName,
96
+ ignoreReason: ignoreReason
97
+ });
98
+ });
99
+ }
100
+ }, {
101
+ key: "getData",
102
+ value: function getData() {
103
+ return {
104
+ heatmaps: this.heatmaps
105
+ };
106
+ }
107
+ }, {
108
+ key: "getPayloadShapedData",
109
+ value: function getPayloadShapedData(args) {
110
+ var result = this.processData(args);
111
+ var payload = this.revisions.map(function (rev, i) {
112
+ var vcDetails = {};
113
+ args.VCParts.forEach(function (VCPart) {
114
+ vcDetails[VCPart] = {
115
+ t: result[i].VC[VCPart] || 0,
116
+ e: Array.from(result[i].VCBox[VCPart] || [])
117
+ };
118
+ });
119
+ return {
120
+ revision: rev.name,
121
+ vcDetails: vcDetails,
122
+ clean: args.clean,
123
+ 'metric:vc90': null // will be set or not in the payload generator
124
+ };
125
+ });
126
+ return payload;
127
+ }
128
+ }, {
129
+ key: "processData",
130
+ value: function processData(_ref4) {
131
+ var _this3 = this;
132
+ var VCParts = _ref4.VCParts,
133
+ VCCalculationMethods = _ref4.VCCalculationMethods,
134
+ _ref4$ssr = _ref4.ssr,
135
+ ssr = _ref4$ssr === void 0 ? UNUSED_SECTOR : _ref4$ssr;
136
+ return this.heatmaps.map(function (heatmap, i) {
137
+ var lastUpdate = {};
138
+ var totalPainted = 0;
139
+ var componentsLog = _this3.componentsLogs[i];
140
+ if (ssr !== UNUSED_SECTOR) {
141
+ var _window$document;
142
+ var element = {
143
+ __debug__element: new WeakRef((_window$document = window.document) === null || _window$document === void 0 ? void 0 : _window$document.body),
144
+ intersectionRect: {
145
+ top: 0,
146
+ left: 0,
147
+ right: 0,
148
+ bottom: 0,
149
+ x: 0,
150
+ y: 0,
151
+ width: _this3.viewport.w,
152
+ height: _this3.viewport.h,
153
+ toJSON: function toJSON() {
154
+ return {};
155
+ }
156
+ },
157
+ targetName: 'SSR'
158
+ };
159
+ if (!componentsLog[ssr]) {
160
+ componentsLog[ssr] = [];
161
+ }
162
+ componentsLog[ssr].push(element);
163
+ }
164
+ for (var _i = 0; _i < heatmap.length; _i++) {
165
+ var rounded = Math.floor(heatmap[_i] === UNUSED_SECTOR && ssr !== UNUSED_SECTOR ? ssr : heatmap[_i]);
166
+ totalPainted += rounded !== UNUSED_SECTOR ? 1 : 0;
167
+ if (rounded !== UNUSED_SECTOR) {
168
+ lastUpdate[rounded] = lastUpdate[rounded] ? lastUpdate[rounded] + 1 : 1;
169
+ }
170
+ }
171
+ var entries = Object.entries(lastUpdate).map(function (a) {
172
+ return [parseInt(a[0], 10), a[1]];
173
+ }).sort(function (a, b) {
174
+ return a[0] > b[0] ? 1 : -1;
175
+ });
176
+ var _VCCalculationMethods = VCCalculationMethods[i]({
177
+ VCParts: VCParts,
178
+ componentsLog: componentsLog,
179
+ entries: entries,
180
+ totalPainted: totalPainted
181
+ }),
182
+ VC = _VCCalculationMethods.VC,
183
+ VCBox = _VCCalculationMethods.VCBox;
184
+ var VCEntries = entries.reduce(function (acc, _ref5, i) {
185
+ var _acc$abs, _componentsLog$timest;
186
+ var _ref6 = (0, _slicedToArray2.default)(_ref5, 2),
187
+ timestamp = _ref6[0],
188
+ entryPainted = _ref6[1];
189
+ var currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
190
+ var currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
191
+ var logEntry = (_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.map(function (v) {
192
+ return v.targetName;
193
+ });
194
+ acc.abs.push([timestamp, currentlyPainted]);
195
+ acc.rel.push({
196
+ time: timestamp,
197
+ vc: currentlyPaintedRatio,
198
+ elements: logEntry
199
+ });
200
+ return acc;
201
+ }, {
202
+ abs: [],
203
+ rel: []
204
+ });
205
+ return {
206
+ VC: VC,
207
+ VCBox: VCBox,
208
+ VCEntries: VCEntries,
209
+ totalPainted: totalPainted
210
+ };
211
+ });
212
+ }
213
+ }, {
214
+ key: "applyChangesToHeatMap",
215
+ value: function applyChangesToHeatMap(a, time, classification) {
216
+ var l = a.l,
217
+ t = a.t,
218
+ r = a.r,
219
+ b = a.b;
220
+ var size = classification.length;
221
+ for (var row = t; row < b; row++) {
222
+ if (this.heatmaps[0][row] === undefined) {
223
+ try {
224
+ return {
225
+ error: "index - ".concat(row),
226
+ time: time
227
+ };
228
+ } catch (e) {
229
+ return {
230
+ error: 'row error',
231
+ time: time
232
+ };
233
+ }
234
+ } else {
235
+ for (var heatmapIndex = 0; heatmapIndex < size; heatmapIndex++) {
236
+ if (classification[heatmapIndex]) {
237
+ this.heatmaps[heatmapIndex].fill(time, this.getIndex(l, row), this.getIndex(r, row));
238
+ }
239
+ }
240
+ }
241
+ }
242
+ return true;
243
+ }
244
+ }, {
245
+ key: "getIndex",
246
+ value: function getIndex(x, y) {
247
+ return x + this.arraySize.w * y;
248
+ }
249
+ }, {
250
+ key: "getCleanHeatmap",
251
+ value: function getCleanHeatmap() {
252
+ return new Uint32Array(this.arraySize.w * this.arraySize.h);
253
+ }
254
+ }], [{
255
+ key: "makeVCReturnObj",
256
+ value: function makeVCReturnObj(VCParts) {
257
+ var vc = {};
258
+ VCParts.forEach(function (v) {
259
+ vc[v] = null;
260
+ });
261
+ return vc;
262
+ }
263
+ }]);
264
+ }();