@atlaskit/emoji 64.3.0 → 64.4.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 (40) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/components/common/RecordSelectionDefault.js +8 -2
  3. package/dist/cjs/components/common/UploadEmoji.js +8 -0
  4. package/dist/cjs/components/picker/EmojiPicker.js +13 -2
  5. package/dist/cjs/components/picker/EmojiPickerComponent.js +27 -2
  6. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +17 -0
  7. package/dist/cjs/components/uploader/EmojiUploadComponent.js +13 -0
  8. package/dist/cjs/index.js +6 -0
  9. package/dist/cjs/util/analytics/analytics.js +11 -41
  10. package/dist/cjs/util/analytics/index.js +16 -14
  11. package/dist/cjs/util/analytics/ufoExperiences.js +46 -0
  12. package/dist/cjs/version.json +1 -1
  13. package/dist/es2019/components/common/RecordSelectionDefault.js +9 -2
  14. package/dist/es2019/components/common/UploadEmoji.js +4 -0
  15. package/dist/es2019/components/picker/EmojiPicker.js +9 -2
  16. package/dist/es2019/components/picker/EmojiPickerComponent.js +22 -3
  17. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +13 -1
  18. package/dist/es2019/components/uploader/EmojiUploadComponent.js +9 -0
  19. package/dist/es2019/index.js +2 -2
  20. package/dist/es2019/util/analytics/analytics.js +16 -37
  21. package/dist/es2019/util/analytics/index.js +2 -1
  22. package/dist/es2019/util/analytics/ufoExperiences.js +34 -0
  23. package/dist/es2019/version.json +1 -1
  24. package/dist/esm/components/common/RecordSelectionDefault.js +6 -3
  25. package/dist/esm/components/common/UploadEmoji.js +4 -0
  26. package/dist/esm/components/picker/EmojiPicker.js +8 -2
  27. package/dist/esm/components/picker/EmojiPickerComponent.js +23 -3
  28. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +13 -1
  29. package/dist/esm/components/uploader/EmojiUploadComponent.js +10 -0
  30. package/dist/esm/index.js +2 -2
  31. package/dist/esm/util/analytics/analytics.js +8 -33
  32. package/dist/esm/util/analytics/index.js +2 -1
  33. package/dist/esm/util/analytics/ufoExperiences.js +34 -0
  34. package/dist/esm/version.json +1 -1
  35. package/dist/types/components/uploader/EmojiUploadComponent.d.ts +1 -0
  36. package/dist/types/index.d.ts +2 -2
  37. package/dist/types/util/analytics/analytics.d.ts +3 -7
  38. package/dist/types/util/analytics/index.d.ts +3 -2
  39. package/dist/types/util/analytics/ufoExperiences.d.ts +12 -0
  40. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 64.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`39031597fa1`](https://bitbucket.org/atlassian/atlassian-frontend/commits/39031597fa1) - added more UFO experiences support
8
+
3
9
  ## 64.3.0
4
10
 
5
11
  ### Minor Changes
@@ -19,10 +19,16 @@ var createRecordSelectionDefault = function createRecordSelectionDefault(provide
19
19
  return function (emojiId, emoji, event) {
20
20
  try {
21
21
  if (provider.recordSelection && emoji) {
22
+ _analytics.ufoExperiences['emoji-selection-recorded'].start();
23
+
22
24
  provider.recordSelection(emoji).then(function () {
23
- return fireAnalytics && fireAnalytics(_analytics.insertionSucceeded);
25
+ fireAnalytics && fireAnalytics(_analytics.recordSucceeded);
26
+
27
+ _analytics.ufoExperiences['emoji-selection-recorded'].success();
24
28
  }).catch(function () {
25
- return fireAnalytics && fireAnalytics(_analytics.insertionFailed);
29
+ fireAnalytics && fireAnalytics(_analytics.recordFailed);
30
+
31
+ _analytics.ufoExperiences['emoji-selection-recorded'].failure();
26
32
  });
27
33
  }
28
34
  } finally {
@@ -11,16 +11,22 @@ var _analytics = require("../../util/analytics");
11
11
 
12
12
  var _i18n = require("../i18n");
13
13
 
14
+ var _ufoExperiences = require("../../util/analytics/ufoExperiences");
15
+
14
16
  var uploadEmoji = function uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics) {
15
17
  var startTime = Date.now();
16
18
  errorSetter(undefined);
17
19
 
18
20
  if ((0, _EmojiResource.supportsUploadFeature)(emojiProvider)) {
21
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].start();
22
+
19
23
  emojiProvider.uploadCustomEmoji(upload).then(function (emojiDescription) {
20
24
  fireAnalytics((0, _analytics.uploadSucceededEvent)({
21
25
  duration: Date.now() - startTime
22
26
  }));
23
27
  onSuccess(emojiDescription);
28
+
29
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].success();
24
30
  }).catch(function (err) {
25
31
  errorSetter(_i18n.messages.emojiUploadFailed); // eslint-disable-next-line no-console
26
32
 
@@ -29,6 +35,8 @@ var uploadEmoji = function uploadEmoji(upload, emojiProvider, errorSetter, onSuc
29
35
  duration: Date.now() - startTime,
30
36
  reason: _i18n.messages.emojiUploadFailed.defaultMessage
31
37
  }));
38
+
39
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].failure();
32
40
  });
33
41
  }
34
42
  };
@@ -31,12 +31,16 @@ var _core = require("@emotion/core");
31
31
 
32
32
  var _analyticsNext = require("@atlaskit/analytics-next");
33
33
 
34
+ var _analytics = require("../../util/analytics");
35
+
34
36
  var _LoadingEmojiComponent = _interopRequireDefault(require("../common/LoadingEmojiComponent"));
35
37
 
36
38
  var _EmojiPickerVirtualItems = require("./EmojiPickerVirtualItems");
37
39
 
38
40
  var _styles = require("./styles");
39
41
 
42
+ var _UfoErrorBoundary = require("../common/UfoErrorBoundary");
43
+
40
44
  var _excluded = ["emojiProvider"];
41
45
 
42
46
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
@@ -74,6 +78,9 @@ var EmojiPickerInternal = /*#__PURE__*/function (_LoadingEmojiComponen) {
74
78
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "state", {
75
79
  asyncLoadedComponent: EmojiPickerInternal.AsyncLoadedComponent
76
80
  });
81
+
82
+ _analytics.ufoExperiences['emoji-picker-opened'].start();
83
+
77
84
  return _this;
78
85
  }
79
86
 
@@ -101,6 +108,8 @@ var EmojiPickerInternal = /*#__PURE__*/function (_LoadingEmojiComponen) {
101
108
  }
102
109
  };
103
110
 
111
+ _analytics.ufoExperiences['emoji-picker-opened'].markFMP();
112
+
104
113
  return (0, _core.jsx)("div", {
105
114
  css: _styles.emojiPicker,
106
115
  ref: handlePickerRef
@@ -112,9 +121,11 @@ var EmojiPickerInternal = /*#__PURE__*/function (_LoadingEmojiComponen) {
112
121
  var _this$props = this.props,
113
122
  emojiProvider = _this$props.emojiProvider,
114
123
  otherProps = (0, _objectWithoutProperties2.default)(_this$props, _excluded);
115
- return (0, _core.jsx)(EmojiPickerComponent, (0, _extends2.default)({
124
+ return (0, _core.jsx)(_UfoErrorBoundary.UfoErrorBoundary, {
125
+ experiences: [_analytics.ufoExperiences['emoji-picker-opened']]
126
+ }, (0, _core.jsx)(EmojiPickerComponent, (0, _extends2.default)({
116
127
  emojiProvider: loadedEmojiProvider
117
- }, otherProps));
128
+ }, otherProps)));
118
129
  }
119
130
  }]);
120
131
  return EmojiPickerInternal;
@@ -146,9 +146,20 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
146
146
  });
147
147
  });
148
148
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSearch", function (query) {
149
- _this.updateEmojis(query, {
149
+ var options = {
150
150
  skinTone: _this.state.selectedTone
151
- });
151
+ };
152
+
153
+ if (query !== _this.state.query) {
154
+ _analytics.ufoExperiences['emoji-searched'].start();
155
+
156
+ _analytics.ufoExperiences['emoji-searched'].addMetadata({
157
+ queryLength: query.length,
158
+ source: 'picker'
159
+ });
160
+ }
161
+
162
+ _this.updateEmojis(query, options);
152
163
  });
153
164
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSearchResult", function (searchResults) {
154
165
  var frequentlyUsedEmoji = _this.state.frequentlyUsedEmojis || [];
@@ -161,6 +172,12 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
161
172
  queryLength: searchQuery.length,
162
173
  numMatches: emojiToRender.length
163
174
  }));
175
+
176
+ _analytics.ufoExperiences['emoji-searched'].success({
177
+ metadata: {
178
+ emojisLength: emojiToRender.length
179
+ }
180
+ });
164
181
  }
165
182
 
166
183
  _this.setStateAfterEmojiChange(searchQuery, emojiToRender, searchResults.emojis, frequentlyUsedEmoji);
@@ -385,6 +402,8 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
385
402
  value: function componentDidMount() {
386
403
  var _this2 = this;
387
404
 
405
+ _analytics.ufoExperiences['emoji-picker-opened'].success();
406
+
388
407
  var _this$props = this.props,
389
408
  emojiProvider = _this$props.emojiProvider,
390
409
  hideToneSelector = _this$props.hideToneSelector;
@@ -419,6 +438,12 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
419
438
  this.fireAnalytics((0, _analytics.closedPickerEvent)({
420
439
  duration: this.calculateElapsedTime()
421
440
  }));
441
+
442
+ _analytics.ufoExperiences['emoji-picker-opened'].abort();
443
+
444
+ _analytics.ufoExperiences['emoji-searched'].abort();
445
+
446
+ _analytics.ufoExperiences['emoji-selection-recorded'].abort();
422
447
  }
423
448
  }, {
424
449
  key: "UNSAFE_componentWillReceiveProps",
@@ -139,6 +139,12 @@ var EmojiTypeAheadComponent = /*#__PURE__*/function (_PureComponent) {
139
139
 
140
140
  _this.fireAnalyticsEvent((0, _analytics.typeaheadRenderedEvent)(Date.now() - _this.renderStartTime, query, emojis));
141
141
 
142
+ _analytics.ufoExperiences['emoji-searched'].success({
143
+ metadata: {
144
+ emojisLength: emojis.length
145
+ }
146
+ });
147
+
142
148
  (0, _logger.default)('emoji-typeahead.applyPropChanges', emojis.length, wasVisible, visible);
143
149
 
144
150
  _this.setState({
@@ -227,6 +233,10 @@ var EmojiTypeAheadComponent = /*#__PURE__*/function (_PureComponent) {
227
233
  this.fireAnalyticsEvent((0, _analytics.typeaheadCancelledEvent)(Date.now() - this.openTime, query, emojis));
228
234
  }
229
235
 
236
+ _analytics.ufoExperiences['emoji-searched'].abort();
237
+
238
+ _analytics.ufoExperiences['emoji-selection-recorded'].abort();
239
+
230
240
  this.sessionId = (0, _uuid.default)();
231
241
  this.selected = false;
232
242
  }
@@ -272,6 +282,13 @@ var EmojiTypeAheadComponent = /*#__PURE__*/function (_PureComponent) {
272
282
  options.sort = _types.SearchSort.UsageFrequency;
273
283
  }
274
284
 
285
+ _analytics.ufoExperiences['emoji-searched'].start();
286
+
287
+ _analytics.ufoExperiences['emoji-searched'].addMetadata({
288
+ queryLength: (query === null || query === void 0 ? void 0 : query.length) || 0,
289
+ source: 'typeahead'
290
+ });
291
+
275
292
  this.renderStartTime = Date.now();
276
293
  emojiProvider.filter(query, options);
277
294
  }
@@ -37,6 +37,8 @@ var _analytics = require("../../util/analytics");
37
37
 
38
38
  var _styles = require("./styles");
39
39
 
40
+ var _ufoExperiences = require("../../util/analytics/ufoExperiences");
41
+
40
42
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
41
43
 
42
44
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
@@ -54,6 +56,12 @@ var EmojiUploadComponent = /*#__PURE__*/function (_PureComponent) {
54
56
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onUploadEmoji", function (upload, retry) {
55
57
  var emojiProvider = _this.props.emojiProvider;
56
58
 
59
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].start();
60
+
61
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].addMetadata({
62
+ retry: retry
63
+ });
64
+
57
65
  _this.fireAnalytics((0, _analytics.uploadConfirmButton)({
58
66
  retry: retry
59
67
  }));
@@ -109,6 +117,11 @@ var EmojiUploadComponent = /*#__PURE__*/function (_PureComponent) {
109
117
  }
110
118
 
111
119
  (0, _createClass2.default)(EmojiUploadComponent, [{
120
+ key: "componentWillUnmount",
121
+ value: function componentWillUnmount() {
122
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].abort();
123
+ }
124
+ }, {
112
125
  key: "render",
113
126
  value: function render() {
114
127
  var uploadErrorMessage = this.state.uploadErrorMessage;
package/dist/cjs/index.js CHANGED
@@ -168,6 +168,12 @@ Object.defineProperty(exports, "toOptionalEmojiId", {
168
168
  return _typeHelpers.toOptionalEmojiId;
169
169
  }
170
170
  });
171
+ Object.defineProperty(exports, "ufoExperiences", {
172
+ enumerable: true,
173
+ get: function get() {
174
+ return _analytics.ufoExperiences;
175
+ }
176
+ });
171
177
 
172
178
  var _utilServiceSupport = require("@atlaskit/util-service-support");
173
179
 
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.uploadSucceededEvent = exports.uploadFailedEvent = exports.uploadConfirmButton = exports.uploadCancelButton = exports.uploadBeginButton = exports.ufoExperiences = exports.typeaheadSelectedEvent = exports.typeaheadRenderedEvent = exports.typeaheadCancelledEvent = exports.toneSelectorOpenedEvent = exports.toneSelectorClosedEvent = exports.toneSelectedEvent = exports.selectedFileEvent = exports.sampledUfoRenderedEmoji = exports.recordSelectionSucceededSli = exports.recordSelectionFailedSli = exports.pickerSearchedEvent = exports.pickerClickedEvent = exports.openedPickerEvent = exports.insertionSucceeded = exports.insertionFailed = exports.deleteConfirmEvent = exports.deleteCancelEvent = exports.deleteBeginEvent = exports.createAndFireEventInElementsChannel = exports.closedPickerEvent = exports.categoryClickedEvent = void 0;
8
+ exports.uploadSucceededEvent = exports.uploadFailedEvent = exports.uploadConfirmButton = exports.uploadCancelButton = exports.uploadBeginButton = exports.typeaheadSelectedEvent = exports.typeaheadRenderedEvent = exports.typeaheadCancelledEvent = exports.toneSelectorOpenedEvent = exports.toneSelectorClosedEvent = exports.toneSelectedEvent = exports.selectedFileEvent = exports.recordSucceeded = exports.recordSelectionSucceededSli = exports.recordSelectionFailedSli = exports.recordFailed = exports.pickerSearchedEvent = exports.pickerClickedEvent = exports.openedPickerEvent = exports.deleteConfirmEvent = exports.deleteCancelEvent = exports.deleteBeginEvent = exports.createAndFireEventInElementsChannel = exports.closedPickerEvent = exports.categoryClickedEvent = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
@@ -13,10 +13,6 @@ var _analyticsNext = require("@atlaskit/analytics-next");
13
13
 
14
14
  var _version = require("../../version.json");
15
15
 
16
- var _ufo = require("@atlaskit/ufo");
17
-
18
- var _samplingUfo = require("./samplingUfo");
19
-
20
16
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
21
17
 
22
18
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -27,34 +23,6 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
27
23
 
28
24
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
29
25
 
30
- var createRenderExperience = function createRenderExperience(componentName) {
31
- return {
32
- platform: {
33
- component: componentName
34
- },
35
- type: _ufo.ExperienceTypes.Load,
36
- performanceType: _ufo.ExperiencePerformanceTypes.PageSegmentLoad
37
- };
38
- }; // const createInlineExperience = (componentName: string) => {
39
- // return {
40
- // platform: { component: componentName },
41
- // type: ExperienceTypes.Experience,
42
- // performanceType: ExperiencePerformanceTypes.InlineResult,
43
- // };
44
- // };
45
-
46
-
47
- var ufoExperiences = {
48
- 'emoji-rendered': new _ufo.ConcurrentExperience('emoji-rendered', createRenderExperience('emoji')),
49
- 'emoji-resource-fetched': new _ufo.ConcurrentExperience('emoji-resource-fetched', createRenderExperience('emoji-provider'))
50
- };
51
- exports.ufoExperiences = ufoExperiences;
52
-
53
- var sampledUfoRenderedEmoji = function sampledUfoRenderedEmoji(emojiId) {
54
- return (0, _samplingUfo.withSampling)(ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName));
55
- };
56
-
57
- exports.sampledUfoRenderedEmoji = sampledUfoRenderedEmoji;
58
26
  var createAndFireEventInElementsChannel = (0, _analyticsNext.createAndFireEvent)('fabric-elements');
59
27
  exports.createAndFireEventInElementsChannel = createAndFireEventInElementsChannel;
60
28
 
@@ -72,21 +40,21 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
72
40
  };
73
41
  };
74
42
 
75
- var insertionSucceeded = function insertionSucceeded(source) {
43
+ var recordSucceeded = function recordSucceeded(source) {
76
44
  return createEvent('operational', 'succeeded', 'recordEmojiSelection', undefined, {
77
45
  source: source
78
46
  });
79
47
  };
80
48
 
81
- exports.insertionSucceeded = insertionSucceeded;
49
+ exports.recordSucceeded = recordSucceeded;
82
50
 
83
- var insertionFailed = function insertionFailed(source) {
51
+ var recordFailed = function recordFailed(source) {
84
52
  return createEvent('operational', 'failed', 'recordEmojiSelection', undefined, {
85
53
  source: source
86
54
  });
87
55
  };
88
56
 
89
- exports.insertionFailed = insertionFailed;
57
+ exports.recordFailed = recordFailed;
90
58
 
91
59
  var emojiPickerEvent = function emojiPickerEvent(action) {
92
60
  var attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -296,24 +264,26 @@ var typeaheadRenderedEvent = function typeaheadRenderedEvent(duration, query, em
296
264
  return createEvent('operational', 'rendered', 'emojiTypeahead', undefined, _objectSpread({
297
265
  duration: duration
298
266
  }, extractCommonAttributes(query, emojiList)));
299
- };
267
+ }; // it's used in editor typeahead to fire success record analytics
268
+
300
269
 
301
270
  exports.typeaheadRenderedEvent = typeaheadRenderedEvent;
302
271
 
303
272
  var recordSelectionSucceededSli = function recordSelectionSucceededSli(options) {
304
273
  return function () {
305
274
  if (options && options.createAnalyticsEvent) {
306
- (0, _analyticsNext.createAndFireEvent)('editor')(insertionSucceeded('typeahead'))(options.createAnalyticsEvent);
275
+ (0, _analyticsNext.createAndFireEvent)('editor')(recordSucceeded('typeahead'))(options.createAnalyticsEvent);
307
276
  }
308
277
  };
309
- };
278
+ }; // it's used in editor typeahead to fire failure record analytics
279
+
310
280
 
311
281
  exports.recordSelectionSucceededSli = recordSelectionSucceededSli;
312
282
 
313
283
  var recordSelectionFailedSli = function recordSelectionFailedSli(options) {
314
284
  return function (err) {
315
285
  if (options && options.createAnalyticsEvent) {
316
- (0, _analyticsNext.createAndFireEvent)('editor')(insertionFailed('typeahead'))(options.createAnalyticsEvent);
286
+ (0, _analyticsNext.createAndFireEvent)('editor')(recordFailed('typeahead'))(options.createAnalyticsEvent);
317
287
  }
318
288
 
319
289
  return Promise.reject(err);
@@ -45,18 +45,6 @@ Object.defineProperty(exports, "deleteConfirmEvent", {
45
45
  return _analytics.deleteConfirmEvent;
46
46
  }
47
47
  });
48
- Object.defineProperty(exports, "insertionFailed", {
49
- enumerable: true,
50
- get: function get() {
51
- return _analytics.insertionFailed;
52
- }
53
- });
54
- Object.defineProperty(exports, "insertionSucceeded", {
55
- enumerable: true,
56
- get: function get() {
57
- return _analytics.insertionSucceeded;
58
- }
59
- });
60
48
  Object.defineProperty(exports, "isExperienceSampled", {
61
49
  enumerable: true,
62
50
  get: function get() {
@@ -81,6 +69,12 @@ Object.defineProperty(exports, "pickerSearchedEvent", {
81
69
  return _analytics.pickerSearchedEvent;
82
70
  }
83
71
  });
72
+ Object.defineProperty(exports, "recordFailed", {
73
+ enumerable: true,
74
+ get: function get() {
75
+ return _analytics.recordFailed;
76
+ }
77
+ });
84
78
  Object.defineProperty(exports, "recordSelectionFailedSli", {
85
79
  enumerable: true,
86
80
  get: function get() {
@@ -93,10 +87,16 @@ Object.defineProperty(exports, "recordSelectionSucceededSli", {
93
87
  return _analytics.recordSelectionSucceededSli;
94
88
  }
95
89
  });
90
+ Object.defineProperty(exports, "recordSucceeded", {
91
+ enumerable: true,
92
+ get: function get() {
93
+ return _analytics.recordSucceeded;
94
+ }
95
+ });
96
96
  Object.defineProperty(exports, "sampledUfoRenderedEmoji", {
97
97
  enumerable: true,
98
98
  get: function get() {
99
- return _analytics.sampledUfoRenderedEmoji;
99
+ return _ufoExperiences.sampledUfoRenderedEmoji;
100
100
  }
101
101
  });
102
102
  Object.defineProperty(exports, "selectedFileEvent", {
@@ -144,7 +144,7 @@ Object.defineProperty(exports, "typeaheadSelectedEvent", {
144
144
  Object.defineProperty(exports, "ufoExperiences", {
145
145
  enumerable: true,
146
146
  get: function get() {
147
- return _analytics.ufoExperiences;
147
+ return _ufoExperiences.ufoExperiences;
148
148
  }
149
149
  });
150
150
  Object.defineProperty(exports, "ufoExperiencesSampled", {
@@ -200,4 +200,6 @@ var _samplingUfo = require("./samplingUfo");
200
200
 
201
201
  var _analytics = require("./analytics");
202
202
 
203
+ var _ufoExperiences = require("./ufoExperiences");
204
+
203
205
  var _useSampledUFOComponentExperience = require("./useSampledUFOComponentExperience");
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ufoExperiences = exports.sampledUfoRenderedEmoji = void 0;
7
+
8
+ var _ufo = require("@atlaskit/ufo");
9
+
10
+ var _samplingUfo = require("./samplingUfo");
11
+
12
+ var createRenderExperience = function createRenderExperience(componentName) {
13
+ return {
14
+ platform: {
15
+ component: componentName
16
+ },
17
+ type: _ufo.ExperienceTypes.Load,
18
+ performanceType: _ufo.ExperiencePerformanceTypes.PageSegmentLoad
19
+ };
20
+ };
21
+
22
+ var createInlineExperience = function createInlineExperience(componentName) {
23
+ return {
24
+ platform: {
25
+ component: componentName
26
+ },
27
+ type: _ufo.ExperienceTypes.Experience,
28
+ performanceType: _ufo.ExperiencePerformanceTypes.InlineResult
29
+ };
30
+ };
31
+
32
+ var ufoExperiences = {
33
+ 'emoji-rendered': new _ufo.ConcurrentExperience('emoji-rendered', createRenderExperience('emoji')),
34
+ 'emoji-resource-fetched': new _ufo.ConcurrentExperience('emoji-resource-fetched', createRenderExperience('emoji-provider')),
35
+ 'emoji-picker-opened': new _ufo.UFOExperience('emoji-picker-opened', createRenderExperience('emoji-picker')),
36
+ 'emoji-selection-recorded': new _ufo.UFOExperience('emoji-selection-recorded', createInlineExperience('emoji-picker')),
37
+ 'emoji-uploaded': new _ufo.UFOExperience('emoji-uploaded', createInlineExperience('emoji-picker')),
38
+ 'emoji-searched': new _ufo.UFOExperience('emoji-searched', createInlineExperience('emoji-picker'))
39
+ };
40
+ exports.ufoExperiences = ufoExperiences;
41
+
42
+ var sampledUfoRenderedEmoji = function sampledUfoRenderedEmoji(emojiId) {
43
+ return (0, _samplingUfo.withSampling)(ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName));
44
+ };
45
+
46
+ exports.sampledUfoRenderedEmoji = sampledUfoRenderedEmoji;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "64.3.0",
3
+ "version": "64.4.0",
4
4
  "sideEffects": false
5
5
  }
@@ -1,4 +1,4 @@
1
- import { insertionFailed, insertionSucceeded } from '../../util/analytics';
1
+ import { recordFailed, recordSucceeded, ufoExperiences } from '../../util/analytics';
2
2
 
3
3
  /**
4
4
  * A function that will wrap any configured Emoji 'onSelection' function to ensure recordSelection is always
@@ -12,7 +12,14 @@ export const createRecordSelectionDefault = (provider, onSelect, fireAnalytics)
12
12
  return (emojiId, emoji, event) => {
13
13
  try {
14
14
  if (provider.recordSelection && emoji) {
15
- provider.recordSelection(emoji).then(() => fireAnalytics && fireAnalytics(insertionSucceeded)).catch(() => fireAnalytics && fireAnalytics(insertionFailed));
15
+ ufoExperiences['emoji-selection-recorded'].start();
16
+ provider.recordSelection(emoji).then(() => {
17
+ fireAnalytics && fireAnalytics(recordSucceeded);
18
+ ufoExperiences['emoji-selection-recorded'].success();
19
+ }).catch(() => {
20
+ fireAnalytics && fireAnalytics(recordFailed);
21
+ ufoExperiences['emoji-selection-recorded'].failure();
22
+ });
16
23
  }
17
24
  } finally {
18
25
  if (onSelect) {
@@ -1,16 +1,19 @@
1
1
  import { supportsUploadFeature } from '../../api/EmojiResource';
2
2
  import { uploadFailedEvent, uploadSucceededEvent } from '../../util/analytics';
3
3
  import { messages } from '../i18n';
4
+ import { ufoExperiences } from '../../util/analytics/ufoExperiences';
4
5
  export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireAnalytics) => {
5
6
  const startTime = Date.now();
6
7
  errorSetter(undefined);
7
8
 
8
9
  if (supportsUploadFeature(emojiProvider)) {
10
+ ufoExperiences['emoji-uploaded'].start();
9
11
  emojiProvider.uploadCustomEmoji(upload).then(emojiDescription => {
10
12
  fireAnalytics(uploadSucceededEvent({
11
13
  duration: Date.now() - startTime
12
14
  }));
13
15
  onSuccess(emojiDescription);
16
+ ufoExperiences['emoji-uploaded'].success();
14
17
  }).catch(err => {
15
18
  errorSetter(messages.emojiUploadFailed); // eslint-disable-next-line no-console
16
19
 
@@ -19,6 +22,7 @@ export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireA
19
22
  duration: Date.now() - startTime,
20
23
  reason: messages.emojiUploadFailed.defaultMessage
21
24
  }));
25
+ ufoExperiences['emoji-uploaded'].failure();
22
26
  });
23
27
  }
24
28
  };
@@ -4,9 +4,11 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
4
  /** @jsx jsx */
5
5
  import { jsx } from '@emotion/core';
6
6
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
7
+ import { ufoExperiences } from '../../util/analytics';
7
8
  import LoadingEmojiComponent from '../common/LoadingEmojiComponent';
8
9
  import { LoadingItem } from './EmojiPickerVirtualItems';
9
10
  import { emojiPicker } from './styles';
11
+ import { UfoErrorBoundary } from '../common/UfoErrorBoundary';
10
12
 
11
13
  const emojiPickerModuleLoader = () => import(
12
14
  /* webpackChunkName:"@atlaskit-internal_emojiPickerComponent" */
@@ -23,6 +25,8 @@ export class EmojiPickerInternal extends LoadingEmojiComponent {
23
25
  _defineProperty(this, "state", {
24
26
  asyncLoadedComponent: EmojiPickerInternal.AsyncLoadedComponent
25
27
  });
28
+
29
+ ufoExperiences['emoji-picker-opened'].start();
26
30
  }
27
31
 
28
32
  asyncLoadComponent() {
@@ -41,6 +45,7 @@ export class EmojiPickerInternal extends LoadingEmojiComponent {
41
45
  }
42
46
  };
43
47
 
48
+ ufoExperiences['emoji-picker-opened'].markFMP();
44
49
  return jsx("div", {
45
50
  css: emojiPicker,
46
51
  ref: handlePickerRef
@@ -52,9 +57,11 @@ export class EmojiPickerInternal extends LoadingEmojiComponent {
52
57
  emojiProvider,
53
58
  ...otherProps
54
59
  } = this.props;
55
- return jsx(EmojiPickerComponent, _extends({
60
+ return jsx(UfoErrorBoundary, {
61
+ experiences: [ufoExperiences['emoji-picker-opened']]
62
+ }, jsx(EmojiPickerComponent, _extends({
56
63
  emojiProvider: loadedEmojiProvider
57
- }, otherProps));
64
+ }, otherProps)));
58
65
  }
59
66
 
60
67
  }
@@ -18,7 +18,7 @@ import { createRecordSelectionDefault } from '../common/RecordSelectionDefault';
18
18
  import CategorySelector from './CategorySelector';
19
19
  import EmojiPickerFooter from './EmojiPickerFooter';
20
20
  import EmojiPickerList from './EmojiPickerList';
21
- import { createAndFireEventInElementsChannel, categoryClickedEvent, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, selectedFileEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, toneSelectorClosedEvent } from '../../util/analytics';
21
+ import { createAndFireEventInElementsChannel, categoryClickedEvent, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, selectedFileEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, toneSelectorClosedEvent, ufoExperiences } from '../../util/analytics';
22
22
  import { emojiPicker } from './styles';
23
23
  const FREQUENTLY_USED_MAX = 16;
24
24
  export default class EmojiPickerComponent extends PureComponent {
@@ -106,9 +106,19 @@ export default class EmojiPickerComponent extends PureComponent {
106
106
  });
107
107
 
108
108
  _defineProperty(this, "onSearch", query => {
109
- this.updateEmojis(query, {
109
+ const options = {
110
110
  skinTone: this.state.selectedTone
111
- });
111
+ };
112
+
113
+ if (query !== this.state.query) {
114
+ ufoExperiences['emoji-searched'].start();
115
+ ufoExperiences['emoji-searched'].addMetadata({
116
+ queryLength: query.length,
117
+ source: 'picker'
118
+ });
119
+ }
120
+
121
+ this.updateEmojis(query, options);
112
122
  });
113
123
 
114
124
  _defineProperty(this, "onSearchResult", searchResults => {
@@ -121,6 +131,11 @@ export default class EmojiPickerComponent extends PureComponent {
121
131
  queryLength: searchQuery.length,
122
132
  numMatches: emojiToRender.length
123
133
  }));
134
+ ufoExperiences['emoji-searched'].success({
135
+ metadata: {
136
+ emojisLength: emojiToRender.length
137
+ }
138
+ });
124
139
  }
125
140
 
126
141
  this.setStateAfterEmojiChange(searchQuery, emojiToRender, searchResults.emojis, frequentlyUsedEmoji);
@@ -353,6 +368,7 @@ export default class EmojiPickerComponent extends PureComponent {
353
368
  }
354
369
 
355
370
  componentDidMount() {
371
+ ufoExperiences['emoji-picker-opened'].success();
356
372
  const {
357
373
  emojiProvider,
358
374
  hideToneSelector
@@ -387,6 +403,9 @@ export default class EmojiPickerComponent extends PureComponent {
387
403
  this.fireAnalytics(closedPickerEvent({
388
404
  duration: this.calculateElapsedTime()
389
405
  }));
406
+ ufoExperiences['emoji-picker-opened'].abort();
407
+ ufoExperiences['emoji-searched'].abort();
408
+ ufoExperiences['emoji-selection-recorded'].abort();
390
409
  }
391
410
 
392
411
  UNSAFE_componentWillReceiveProps(nextProps) {