@atlaskit/emoji 64.7.0 → 64.7.1

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 (62) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/api/EmojiResource.js +5 -1
  3. package/dist/cjs/components/common/CachingEmoji.js +21 -3
  4. package/dist/cjs/components/common/Emoji.js +57 -36
  5. package/dist/cjs/components/common/RecordSelectionDefault.js +13 -1
  6. package/dist/cjs/components/common/ResourcedEmoji.js +13 -3
  7. package/dist/cjs/components/common/ResourcedEmojiComponent.js +21 -3
  8. package/dist/cjs/components/common/UfoErrorBoundary.js +30 -4
  9. package/dist/cjs/components/common/UploadEmoji.js +17 -1
  10. package/dist/cjs/components/picker/EmojiPickerComponent.js +12 -2
  11. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  12. package/dist/cjs/components/uploader/EmojiUploadComponent.js +6 -1
  13. package/dist/cjs/types.js +2 -0
  14. package/dist/cjs/util/analytics/ufoExperiences.js +22 -4
  15. package/dist/cjs/util/analytics/useSampledUFOComponentExperience.js +2 -1
  16. package/dist/cjs/util/browser-support.js +1 -1
  17. package/dist/cjs/util/constants.js +4 -5
  18. package/dist/cjs/util/useInView.js +23 -0
  19. package/dist/cjs/version.json +1 -1
  20. package/dist/es2019/api/EmojiResource.js +5 -1
  21. package/dist/es2019/components/common/CachingEmoji.js +20 -3
  22. package/dist/es2019/components/common/Emoji.js +53 -34
  23. package/dist/es2019/components/common/RecordSelectionDefault.js +13 -1
  24. package/dist/es2019/components/common/ResourcedEmoji.js +14 -4
  25. package/dist/es2019/components/common/ResourcedEmojiComponent.js +20 -3
  26. package/dist/es2019/components/common/UfoErrorBoundary.js +14 -2
  27. package/dist/es2019/components/common/UploadEmoji.js +10 -1
  28. package/dist/es2019/components/picker/EmojiPickerComponent.js +12 -2
  29. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  30. package/dist/es2019/components/uploader/EmojiUploadComponent.js +6 -1
  31. package/dist/es2019/types.js +2 -0
  32. package/dist/es2019/util/analytics/ufoExperiences.js +12 -2
  33. package/dist/es2019/util/analytics/useSampledUFOComponentExperience.js +2 -1
  34. package/dist/es2019/util/browser-support.js +1 -1
  35. package/dist/es2019/util/constants.js +2 -2
  36. package/dist/es2019/util/useInView.js +12 -0
  37. package/dist/es2019/version.json +1 -1
  38. package/dist/esm/api/EmojiResource.js +5 -1
  39. package/dist/esm/components/common/CachingEmoji.js +20 -3
  40. package/dist/esm/components/common/Emoji.js +59 -38
  41. package/dist/esm/components/common/RecordSelectionDefault.js +13 -1
  42. package/dist/esm/components/common/ResourcedEmoji.js +14 -4
  43. package/dist/esm/components/common/ResourcedEmojiComponent.js +20 -3
  44. package/dist/esm/components/common/UfoErrorBoundary.js +30 -4
  45. package/dist/esm/components/common/UploadEmoji.js +15 -1
  46. package/dist/esm/components/picker/EmojiPickerComponent.js +12 -2
  47. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  48. package/dist/esm/components/uploader/EmojiUploadComponent.js +6 -1
  49. package/dist/esm/types.js +2 -0
  50. package/dist/esm/util/analytics/ufoExperiences.js +14 -2
  51. package/dist/esm/util/analytics/useSampledUFOComponentExperience.js +2 -1
  52. package/dist/esm/util/browser-support.js +1 -1
  53. package/dist/esm/util/constants.js +2 -2
  54. package/dist/esm/util/useInView.js +12 -0
  55. package/dist/esm/version.json +1 -1
  56. package/dist/types/components/common/UfoErrorBoundary.d.ts +2 -2
  57. package/dist/types/types.d.ts +2 -0
  58. package/dist/types/util/analytics/samplingUfo.d.ts +7 -0
  59. package/dist/types/util/analytics/ufoExperiences.d.ts +4 -1
  60. package/dist/types/util/constants.d.ts +1 -1
  61. package/dist/types/util/useInView.d.ts +4 -0
  62. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 64.7.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`6e01776f0b7`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6e01776f0b7) - remove placeholder when lazy load emoji
8
+ - [`6e01776f0b7`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6e01776f0b7) - fix placeholder issue in lazy loaded emoji by removing it and re-write the anlytics tracking around it
9
+ - [`c3f9e9bce1c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c3f9e9bce1c) - Add custom information to failure and abort events for UFO experiences
10
+ - Updated dependencies
11
+
3
12
  ## 64.7.0
4
13
 
5
14
  ### Minor Changes
@@ -123,7 +123,11 @@ var EmojiResource = /*#__PURE__*/function (_AbstractResource) {
123
123
 
124
124
  _analytics.ufoExperiences['emoji-resource-fetched'].getInstance(providerType).failure({
125
125
  metadata: {
126
- reason: reason
126
+ reason: reason,
127
+ source: 'EmojiProvider',
128
+ data: {
129
+ providerUrl: provider.url
130
+ }
127
131
  }
128
132
  });
129
133
  });
@@ -47,6 +47,8 @@ var _constants = require("../../util/constants");
47
47
 
48
48
  var _EmojiContext = require("../../context/EmojiContext");
49
49
 
50
+ var _ufoExperiences = require("../../util/analytics/ufoExperiences");
51
+
50
52
  var _excluded = ["placeholderSize"],
51
53
  _excluded2 = ["children"];
52
54
 
@@ -72,7 +74,10 @@ var CachingEmoji = function CachingEmoji(props) {
72
74
  emoji: emojiProps.emoji.shortName
73
75
  });
74
76
  (0, _react.useEffect)(function () {
75
- (0, _analytics.sampledUfoRenderedEmoji)(emojiProps.emoji).mark(_types.UfoEmojiTimings.MOUNTED_END); // eslint-disable-next-line react-hooks/exhaustive-deps
77
+ if (!(0, _ufoExperiences.hasUfoMarked)((0, _analytics.sampledUfoRenderedEmoji)(emojiProps.emoji), 'fmp')) {
78
+ (0, _analytics.sampledUfoRenderedEmoji)(emojiProps.emoji).markFMP();
79
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
80
+
76
81
  }, []);
77
82
 
78
83
  var emojiNode = function emojiNode() {
@@ -108,7 +113,12 @@ var CachingMediaEmoji = /*#__PURE__*/function (_PureComponent) {
108
113
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleLoadError", function (_emojiId) {
109
114
  (0, _analytics.sampledUfoRenderedEmoji)(_emojiId).failure({
110
115
  metadata: {
111
- reason: 'load error'
116
+ reason: 'load error',
117
+ source: 'CachingMediaEmoji',
118
+ emoji: {
119
+ id: _emojiId.id,
120
+ shortName: _emojiId.shortName
121
+ }
112
122
  }
113
123
  });
114
124
 
@@ -170,7 +180,15 @@ var CachingMediaEmoji = /*#__PURE__*/function (_PureComponent) {
170
180
 
171
181
  (0, _analytics.sampledUfoRenderedEmoji)(emoji).failure({
172
182
  metadata: {
173
- reason: 'failed to load media emoji'
183
+ reason: 'failed to load media emoji',
184
+ source: 'CachingMediaEmoji',
185
+ data: {
186
+ emoji: {
187
+ id: emoji.id,
188
+ shortName: emoji.shortName,
189
+ name: emoji.name
190
+ }
191
+ }
174
192
  }
175
193
  });
176
194
  });
@@ -35,11 +35,11 @@ var _styles = require("./styles");
35
35
 
36
36
  var _analytics = require("../../util/analytics");
37
37
 
38
- var _ = require("../..");
38
+ var _browserSupport = require("../../util/browser-support");
39
39
 
40
- var _reactIntersectionObserver = require("react-intersection-observer");
40
+ var _useInView3 = require("../../util/useInView");
41
41
 
42
- var _browserSupport = require("../../util/browser-support");
42
+ var _ufoExperiences = require("../../util/analytics/ufoExperiences");
43
43
 
44
44
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
45
45
 
@@ -111,6 +111,7 @@ var handleImageError = function handleImageError(props, event) {
111
111
  }
112
112
  }; // Pure functional components are used in favour of class based components, due to the performance!
113
113
  // When rendering 1500+ emoji using class based components had a significant impact.
114
+ // TODO: add UFO tracking for sprite emoji
114
115
 
115
116
 
116
117
  var SpriteEmoji = function SpriteEmoji(props) {
@@ -180,6 +181,15 @@ var ImageEmoji = function ImageEmoji(props) {
180
181
  showTooltip = props.showTooltip,
181
182
  showDelete = props.showDelete,
182
183
  shouldBeInteractive = props.shouldBeInteractive;
184
+
185
+ var _useInView = (0, _useInView3.useInView)({
186
+ triggerOnce: true
187
+ }),
188
+ _useInView2 = (0, _slicedToArray2.default)(_useInView, 2),
189
+ ref = _useInView2[0],
190
+ inView = _useInView2[1];
191
+
192
+ var ufoExp = (0, _analytics.sampledUfoRenderedEmoji)(emoji);
183
193
  var classes = "".concat(_styles.emojiMainStyle, " ").concat(_styles.emojiNodeStyles, " ").concat(selected ? _styles.commonSelectedStyles : '', " ").concat(selectOnHover ? _styles.selectOnHoverStyles : '', " ").concat(_styles.emojiImage, " ").concat(className ? className : '');
184
194
  var width;
185
195
  var height;
@@ -220,21 +230,35 @@ var ImageEmoji = function ImageEmoji(props) {
220
230
  handleImageError(props, event);
221
231
  };
222
232
 
233
+ var markStartLoadFromMountedTime = (0, _react.useCallback)(function () {
234
+ var mountedMark = ufoExp.metrics.marks.find(function (mark) {
235
+ return mark.name === _types.UfoEmojiTimings.MOUNTED_END;
236
+ });
237
+ ufoExp.mark(_types.UfoEmojiTimings.ONLOAD_START, mountedMark === null || mountedMark === void 0 ? void 0 : mountedMark.time);
238
+ }, [ufoExp]);
239
+
223
240
  var onLoad = function onLoad() {
224
- (0, _analytics.sampledUfoRenderedEmoji)(emoji).mark(_types.UfoEmojiTimings.ONLOAD_END);
225
- (0, _analytics.sampledUfoRenderedEmoji)(emoji).success();
241
+ // onload could trigger before onBeforeLoad when emojis in viewport at start, so we need to mark onload start manually.
242
+ if (!(0, _ufoExperiences.hasUfoMarked)(ufoExp, _types.UfoEmojiTimings.ONLOAD_START)) {
243
+ markStartLoadFromMountedTime();
244
+ }
245
+
246
+ if (!(0, _ufoExperiences.hasUfoMarked)(ufoExp, _types.UfoEmojiTimings.ONLOAD_END)) {
247
+ ufoExp.mark(_types.UfoEmojiTimings.ONLOAD_END);
248
+ }
249
+
250
+ ufoExp.success({
251
+ metadata: {
252
+ IBSupported: _browserSupport.isIntersectionObserverSupported
253
+ }
254
+ });
226
255
  };
227
256
 
228
257
  var onBeforeLoad = (0, _react.useCallback)(function () {
229
- (0, _analytics.sampledUfoRenderedEmoji)(emoji).mark(_types.UfoEmojiTimings.ONLOAD_START);
230
- }, [emoji]);
231
-
232
- var _useInView = (0, _reactIntersectionObserver.useInView)({
233
- triggerOnce: true
234
- }),
235
- _useInView2 = (0, _slicedToArray2.default)(_useInView, 2),
236
- ref = _useInView2[0],
237
- inView = _useInView2[1];
258
+ if (!(0, _ufoExperiences.hasUfoMarked)(ufoExp, _types.UfoEmojiTimings.ONLOAD_START)) {
259
+ ufoExp.mark(_types.UfoEmojiTimings.ONLOAD_START);
260
+ }
261
+ }, [ufoExp]); // because of the lack of browser support of on before load natively, used IntersectionObserver helper hook to mimic the before load time mark for UFO.
238
262
 
239
263
  (0, _react.useEffect)(function () {
240
264
  if (inView) {
@@ -257,26 +281,6 @@ var ImageEmoji = function ImageEmoji(props) {
257
281
  onError: onError,
258
282
  onLoad: onLoad
259
283
  }, sizing));
260
- var placeholder = (0, _core.jsx)(_.EmojiPlaceholder, {
261
- shortName: emoji.shortName,
262
- size: fitToHeight,
263
- showTooltip: showTooltip,
264
- representation: emoji.representation
265
- });
266
-
267
- var renderLazyLoadedEmoji = function renderLazyLoadedEmoji() {
268
- // if browser not supported, render emoji node directly
269
- if (!_browserSupport.isIntersectionObserverSupported) {
270
- return emojiNode;
271
- }
272
-
273
- if (inView) {
274
- return emojiNode;
275
- }
276
-
277
- return placeholder;
278
- };
279
-
280
284
  return (0, _core.jsx)("span", {
281
285
  "data-testid": "image-emoji-".concat(emoji.shortName),
282
286
  "data-emoji-type": "image",
@@ -296,13 +300,30 @@ var ImageEmoji = function ImageEmoji(props) {
296
300
  "aria-label": emoji.shortName,
297
301
  title: showTooltip ? emoji.shortName : '',
298
302
  ref: ref
299
- }, deleteButton, renderLazyLoadedEmoji());
303
+ }, deleteButton, emojiNode);
300
304
  };
301
305
 
302
306
  exports.ImageEmoji = ImageEmoji;
303
307
 
304
308
  var Emoji = function Emoji(props) {
305
- var emoji = props.emoji; // TODO: We always prefer render as image as having accessibility issues with sprite representation
309
+ var emoji = props.emoji; // start emoji rendered experience, it may have already started earlier in ResourcedEmoji or CachingEmoji
310
+
311
+ (0, _analytics.useSampledUFOComponentExperience)(_analytics.ufoExperiences['emoji-rendered'].getInstance(emoji.id || emoji.shortName), _constants.SAMPLING_RATE_EMOJI_RENDERED_EXP, {
312
+ source: 'emoji',
313
+ emoji: emoji.shortName
314
+ });
315
+ (0, _react.useEffect)(function () {
316
+ var ufoExp = (0, _analytics.sampledUfoRenderedEmoji)(emoji);
317
+
318
+ if (!(0, _ufoExperiences.hasUfoMarked)(ufoExp, 'fmp')) {
319
+ ufoExp.markFMP();
320
+ }
321
+
322
+ if (!(0, _ufoExperiences.hasUfoMarked)(ufoExp, _types.UfoEmojiTimings.MOUNTED_END)) {
323
+ ufoExp.mark(_types.UfoEmojiTimings.MOUNTED_END);
324
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
325
+
326
+ }, []); // TODO: We always prefer render as image as having accessibility issues with sprite representation
306
327
 
307
328
  if ((0, _typeHelpers.isSpriteRepresentation)(emoji.representation)) {
308
329
  return (0, _core.jsx)(SpriteEmoji, props);
@@ -28,7 +28,19 @@ var createRecordSelectionDefault = function createRecordSelectionDefault(provide
28
28
  }).catch(function () {
29
29
  fireAnalytics && fireAnalytics(_analytics.recordFailed);
30
30
 
31
- _analytics.ufoExperiences['emoji-selection-recorded'].failure();
31
+ _analytics.ufoExperiences['emoji-selection-recorded'].failure({
32
+ metadata: {
33
+ reason: 'recordSelection error',
34
+ source: 'RecordSelectionDefault',
35
+ data: {
36
+ emoji: {
37
+ id: emoji.id,
38
+ name: emoji.name,
39
+ shortName: emoji.shortName
40
+ }
41
+ }
42
+ }
43
+ });
32
44
  });
33
45
  }
34
46
  } finally {
@@ -77,11 +77,12 @@ var ResourcedEmoji = /*#__PURE__*/function (_LoadingEmojiComponen) {
77
77
  asyncLoadedComponent: ResourcedEmoji.AsyncLoadedComponent
78
78
  });
79
79
  (0, _analytics.sampledUfoRenderedEmoji)(props.emojiId).start({
80
- samplingRate: _constants.SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI
80
+ samplingRate: _constants.SAMPLING_RATE_EMOJI_RENDERED_EXP
81
81
  });
82
82
 
83
83
  _analytics.ufoExperiences['emoji-rendered'].getInstance(props.emojiId.id || props.emojiId.shortName).addMetadata({
84
- source: 'resourced-emoji'
84
+ source: 'resourced-emoji',
85
+ emoji: props.emojiId.shortName
85
86
  });
86
87
 
87
88
  return _this;
@@ -90,7 +91,16 @@ var ResourcedEmoji = /*#__PURE__*/function (_LoadingEmojiComponen) {
90
91
  (0, _createClass2.default)(ResourcedEmoji, [{
91
92
  key: "componentWillUnmount",
92
93
  value: function componentWillUnmount() {
93
- (0, _analytics.sampledUfoRenderedEmoji)(this.props.emojiId).abort();
94
+ (0, _analytics.sampledUfoRenderedEmoji)(this.props.emojiId).abort({
95
+ metadata: {
96
+ source: 'ResourcedEmoji',
97
+ reason: 'unmount',
98
+ data: {
99
+ emojiId: this.props.emojiId.id,
100
+ shortName: this.props.emojiId.shortName
101
+ }
102
+ }
103
+ });
94
104
  }
95
105
  }, {
96
106
  key: "asyncLoadComponent",
@@ -39,6 +39,8 @@ var _analytics = require("../../util/analytics");
39
39
 
40
40
  var _LegacyEmojiContextProvider = _interopRequireDefault(require("../../context/LegacyEmojiContextProvider"));
41
41
 
42
+ var _ufoExperiences = require("../../util/analytics/ufoExperiences");
43
+
42
44
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
43
45
 
44
46
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -91,7 +93,14 @@ var ResourcedEmojiComponent = /*#__PURE__*/function (_Component) {
91
93
  // emoji is undefined
92
94
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).failure({
93
95
  metadata: {
94
- reason: 'failed to find'
96
+ reason: 'failed to find',
97
+ source: 'ResourcedEmojiComponent',
98
+ data: {
99
+ emoji: {
100
+ id: emojiId.id,
101
+ shortName: emojiId.shortName
102
+ }
103
+ }
95
104
  }
96
105
  });
97
106
  }
@@ -99,7 +108,14 @@ var ResourcedEmojiComponent = /*#__PURE__*/function (_Component) {
99
108
  }).catch(function () {
100
109
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).failure({
101
110
  metadata: {
102
- reason: 'failed to load'
111
+ reason: 'failed to load',
112
+ source: 'ResourcedEmojiComponent',
113
+ data: {
114
+ emoji: {
115
+ id: emojiId.id,
116
+ shortName: emojiId.shortName
117
+ }
118
+ }
103
119
  }
104
120
  });
105
121
  });
@@ -131,7 +147,9 @@ var ResourcedEmojiComponent = /*#__PURE__*/function (_Component) {
131
147
  }, {
132
148
  key: "componentDidMount",
133
149
  value: function componentDidMount() {
134
- (0, _analytics.sampledUfoRenderedEmoji)(this.props.emojiId).mark(_types.UfoEmojiTimings.MOUNTED_END);
150
+ if (!(0, _ufoExperiences.hasUfoMarked)((0, _analytics.sampledUfoRenderedEmoji)(this.props.emojiId), _types.UfoEmojiTimings.FMP_END)) {
151
+ (0, _analytics.sampledUfoRenderedEmoji)(this.props.emojiId).markFMP();
152
+ }
135
153
  }
136
154
  }, {
137
155
  key: "UNSAFE_componentWillReceiveProps",
@@ -19,6 +19,12 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
19
19
 
20
20
  var _react = _interopRequireDefault(require("react"));
21
21
 
22
+ 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; } } }; }
23
+
24
+ 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); }
25
+
26
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
27
+
22
28
  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); }; }
23
29
 
24
30
  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; } }
@@ -35,10 +41,30 @@ var UfoErrorBoundary = /*#__PURE__*/function (_React$Component) {
35
41
 
36
42
  (0, _createClass2.default)(UfoErrorBoundary, [{
37
43
  key: "componentDidCatch",
38
- value: function componentDidCatch() {
39
- this.props.experiences.forEach(function (e) {
40
- return e.failure();
41
- });
44
+ value: function componentDidCatch(error, errorInfo) {
45
+ var _iterator = _createForOfIteratorHelper(this.props.experiences),
46
+ _step;
47
+
48
+ try {
49
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
50
+ var exp = _step.value;
51
+ exp.failure({
52
+ metadata: {
53
+ source: 'UfoErrorBoundary',
54
+ reason: 'error',
55
+ error: {
56
+ name: error.name,
57
+ message: error.message,
58
+ infoStack: errorInfo.componentStack
59
+ }
60
+ }
61
+ });
62
+ }
63
+ } catch (err) {
64
+ _iterator.e(err);
65
+ } finally {
66
+ _iterator.f();
67
+ }
42
68
  }
43
69
  }, {
44
70
  key: "render",
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.uploadEmoji = void 0;
7
9
 
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
8
12
  var _EmojiResource = require("../../api/EmojiResource");
9
13
 
10
14
  var _analytics = require("../../util/analytics");
@@ -13,6 +17,10 @@ var _i18n = require("../i18n");
13
17
 
14
18
  var _ufoExperiences = require("../../util/analytics/ufoExperiences");
15
19
 
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
+
22
+ 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; }
23
+
16
24
  var uploadEmoji = function uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics) {
17
25
  var startTime = Date.now();
18
26
  errorSetter(undefined);
@@ -36,7 +44,15 @@ var uploadEmoji = function uploadEmoji(upload, emojiProvider, errorSetter, onSuc
36
44
  reason: _i18n.messages.emojiUploadFailed.defaultMessage
37
45
  }));
38
46
 
39
- _ufoExperiences.ufoExperiences['emoji-uploaded'].failure();
47
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].failure({
48
+ metadata: {
49
+ source: 'UploadEmoji',
50
+ error: err,
51
+ data: {
52
+ upload: _objectSpread({}, upload)
53
+ }
54
+ }
55
+ });
40
56
  });
41
57
  }
42
58
  };
@@ -434,9 +434,19 @@ var EmojiPickerComponent = /*#__PURE__*/function (_PureComponent) {
434
434
  duration: this.calculateElapsedTime()
435
435
  }));
436
436
 
437
- _analytics.ufoExperiences['emoji-picker-opened'].abort();
437
+ _analytics.ufoExperiences['emoji-picker-opened'].abort({
438
+ metadata: {
439
+ source: 'EmojiPickerComponent',
440
+ reason: 'unmount'
441
+ }
442
+ });
438
443
 
439
- _analytics.ufoExperiences['emoji-searched'].abort();
444
+ _analytics.ufoExperiences['emoji-searched'].abort({
445
+ metadata: {
446
+ source: 'EmojiPickerComponent',
447
+ reason: 'unmount'
448
+ }
449
+ });
440
450
  }
441
451
  }, {
442
452
  key: "UNSAFE_componentWillReceiveProps",
@@ -224,9 +224,25 @@ var EmojiTypeAheadComponent = /*#__PURE__*/function (_PureComponent) {
224
224
  this.fireAnalyticsEvent((0, _analytics.typeaheadCancelledEvent)(Date.now() - this.openTime, query, emojis));
225
225
  }
226
226
 
227
- _analytics.ufoExperiences['emoji-searched'].abort();
227
+ _analytics.ufoExperiences['emoji-searched'].abort({
228
+ metadata: {
229
+ source: 'EmojiTypeAheadComponent',
230
+ reason: 'unmount',
231
+ data: {
232
+ query: query
233
+ }
234
+ }
235
+ });
228
236
 
229
- _analytics.ufoExperiences['emoji-selection-recorded'].abort();
237
+ _analytics.ufoExperiences['emoji-selection-recorded'].abort({
238
+ metadata: {
239
+ source: 'EmojiTypeAheadComponent',
240
+ reason: 'unmount',
241
+ data: {
242
+ query: query
243
+ }
244
+ }
245
+ });
230
246
 
231
247
  this.sessionId = (0, _uuid.default)();
232
248
  this.selected = false;
@@ -119,7 +119,12 @@ var EmojiUploadComponent = /*#__PURE__*/function (_PureComponent) {
119
119
  (0, _createClass2.default)(EmojiUploadComponent, [{
120
120
  key: "componentWillUnmount",
121
121
  value: function componentWillUnmount() {
122
- _ufoExperiences.ufoExperiences['emoji-uploaded'].abort();
122
+ _ufoExperiences.ufoExperiences['emoji-uploaded'].abort({
123
+ metadata: {
124
+ source: 'EmojiUploadComponent',
125
+ reason: 'unmount'
126
+ }
127
+ });
123
128
  }
124
129
  }, {
125
130
  key: "render",
package/dist/cjs/types.js CHANGED
@@ -78,6 +78,7 @@ var UfoEmojiTimingsKeys;
78
78
  exports.UfoEmojiTimingsKeys = UfoEmojiTimingsKeys;
79
79
 
80
80
  (function (UfoEmojiTimingsKeys) {
81
+ UfoEmojiTimingsKeys["FMP"] = "fmp";
81
82
  UfoEmojiTimingsKeys["MOUNTED"] = "emoji-mount";
82
83
  UfoEmojiTimingsKeys["METADATA"] = "emoji-metadata";
83
84
  UfoEmojiTimingsKeys["MEDIADATA"] = "emoji-media";
@@ -88,6 +89,7 @@ var UfoEmojiTimings;
88
89
  exports.UfoEmojiTimings = UfoEmojiTimings;
89
90
 
90
91
  (function (UfoEmojiTimings) {
92
+ UfoEmojiTimings["FMP_END"] = "fmp";
91
93
  UfoEmojiTimings["MOUNTED_END"] = "emoji-mount_end";
92
94
  UfoEmojiTimings["METADATA_START"] = "emoji-metadata_start";
93
95
  UfoEmojiTimings["METADATA_END"] = "emoji-metadata_end";
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ufoExperiences = exports.sampledUfoRenderedEmoji = void 0;
6
+ exports.ufoExperiences = exports.sampledUfoRenderedEmoji = exports.sampledUfoEmojiResourceFetched = exports.hasUfoMarked = void 0;
7
7
 
8
8
  var _types = require("../../types");
9
9
 
@@ -32,8 +32,8 @@ var createInlineExperience = function createInlineExperience(componentName) {
32
32
  };
33
33
 
34
34
  var customEmojiTimings = [{
35
- key: _types.UfoEmojiTimingsKeys.MOUNTED,
36
- endMark: _types.UfoEmojiTimings.MOUNTED_END
35
+ key: _types.UfoEmojiTimingsKeys.FMP,
36
+ endMark: _types.UfoEmojiTimings.FMP_END
37
37
  }, {
38
38
  key: _types.UfoEmojiTimingsKeys.METADATA,
39
39
  component: 'resourced-emoji',
@@ -44,6 +44,10 @@ var customEmojiTimings = [{
44
44
  component: 'caching-emoji',
45
45
  startMark: _types.UfoEmojiTimings.MEDIA_START,
46
46
  endMark: _types.UfoEmojiTimings.MEDIA_END
47
+ }, {
48
+ key: _types.UfoEmojiTimingsKeys.MOUNTED,
49
+ component: 'emoji',
50
+ endMark: _types.UfoEmojiTimings.MOUNTED_END
47
51
  }, {
48
52
  key: _types.UfoEmojiTimingsKeys.ONLOAD,
49
53
  startMark: _types.UfoEmojiTimings.ONLOAD_START,
@@ -70,4 +74,18 @@ var sampledUfoRenderedEmoji = function sampledUfoRenderedEmoji(emojiId) {
70
74
  return (0, _samplingUfo.withSampling)(ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName));
71
75
  };
72
76
 
73
- exports.sampledUfoRenderedEmoji = sampledUfoRenderedEmoji;
77
+ exports.sampledUfoRenderedEmoji = sampledUfoRenderedEmoji;
78
+
79
+ var hasUfoMarked = function hasUfoMarked(ufoExperience, name) {
80
+ return ufoExperience.metrics.marks.some(function (mask) {
81
+ return mask.name === name;
82
+ });
83
+ };
84
+
85
+ exports.hasUfoMarked = hasUfoMarked;
86
+
87
+ var sampledUfoEmojiResourceFetched = function sampledUfoEmojiResourceFetched(providerType) {
88
+ return (0, _samplingUfo.withSampling)(ufoExperiences['emoji-resource-fetched'].getInstance(providerType));
89
+ };
90
+
91
+ exports.sampledUfoEmojiResourceFetched = sampledUfoEmojiResourceFetched;
@@ -38,8 +38,9 @@ var useSampledUFOComponentExperience = function useSampledUFOComponentExperience
38
38
  (0, _samplingUfo.withSampling)(experience).start({
39
39
  samplingRate: samplingRate
40
40
  });
41
+ var isMetadataEmpty = Object.keys(experience.metadata).length === 0;
41
42
 
42
- if (metadata) {
43
+ if (metadata && isMetadataEmpty) {
43
44
  experience.addMetadata(metadata);
44
45
  }
45
46
  });
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.isIntersectionObserverSupported = void 0;
7
- var isIntersectionObserverSupported = typeof window === 'undefined' ? false : !!window.IntersectionObserver;
7
+ var isIntersectionObserverSupported = typeof window !== 'undefined' && 'IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in window.IntersectionObserverEntry.prototype;
8
8
  exports.isIntersectionObserverSupported = isIntersectionObserverSupported;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.userCustomTitle = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = exports.MAX_ORDINAL = void 0;
6
+ exports.userCustomTitle = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = exports.MAX_ORDINAL = void 0;
7
7
  var customCategory = 'CUSTOM';
8
8
  exports.customCategory = customCategory;
9
9
  var frequentCategory = 'FREQUENT';
@@ -44,9 +44,8 @@ exports.migrationUserId = migrationUserId;
44
44
  var analyticsEmojiPrefix = 'atlassian.fabric.emoji.picker'; // This is the base sampling rate in Emoji
45
45
 
46
46
  exports.analyticsEmojiPrefix = analyticsEmojiPrefix;
47
- var SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in ResourceEmoji which will be used in stead of base sampling rate above
47
+ var SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in fetching emoji resource
48
48
 
49
49
  exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = SAMPLING_RATE_EMOJI_RENDERED_EXP;
50
- var SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = 0.1; // add more sampling rate in parent components like EmojiTypeAheadItem.
51
-
52
- exports.SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI;
50
+ var SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = 0.01;
51
+ exports.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useInView = void 0;
7
+
8
+ var _reactIntersectionObserver = require("react-intersection-observer");
9
+
10
+ var _browserSupport = require("./browser-support");
11
+
12
+ var useInView = function useInView(options) {
13
+ var hookResult = (0, _reactIntersectionObserver.useInView)(options);
14
+
15
+ if (!_browserSupport.isIntersectionObserverSupported) {
16
+ // Unsupported, return no `ref` and default `inView` true value
17
+ return [undefined, true];
18
+ }
19
+
20
+ return hookResult;
21
+ };
22
+
23
+ exports.useInView = useInView;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "64.7.0",
3
+ "version": "64.7.1",
4
4
  "sideEffects": false
5
5
  }
@@ -60,7 +60,11 @@ export class EmojiResource extends AbstractResource {
60
60
  this.notifyError(reason);
61
61
  ufoExperiences['emoji-resource-fetched'].getInstance(providerType).failure({
62
62
  metadata: {
63
- reason
63
+ reason,
64
+ source: 'EmojiProvider',
65
+ data: {
66
+ providerUrl: provider.url
67
+ }
64
68
  }
65
69
  });
66
70
  });