@atlaskit/react-ufo 3.4.1 → 3.4.2

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 (40) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/additional-payload/utils/lighthouse-metrics/utils/observer/index.js +8 -2
  3. package/dist/cjs/create-payload/index.js +136 -76
  4. package/dist/cjs/segment/segment.js +29 -4
  5. package/dist/cjs/vc/vc-observer/index.js +71 -46
  6. package/dist/cjs/vc/vc-observer/observers/ssr-placeholders/index.js +18 -11
  7. package/dist/cjs/vc/vc-observer-new/get-element-name.js +52 -64
  8. package/dist/cjs/vc/vc-observer-new/get-unique-element-name.js +80 -0
  9. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +7 -2
  10. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +6 -4
  11. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +17 -9
  12. package/dist/es2019/additional-payload/utils/lighthouse-metrics/utils/observer/index.js +8 -2
  13. package/dist/es2019/create-payload/index.js +39 -3
  14. package/dist/es2019/segment/segment.js +29 -3
  15. package/dist/es2019/vc/vc-observer/index.js +39 -12
  16. package/dist/es2019/vc/vc-observer/observers/ssr-placeholders/index.js +14 -7
  17. package/dist/es2019/vc/vc-observer-new/get-element-name.js +51 -64
  18. package/dist/es2019/vc/vc-observer-new/get-unique-element-name.js +74 -0
  19. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +6 -1
  20. package/dist/es2019/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +6 -4
  21. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +17 -9
  22. package/dist/esm/additional-payload/utils/lighthouse-metrics/utils/observer/index.js +8 -2
  23. package/dist/esm/create-payload/index.js +136 -76
  24. package/dist/esm/segment/segment.js +29 -4
  25. package/dist/esm/vc/vc-observer/index.js +71 -46
  26. package/dist/esm/vc/vc-observer/observers/ssr-placeholders/index.js +18 -11
  27. package/dist/esm/vc/vc-observer-new/get-element-name.js +52 -64
  28. package/dist/esm/vc/vc-observer-new/get-unique-element-name.js +74 -0
  29. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +6 -1
  30. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/canvas-pixel.js +6 -4
  31. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +17 -9
  32. package/dist/types/interaction-context/index.d.ts +2 -0
  33. package/dist/types/segment/segment.d.ts +2 -1
  34. package/dist/types/vc/vc-observer-new/get-unique-element-name.d.ts +8 -0
  35. package/dist/types/vc/vc-observer-new/metric-calculator/fy25_03/index.d.ts +1 -0
  36. package/dist/types-ts4.5/interaction-context/index.d.ts +2 -0
  37. package/dist/types-ts4.5/segment/segment.d.ts +2 -1
  38. package/dist/types-ts4.5/vc/vc-observer-new/get-unique-element-name.d.ts +8 -0
  39. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/fy25_03/index.d.ts +1 -0
  40. package/package.json +7 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 3.4.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#126657](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/126657)
8
+ [`801d3cfb7f8d0`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/801d3cfb7f8d0) -
9
+ Added LCP to page load events
10
+
3
11
  ## 3.4.1
4
12
 
5
13
  ### Patch Changes
@@ -8,6 +8,10 @@ var _const = require("../../const");
8
8
  var _buffer = require("../buffer");
9
9
  var pe = null;
10
10
  var getObserver = function getObserver() {
11
+ if (typeof PerformanceObserver !== 'function') {
12
+ // Only instantiate the IntersectionObserver if it's supported
13
+ return null;
14
+ }
11
15
  if (pe !== null) {
12
16
  return pe;
13
17
  }
@@ -24,13 +28,15 @@ var getObserver = function getObserver() {
24
28
  return pe;
25
29
  };
26
30
  var startLSObserver = exports.startLSObserver = function startLSObserver() {
27
- getObserver().observe({
31
+ var _getObserver;
32
+ (_getObserver = getObserver()) === null || _getObserver === void 0 || _getObserver.observe({
28
33
  type: _const.PerformanceObserverEntryTypes.LayoutShift,
29
34
  buffered: true
30
35
  });
31
36
  };
32
37
  var startLTObserver = exports.startLTObserver = function startLTObserver() {
33
- getObserver().observe({
38
+ var _getObserver2;
39
+ (_getObserver2 = getObserver()) === null || _getObserver2 === void 0 || _getObserver2.observe({
34
40
  type: _const.PerformanceObserverEntryTypes.LongTask,
35
41
  buffered: true
36
42
  });
@@ -7,12 +7,12 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.createExperimentalMetricsPayload = createExperimentalMetricsPayload;
9
9
  exports.createPayloads = createPayloads;
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
10
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
12
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
14
13
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
16
16
  var _bowserUltralight = _interopRequireDefault(require("bowser-ultralight"));
17
17
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
18
  var _additionalPayload = require("../additional-payload");
@@ -158,21 +158,80 @@ var getSSRSuccess = function getSSRSuccess(type) {
158
158
  var getSSRFeatureFlags = function getSSRFeatureFlags(type) {
159
159
  return type === 'page_load' ? ssr.getSSRFeatureFlags() : undefined;
160
160
  };
161
- var getPaintMetrics = function getPaintMetrics(type) {
162
- if (type !== 'page_load') {
163
- return {};
164
- }
165
- var metrics = {};
166
- performance.getEntriesByType('paint').forEach(function (entry) {
167
- if (entry.name === 'first-paint') {
168
- metrics['metric:fp'] = Math.round(entry.startTime);
169
- }
170
- if (entry.name === 'first-contentful-paint') {
171
- metrics['metric:fcp'] = Math.round(entry.startTime);
172
- }
161
+ var getLCP = function getLCP(end) {
162
+ return new Promise(function (resolve) {
163
+ var observer;
164
+ var timeout = setTimeout(function () {
165
+ var _observer;
166
+ (_observer = observer) === null || _observer === void 0 || _observer.disconnect();
167
+ resolve(null);
168
+ }, 200);
169
+ observer = new PerformanceObserver(function (list) {
170
+ var entries = Array.from(list.getEntries());
171
+ var lastEntry = entries.reduce(function (agg, entry) {
172
+ // Use the latest LCP candidate before TTAI
173
+ if (entry.startTime <= end && (agg === null || agg.startTime < entry.startTime)) {
174
+ return entry;
175
+ }
176
+ return agg;
177
+ }, null);
178
+ clearTimeout(timeout);
179
+ if (!lastEntry || lastEntry === null) {
180
+ resolve(null);
181
+ } else {
182
+ resolve(lastEntry.startTime);
183
+ }
184
+ });
185
+ observer.observe({
186
+ type: "largest-contentful-paint",
187
+ buffered: true
188
+ });
173
189
  });
174
- return metrics;
175
190
  };
191
+ var getPaintMetrics = /*#__PURE__*/function () {
192
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(type, end) {
193
+ var metrics, lcp;
194
+ return _regenerator.default.wrap(function _callee$(_context) {
195
+ while (1) switch (_context.prev = _context.next) {
196
+ case 0:
197
+ if (!(type !== 'page_load')) {
198
+ _context.next = 2;
199
+ break;
200
+ }
201
+ return _context.abrupt("return", {});
202
+ case 2:
203
+ metrics = {};
204
+ performance.getEntriesByType('paint').forEach(function (entry) {
205
+ if (entry.name === 'first-paint') {
206
+ metrics['metric:fp'] = Math.round(entry.startTime);
207
+ }
208
+ if (entry.name === 'first-contentful-paint') {
209
+ metrics['metric:fcp'] = Math.round(entry.startTime);
210
+ }
211
+ });
212
+ if (!(0, _platformFeatureFlags.fg)('ufo_lcp')) {
213
+ _context.next = 9;
214
+ break;
215
+ }
216
+ _context.next = 7;
217
+ return getLCP(end);
218
+ case 7:
219
+ lcp = _context.sent;
220
+ if (lcp) {
221
+ metrics['metric:lcp'] = Math.round(lcp);
222
+ }
223
+ case 9:
224
+ return _context.abrupt("return", metrics);
225
+ case 10:
226
+ case "end":
227
+ return _context.stop();
228
+ }
229
+ }, _callee);
230
+ }));
231
+ return function getPaintMetrics(_x, _x2) {
232
+ return _ref2.apply(this, arguments);
233
+ };
234
+ }();
176
235
  var getTTAI = function getTTAI(interaction) {
177
236
  var start = interaction.start,
178
237
  end = interaction.end;
@@ -329,10 +388,10 @@ var getTracingContextData = function getTracingContextData(interaction) {
329
388
  function optimizeCustomData(interaction) {
330
389
  var customData = interaction.customData,
331
390
  legacyMetrics = interaction.legacyMetrics;
332
- var customDataMap = customData.reduce(function (result, _ref2) {
391
+ var customDataMap = customData.reduce(function (result, _ref3) {
333
392
  var _result$get$data, _result$get;
334
- var labelStack = _ref2.labelStack,
335
- data = _ref2.data;
393
+ var labelStack = _ref3.labelStack,
394
+ data = _ref3.data;
336
395
  var label = (0, _utils.stringifyLabelStackFully)(labelStack);
337
396
  var value = (_result$get$data = (_result$get = result.get(label)) === null || _result$get === void 0 ? void 0 : _result$get.data) !== null && _result$get$data !== void 0 ? _result$get$data : {};
338
397
  result.set(label, {
@@ -364,12 +423,12 @@ function optimizeCustomData(interaction) {
364
423
  return (0, _toConsumableArray2.default)(customDataMap.values());
365
424
  }
366
425
  function optimizeReactProfilerTimings(reactProfilerTimings, interactionStart, reactUFOVersion) {
367
- var reactProfilerTimingsMap = reactProfilerTimings.reduce(function (result, _ref3) {
368
- var labelStack = _ref3.labelStack,
369
- startTime = _ref3.startTime,
370
- commitTime = _ref3.commitTime,
371
- actualDuration = _ref3.actualDuration,
372
- type = _ref3.type;
426
+ var reactProfilerTimingsMap = reactProfilerTimings.reduce(function (result, _ref4) {
427
+ var labelStack = _ref4.labelStack,
428
+ startTime = _ref4.startTime,
429
+ commitTime = _ref4.commitTime,
430
+ actualDuration = _ref4.actualDuration,
431
+ type = _ref4.type;
373
432
  if (labelStack && startTime >= interactionStart) {
374
433
  var label = (0, _utils.stringifyLabelStackFully)(labelStack);
375
434
  var start = Math.round(startTime);
@@ -515,10 +574,10 @@ function optimizeCustomTimings(customTimings, interactionStart) {
515
574
  }, []);
516
575
  }
517
576
  function optimizeMarks(marks, reactUFOVersion) {
518
- return marks.map(function (_ref4) {
519
- var labelStack = _ref4.labelStack,
520
- time = _ref4.time,
521
- others = (0, _objectWithoutProperties2.default)(_ref4, _excluded);
577
+ return marks.map(function (_ref5) {
578
+ var labelStack = _ref5.labelStack,
579
+ time = _ref5.time,
580
+ others = (0, _objectWithoutProperties2.default)(_ref5, _excluded);
522
581
  return _objectSpread(_objectSpread({}, others), {}, {
523
582
  labelStack: labelStack && (0, _utils.optimizeLabelStack)(labelStack, reactUFOVersion),
524
583
  time: Math.round(time)
@@ -526,10 +585,10 @@ function optimizeMarks(marks, reactUFOVersion) {
526
585
  });
527
586
  }
528
587
  function optimizeApdex(apdex, reactUFOVersion) {
529
- return apdex.map(function (_ref5) {
530
- var stopTime = _ref5.stopTime,
531
- labelStack = _ref5.labelStack,
532
- others = (0, _objectWithoutProperties2.default)(_ref5, _excluded2);
588
+ return apdex.map(function (_ref6) {
589
+ var stopTime = _ref6.stopTime,
590
+ labelStack = _ref6.labelStack,
591
+ others = (0, _objectWithoutProperties2.default)(_ref6, _excluded2);
533
592
  return _objectSpread(_objectSpread({}, others), {}, {
534
593
  stopTime: Math.round(stopTime)
535
594
  }, labelStack ? {
@@ -643,20 +702,20 @@ function getErrorCounts(interaction) {
643
702
  'ufo:errors:count': interaction.errors.length
644
703
  };
645
704
  }
646
- function createInteractionMetricsPayload(_x, _x2, _x3) {
705
+ function createInteractionMetricsPayload(_x3, _x4, _x5) {
647
706
  return _createInteractionMetricsPayload.apply(this, arguments);
648
707
  }
649
708
  function _createInteractionMetricsPayload() {
650
- _createInteractionMetricsPayload = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(interaction, interactionId, experimental) {
709
+ _createInteractionMetricsPayload = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(interaction, interactionId, experimental) {
651
710
  var _window$location, _config$additionalPay;
652
- var interactionPayloadStart, config, end, start, ufoName, knownSegments, rate, type, abortReason, routeName, featureFlags, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, pageVisibilityAtTTI, pageVisibilityAtTTAI, segments, segmentTree, isDetailedPayload, isPageLoad, calculatePageVisibilityFromTheStartOfPageLoad, moreAccuratePageVisibilityAtTTI, moreAccuratePageVisibilityAtTTAI, labelStack, getInitialPageLoadSSRMetrics, pageLoadInteractionMetrics, getDetailedInteractionMetrics, getPageLoadDetailedInteractionMetrics, newUFOName, resourceTimings, _yield$Promise$all, _yield$Promise$all2, vcMetrics, experimentalMetrics, payload;
653
- return _regenerator.default.wrap(function _callee$(_context) {
654
- while (1) switch (_context.prev = _context.next) {
711
+ var interactionPayloadStart, config, end, start, ufoName, knownSegments, rate, type, abortReason, routeName, featureFlags, previousInteractionName, isPreviousInteractionAborted, abortedByInteractionName, pageVisibilityAtTTI, pageVisibilityAtTTAI, segments, segmentTree, isDetailedPayload, isPageLoad, calculatePageVisibilityFromTheStartOfPageLoad, moreAccuratePageVisibilityAtTTI, moreAccuratePageVisibilityAtTTAI, labelStack, getInitialPageLoadSSRMetrics, pageLoadInteractionMetrics, getDetailedInteractionMetrics, getPageLoadDetailedInteractionMetrics, newUFOName, resourceTimings, _yield$Promise$all, _yield$Promise$all2, vcMetrics, experimentalMetrics, paintMetrics, payload;
712
+ return _regenerator.default.wrap(function _callee2$(_context2) {
713
+ while (1) switch (_context2.prev = _context2.next) {
655
714
  case 0:
656
715
  interactionPayloadStart = performance.now();
657
716
  config = (0, _config.getConfig)();
658
717
  if (config) {
659
- _context.next = 4;
718
+ _context2.next = 4;
660
719
  break;
661
720
  }
662
721
  throw Error('UFO Configuration not provided');
@@ -699,9 +758,9 @@ function _createInteractionMetricsPayload() {
699
758
  var spans = [].concat((0, _toConsumableArray2.default)(interaction.spans), (0, _toConsumableArray2.default)(_interactionMetrics.interactionSpans));
700
759
  _interactionMetrics.interactionSpans.length = 0;
701
760
  return {
702
- errors: interaction.errors.map(function (_ref6) {
703
- var labelStack = _ref6.labelStack,
704
- others = (0, _objectWithoutProperties2.default)(_ref6, _excluded3);
761
+ errors: interaction.errors.map(function (_ref7) {
762
+ var labelStack = _ref7.labelStack,
763
+ others = (0, _objectWithoutProperties2.default)(_ref7, _excluded3);
705
764
  return _objectSpread(_objectSpread({}, others), {}, {
706
765
  labelStack: labelStack && (0, _utils.optimizeLabelStack)(labelStack, (0, _constants.getReactUFOVersion)(interaction.type))
707
766
  });
@@ -734,13 +793,14 @@ function _createInteractionMetricsPayload() {
734
793
  }
735
794
  newUFOName = (0, _utils.sanitizeUfoName)(ufoName);
736
795
  resourceTimings = getResourceTimings(start, end);
737
- _context.next = 24;
738
- return Promise.all([(0, _getVcMetrics.default)(interaction), experimental ? (0, _createExperimentalInteractionMetricsPayload.getExperimentalVCMetrics)(interaction) : Promise.resolve(undefined)]);
796
+ _context2.next = 24;
797
+ return Promise.all([(0, _getVcMetrics.default)(interaction), experimental ? (0, _createExperimentalInteractionMetricsPayload.getExperimentalVCMetrics)(interaction) : Promise.resolve(undefined), getPaintMetrics(type, end)]);
739
798
  case 24:
740
- _yield$Promise$all = _context.sent;
741
- _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 2);
799
+ _yield$Promise$all = _context2.sent;
800
+ _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 3);
742
801
  vcMetrics = _yield$Promise$all2[0];
743
802
  experimentalMetrics = _yield$Promise$all2[1];
803
+ paintMetrics = _yield$Promise$all2[2];
744
804
  payload = {
745
805
  actionSubject: 'experience',
746
806
  action: 'measured',
@@ -761,7 +821,7 @@ function _createInteractionMetricsPayload() {
761
821
  'event:region': config.region || 'unknown',
762
822
  'experience:key': experimental ? 'custom.experimental-interaction-metrics' : 'custom.interaction-metrics',
763
823
  'experience:name': newUFOName
764
- }, getBrowserMetadata()), getSSRProperties(type)), getAssetsMetrics(interaction, pageLoadInteractionMetrics === null || pageLoadInteractionMetrics === void 0 ? void 0 : pageLoadInteractionMetrics.SSRDoneTime)), getPPSMetrics(interaction)), getPaintMetrics(type)), getNavigationMetrics(type)), vcMetrics), experimentalMetrics), (_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)), getTracingContextData(interaction)), getStylesheetMetrics()), getErrorCounts(interaction)), {}, {
824
+ }, getBrowserMetadata()), getSSRProperties(type)), getAssetsMetrics(interaction, pageLoadInteractionMetrics === null || pageLoadInteractionMetrics === void 0 ? void 0 : pageLoadInteractionMetrics.SSRDoneTime)), getPPSMetrics(interaction)), paintMetrics), getNavigationMetrics(type)), vcMetrics), experimentalMetrics), (_config$additionalPay = config.additionalPayloadData) === null || _config$additionalPay === void 0 ? void 0 : _config$additionalPay.call(config, interaction)), getTracingContextData(interaction)), getStylesheetMetrics()), getErrorCounts(interaction)), {}, {
765
825
  interactionMetrics: _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
766
826
  namePrefix: config.namePrefix || '',
767
827
  segmentPrefix: config.segmentPrefix || '',
@@ -783,9 +843,9 @@ function _createInteractionMetricsPayload() {
783
843
  apdex: optimizeApdex(interaction.apdex, (0, _constants.getReactUFOVersion)(interaction.type)),
784
844
  end: Math.round(end),
785
845
  start: Math.round(start),
786
- segments: (0, _constants.getReactUFOVersion)(interaction.type) === '2.0.0' ? segmentTree : segments.map(function (_ref7) {
787
- var labelStack = _ref7.labelStack,
788
- others = (0, _objectWithoutProperties2.default)(_ref7, _excluded4);
846
+ segments: (0, _constants.getReactUFOVersion)(interaction.type) === '2.0.0' ? segmentTree : segments.map(function (_ref8) {
847
+ var labelStack = _ref8.labelStack,
848
+ others = (0, _objectWithoutProperties2.default)(_ref8, _excluded4);
789
849
  return _objectSpread(_objectSpread({}, others), {}, {
790
850
  labelStack: (0, _utils.optimizeLabelStack)(labelStack, (0, _constants.getReactUFOVersion)(interaction.type))
791
851
  });
@@ -806,53 +866,53 @@ function _createInteractionMetricsPayload() {
806
866
  expTTAI = undefined;
807
867
  }
808
868
  payload.attributes.properties['event:sizeInKb'] = getPayloadSize(payload.attributes.properties);
809
- return _context.abrupt("return", payload);
810
- case 32:
869
+ return _context2.abrupt("return", payload);
870
+ case 33:
811
871
  case "end":
812
- return _context.stop();
872
+ return _context2.stop();
813
873
  }
814
- }, _callee);
874
+ }, _callee2);
815
875
  }));
816
876
  return _createInteractionMetricsPayload.apply(this, arguments);
817
877
  }
818
- function createPayloads(_x4, _x5) {
878
+ function createPayloads(_x6, _x7) {
819
879
  return _createPayloads.apply(this, arguments);
820
880
  }
821
881
  function _createPayloads() {
822
- _createPayloads = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(interactionId, interaction) {
882
+ _createPayloads = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(interactionId, interaction) {
823
883
  var ufoNameOverride, modifiedInteraction, interactionMetricsPayload;
824
- return _regenerator.default.wrap(function _callee2$(_context2) {
825
- while (1) switch (_context2.prev = _context2.next) {
884
+ return _regenerator.default.wrap(function _callee3$(_context3) {
885
+ while (1) switch (_context3.prev = _context3.next) {
826
886
  case 0:
827
887
  ufoNameOverride = getUfoNameOverride(interaction);
828
888
  modifiedInteraction = _objectSpread(_objectSpread({}, interaction), {}, {
829
889
  ufoName: ufoNameOverride
830
890
  });
831
- _context2.next = 4;
891
+ _context3.next = 4;
832
892
  return createInteractionMetricsPayload(modifiedInteraction, interactionId);
833
893
  case 4:
834
- interactionMetricsPayload = _context2.sent;
835
- return _context2.abrupt("return", [interactionMetricsPayload]);
894
+ interactionMetricsPayload = _context3.sent;
895
+ return _context3.abrupt("return", [interactionMetricsPayload]);
836
896
  case 6:
837
897
  case "end":
838
- return _context2.stop();
898
+ return _context3.stop();
839
899
  }
840
- }, _callee2);
900
+ }, _callee3);
841
901
  }));
842
902
  return _createPayloads.apply(this, arguments);
843
903
  }
844
- function createExperimentalMetricsPayload(_x6, _x7) {
904
+ function createExperimentalMetricsPayload(_x8, _x9) {
845
905
  return _createExperimentalMetricsPayload.apply(this, arguments);
846
906
  }
847
907
  function _createExperimentalMetricsPayload() {
848
- _createExperimentalMetricsPayload = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(interactionId, interaction) {
908
+ _createExperimentalMetricsPayload = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(interactionId, interaction) {
849
909
  var config, ufoName, rate, pageVisibilityState, result;
850
- return _regenerator.default.wrap(function _callee3$(_context3) {
851
- while (1) switch (_context3.prev = _context3.next) {
910
+ return _regenerator.default.wrap(function _callee4$(_context4) {
911
+ while (1) switch (_context4.prev = _context4.next) {
852
912
  case 0:
853
913
  config = (0, _config.getConfig)();
854
914
  if (config) {
855
- _context3.next = 3;
915
+ _context4.next = 3;
856
916
  break;
857
917
  }
858
918
  throw Error('UFO Configuration not provided');
@@ -860,28 +920,28 @@ function _createExperimentalMetricsPayload() {
860
920
  ufoName = (0, _utils.sanitizeUfoName)(interaction.ufoName);
861
921
  rate = (0, _config.getExperimentalInteractionRate)(ufoName, interaction.type);
862
922
  if ((0, _coinflip.default)(rate)) {
863
- _context3.next = 7;
923
+ _context4.next = 7;
864
924
  break;
865
925
  }
866
- return _context3.abrupt("return", null);
926
+ return _context4.abrupt("return", null);
867
927
  case 7:
868
928
  pageVisibilityState = (0, _hiddenTiming.getPageVisibilityState)(interaction.start, interaction.end);
869
929
  if (!(pageVisibilityState !== 'visible')) {
870
- _context3.next = 10;
930
+ _context4.next = 10;
871
931
  break;
872
932
  }
873
- return _context3.abrupt("return", null);
933
+ return _context4.abrupt("return", null);
874
934
  case 10:
875
- _context3.next = 12;
935
+ _context4.next = 12;
876
936
  return createInteractionMetricsPayload(interaction, interactionId, true);
877
937
  case 12:
878
- result = _context3.sent;
879
- return _context3.abrupt("return", result);
938
+ result = _context4.sent;
939
+ return _context4.abrupt("return", result);
880
940
  case 14:
881
941
  case "end":
882
- return _context3.stop();
942
+ return _context4.stop();
883
943
  }
884
- }, _callee3);
944
+ }, _callee4);
885
945
  }));
886
946
  return _createExperimentalMetricsPayload.apply(this, arguments);
887
947
  }
@@ -35,16 +35,40 @@ var AsyncSegmentHighlight = /*#__PURE__*/(0, _react.lazy)(function () {
35
35
  };
36
36
  });
37
37
  });
38
+ var noopIdMap = new Map();
38
39
 
39
40
  /** A portion of the page we apply measurement to */
40
41
  function UFOSegment(_ref) {
41
42
  var _getConfig2;
42
43
  var segmentName = _ref.name,
43
- children = _ref.children;
44
+ children = _ref.children,
45
+ _ref$mode = _ref.mode,
46
+ mode = _ref$mode === void 0 ? 'single' : _ref$mode;
44
47
  var parentContext = (0, _react.useContext)(_interactionContext.default);
48
+ var segmentIdMap = (0, _react.useMemo)(function () {
49
+ if (!(0, _platformFeatureFlags.fg)('platform_ufo_segment_list_mode')) {
50
+ // just in case we cause rerender issues, use noop map
51
+ return noopIdMap;
52
+ }
53
+ if (!(parentContext !== null && parentContext !== void 0 && parentContext.segmentIdMap)) {
54
+ return new Map();
55
+ }
56
+ return parentContext.segmentIdMap;
57
+ }, [parentContext]);
45
58
  var segmentId = (0, _react.useMemo)(function () {
46
- return (0, _shortId.default)();
47
- }, []);
59
+ if (!(0, _platformFeatureFlags.fg)('platform_ufo_segment_list_mode')) {
60
+ return (0, _shortId.default)();
61
+ }
62
+ if (mode === 'single') {
63
+ return (0, _shortId.default)();
64
+ }
65
+ if (segmentIdMap.has(segmentName)) {
66
+ return segmentIdMap.get(segmentName);
67
+ }
68
+ var newSegmentId = (0, _shortId.default)();
69
+ segmentIdMap.set(segmentName, newSegmentId);
70
+ return newSegmentId;
71
+ }, [mode, segmentName, segmentIdMap]);
48
72
  var labelStack = (0, _react.useMemo)(function () {
49
73
  return parentContext !== null && parentContext !== void 0 && parentContext.labelStack ? [].concat((0, _toConsumableArray2.default)(parentContext.labelStack), [{
50
74
  name: segmentName,
@@ -132,6 +156,7 @@ function UFOSegment(_ref) {
132
156
  }
133
157
  return {
134
158
  labelStack: labelStack,
159
+ segmentIdMap: segmentIdMap,
135
160
  hold: function hold() {
136
161
  var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'unknown';
137
162
  return this._internalHold(this.labelStack, name);
@@ -232,7 +257,7 @@ function UFOSegment(_ref) {
232
257
  _internalHoldByID: _internalHoldByID,
233
258
  complete: complete
234
259
  };
235
- }, [parentContext, labelStack, interactionId]);
260
+ }, [parentContext, labelStack, segmentIdMap, interactionId]);
236
261
  var hasMounted = (0, _react.useRef)(false);
237
262
  var onRender = (0, _react.useCallback)(function (_id, phase, actualDuration, baseDuration, startTime, commitTime) {
238
263
  var _getConfig;