@atlaskit/emoji 64.7.0 → 65.1.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 (122) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/cjs/api/EmojiResource.js +250 -87
  3. package/dist/cjs/api/media/SiteEmojiResource.js +4 -2
  4. package/dist/cjs/api/media/TokenManager.js +13 -12
  5. package/dist/cjs/components/common/CachingEmoji.js +21 -3
  6. package/dist/cjs/components/common/Emoji.js +57 -36
  7. package/dist/cjs/components/common/EmojiImage.js +99 -0
  8. package/dist/cjs/components/common/EmojiPlaceholder.js +7 -5
  9. package/dist/cjs/components/common/RecordSelectionDefault.js +13 -1
  10. package/dist/cjs/components/common/ResourcedEmoji.js +14 -4
  11. package/dist/cjs/components/common/ResourcedEmojiComponent.js +173 -156
  12. package/dist/cjs/components/common/UfoErrorBoundary.js +30 -4
  13. package/dist/cjs/components/common/UploadEmoji.js +8 -3
  14. package/dist/cjs/components/common/styles.js +26 -9
  15. package/dist/cjs/components/picker/EmojiPickerComponent.js +27 -9
  16. package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -0
  17. package/dist/cjs/components/picker/styles.js +16 -13
  18. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  19. package/dist/cjs/components/uploader/EmojiUploadComponent.js +7 -2
  20. package/dist/cjs/context/EmojiContextProvider.js +33 -0
  21. package/dist/cjs/hooks/index.js +16 -0
  22. package/dist/cjs/index.js +20 -0
  23. package/dist/cjs/types.js +3 -0
  24. package/dist/cjs/util/analytics/samplingUfo.js +13 -3
  25. package/dist/cjs/util/analytics/ufoExperiences.js +22 -4
  26. package/dist/cjs/util/analytics/useSampledUFOComponentExperience.js +2 -1
  27. package/dist/cjs/util/browser-support.js +1 -1
  28. package/dist/cjs/util/constants.js +6 -5
  29. package/dist/cjs/util/useInView.js +23 -0
  30. package/dist/cjs/version.json +1 -1
  31. package/dist/es2019/api/EmojiResource.js +117 -37
  32. package/dist/es2019/api/media/SiteEmojiResource.js +2 -2
  33. package/dist/es2019/api/media/TokenManager.js +12 -12
  34. package/dist/es2019/components/common/CachingEmoji.js +20 -3
  35. package/dist/es2019/components/common/Emoji.js +53 -34
  36. package/dist/es2019/components/common/EmojiImage.js +74 -0
  37. package/dist/es2019/components/common/EmojiPlaceholder.js +7 -5
  38. package/dist/es2019/components/common/RecordSelectionDefault.js +13 -1
  39. package/dist/es2019/components/common/ResourcedEmoji.js +15 -5
  40. package/dist/es2019/components/common/ResourcedEmojiComponent.js +136 -105
  41. package/dist/es2019/components/common/UfoErrorBoundary.js +14 -2
  42. package/dist/es2019/components/common/UploadEmoji.js +8 -3
  43. package/dist/es2019/components/common/styles.js +30 -9
  44. package/dist/es2019/components/picker/EmojiPickerComponent.js +27 -8
  45. package/dist/es2019/components/picker/EmojiPickerFooter.js +2 -0
  46. package/dist/es2019/components/picker/styles.js +16 -14
  47. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  48. package/dist/es2019/components/uploader/EmojiUploadComponent.js +7 -2
  49. package/dist/es2019/context/EmojiContextProvider.js +9 -1
  50. package/dist/es2019/hooks/index.js +8 -0
  51. package/dist/es2019/index.js +5 -4
  52. package/dist/es2019/types.js +3 -0
  53. package/dist/es2019/util/analytics/samplingUfo.js +11 -1
  54. package/dist/es2019/util/analytics/ufoExperiences.js +12 -2
  55. package/dist/es2019/util/analytics/useSampledUFOComponentExperience.js +2 -1
  56. package/dist/es2019/util/browser-support.js +1 -1
  57. package/dist/es2019/util/constants.js +3 -2
  58. package/dist/es2019/util/useInView.js +12 -0
  59. package/dist/es2019/version.json +1 -1
  60. package/dist/esm/api/EmojiResource.js +257 -89
  61. package/dist/esm/api/media/SiteEmojiResource.js +5 -3
  62. package/dist/esm/api/media/TokenManager.js +13 -12
  63. package/dist/esm/components/common/CachingEmoji.js +20 -3
  64. package/dist/esm/components/common/Emoji.js +59 -38
  65. package/dist/esm/components/common/EmojiImage.js +84 -0
  66. package/dist/esm/components/common/EmojiPlaceholder.js +8 -5
  67. package/dist/esm/components/common/RecordSelectionDefault.js +13 -1
  68. package/dist/esm/components/common/ResourcedEmoji.js +15 -5
  69. package/dist/esm/components/common/ResourcedEmojiComponent.js +167 -156
  70. package/dist/esm/components/common/UfoErrorBoundary.js +30 -4
  71. package/dist/esm/components/common/UploadEmoji.js +8 -3
  72. package/dist/esm/components/common/styles.js +25 -10
  73. package/dist/esm/components/picker/EmojiPickerComponent.js +27 -8
  74. package/dist/esm/components/picker/EmojiPickerFooter.js +2 -0
  75. package/dist/esm/components/picker/styles.js +16 -14
  76. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  77. package/dist/esm/components/uploader/EmojiUploadComponent.js +7 -2
  78. package/dist/esm/context/EmojiContextProvider.js +30 -1
  79. package/dist/esm/hooks/index.js +8 -0
  80. package/dist/esm/index.js +5 -4
  81. package/dist/esm/types.js +3 -0
  82. package/dist/esm/util/analytics/samplingUfo.js +13 -2
  83. package/dist/esm/util/analytics/ufoExperiences.js +14 -2
  84. package/dist/esm/util/analytics/useSampledUFOComponentExperience.js +2 -1
  85. package/dist/esm/util/browser-support.js +1 -1
  86. package/dist/esm/util/constants.js +3 -2
  87. package/dist/esm/util/useInView.js +12 -0
  88. package/dist/esm/version.json +1 -1
  89. package/dist/types/api/EmojiResource.d.ts +19 -2
  90. package/dist/types/api/EmojiUtils.d.ts +7 -1
  91. package/dist/types/api/media/SiteEmojiResource.d.ts +1 -1
  92. package/dist/types/api/media/TokenManager.d.ts +1 -0
  93. package/dist/types/components/common/Emoji.d.ts +0 -1
  94. package/dist/types/components/common/EmojiImage.d.ts +13 -0
  95. package/dist/types/components/common/EmojiPlaceholder.d.ts +1 -0
  96. package/dist/types/components/common/LoadingEmojiComponent.d.ts +7 -4
  97. package/dist/types/components/common/ResourcedEmoji.d.ts +3 -3
  98. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +41 -20
  99. package/dist/types/components/common/UfoErrorBoundary.d.ts +2 -2
  100. package/dist/types/components/common/UploadEmoji.d.ts +1 -1
  101. package/dist/types/components/common/styles.d.ts +1 -0
  102. package/dist/types/components/picker/EmojiPicker.d.ts +9 -0
  103. package/dist/types/components/picker/EmojiPickerComponent.d.ts +14 -0
  104. package/dist/types/components/picker/EmojiPickerFooter.d.ts +1 -0
  105. package/dist/types/components/picker/styles.d.ts +1 -1
  106. package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +18 -0
  107. package/dist/types/hooks/index.d.ts +1 -0
  108. package/dist/types/index.d.ts +5 -4
  109. package/dist/types/types.d.ts +14 -2
  110. package/dist/types/util/analytics/index.d.ts +1 -1
  111. package/dist/types/util/analytics/samplingUfo.d.ts +6 -6
  112. package/dist/types/util/analytics/ufoExperiences.d.ts +5 -2
  113. package/dist/types/util/constants.d.ts +2 -1
  114. package/dist/types/util/useInView.d.ts +4 -0
  115. package/docs/0-intro.tsx +35 -27
  116. package/docs/1-resourced-emoji.tsx +74 -0
  117. package/docs/2-emoji-picker.tsx +56 -0
  118. package/docs/3-typeahead.tsx +20 -0
  119. package/docs/4-emoji-provider.tsx +98 -0
  120. package/local-config-example.ts +22 -1
  121. package/package.json +4 -4
  122. package/report.api.md +1287 -0
@@ -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);
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.EmojiImage = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _core = require("@emotion/core");
13
+
14
+ var _react = require("react");
15
+
16
+ var _styles = require("./styles");
17
+
18
+ var _constants = require("../../util/constants");
19
+
20
+ /** @jsx jsx */
21
+ var EmojiImage = function EmojiImage(props) {
22
+ var _props$maxSize = props.maxSize,
23
+ maxSize = _props$maxSize === void 0 ? _constants.defaultEmojiHeight : _props$maxSize,
24
+ representation = props.representation,
25
+ showTooltip = props.showTooltip,
26
+ imageUrl = props.imageUrl,
27
+ showImageBeforeLoad = props.showImageBeforeLoad,
28
+ emojiId = props.emojiId,
29
+ onImageLoadError = props.onImageLoadError;
30
+ var shortName = emojiId.shortName;
31
+
32
+ var _useState = (0, _react.useState)(false),
33
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
34
+ validImage = _useState2[0],
35
+ setValidImage = _useState2[1];
36
+
37
+ var imageSize = (0, _react.useMemo)(function () {
38
+ if (representation) {
39
+ return {
40
+ width: maxSize / (representation.height * representation.width),
41
+ height: maxSize
42
+ };
43
+ }
44
+
45
+ return {
46
+ width: maxSize,
47
+ height: maxSize
48
+ };
49
+ }, [maxSize, representation]);
50
+ var style = {
51
+ minWidth: "".concat(imageSize.width, "px"),
52
+ width: "".concat(imageSize.width, "px"),
53
+ height: "".concat(imageSize.height, "px")
54
+ };
55
+
56
+ var handleImageLoad = function handleImageLoad() {
57
+ return setValidImage(true);
58
+ };
59
+
60
+ var handleImageLoadError = function handleImageLoadError() {
61
+ setValidImage(false);
62
+
63
+ if (onImageLoadError) {
64
+ onImageLoadError();
65
+ }
66
+ };
67
+
68
+ var visibility = (0, _react.useMemo)(function () {
69
+ return showImageBeforeLoad || validImage ? 'initial' : 'hidden';
70
+ }, [validImage, showImageBeforeLoad]);
71
+ return (0, _core.jsx)("span", {
72
+ "data-testid": "emoji-image-".concat(shortName),
73
+ "aria-label": shortName,
74
+ className: "".concat(_styles.emojiMainStyle, " ").concat(_styles.emojiNodeStyles, " ").concat(_styles.emojiImage),
75
+ style: style,
76
+ css: [_styles.emojiContainer, _styles.emojiStyles],
77
+ title: showTooltip ? shortName : ''
78
+ }, (0, _core.jsx)("img", {
79
+ className: "emoji",
80
+ alt: shortName,
81
+ onLoad: function onLoad() {
82
+ return handleImageLoad();
83
+ },
84
+ onError: function onError() {
85
+ return handleImageLoadError();
86
+ },
87
+ src: imageUrl,
88
+ style: {
89
+ objectFit: 'contain',
90
+ visibility: visibility
91
+ },
92
+ width: imageSize.width,
93
+ height: imageSize.height //@ts-ignore
94
+ ,
95
+ loading: "lazy"
96
+ }));
97
+ };
98
+
99
+ exports.EmojiImage = EmojiImage;
@@ -11,19 +11,19 @@ var _styles = require("./styles");
11
11
 
12
12
  var _constants = require("../../util/constants");
13
13
 
14
- var _typeHelpers = require("../../util/type-helpers");
15
-
16
14
  /** @jsx jsx */
17
15
  var EmojiPlaceholder = function EmojiPlaceholder(props) {
18
16
  var shortName = props.shortName,
19
17
  _props$size = props.size,
20
18
  size = _props$size === void 0 ? _constants.defaultEmojiHeight : _props$size,
21
19
  showTooltip = props.showTooltip,
22
- representation = props.representation;
20
+ representation = props.representation,
21
+ _props$loading = props.loading,
22
+ loading = _props$loading === void 0 ? false : _props$loading;
23
23
  var scaledWidth;
24
24
  var scaledHeight;
25
25
 
26
- if (representation && size && ((0, _typeHelpers.isImageRepresentation)(representation) || (0, _typeHelpers.isMediaRepresentation)(representation))) {
26
+ if (representation && size) {
27
27
  var _width = representation.width;
28
28
  var _height = representation.height;
29
29
 
@@ -37,14 +37,16 @@ var EmojiPlaceholder = function EmojiPlaceholder(props) {
37
37
  var height = scaledHeight || size;
38
38
  var style = {
39
39
  fill: 'f7f7f7',
40
+ minWidth: "".concat(width, "px"),
40
41
  width: "".concat(width, "px"),
41
42
  height: "".concat(height, "px")
42
43
  };
43
44
  return (0, _core.jsx)("span", {
44
45
  "data-testid": "emoji-placeholder-".concat(shortName),
46
+ "aria-busy": loading,
45
47
  "aria-label": shortName,
46
48
  className: _styles.placeholder,
47
- css: _styles.placeholderContainer,
49
+ css: loading ? [_styles.placeholderContainer, _styles.placeholderContainerAnimated] : _styles.placeholderContainer,
48
50
  style: style,
49
51
  title: showTooltip ? shortName : ''
50
52
  });
@@ -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 {
@@ -57,7 +57,7 @@ var resourcedEmojiModuleLoader = function resourcedEmojiModuleLoader() {
57
57
 
58
58
  var resourcedEmojiComponentLoader = function resourcedEmojiComponentLoader() {
59
59
  return resourcedEmojiModuleLoader().then(function (module) {
60
- return module.default;
60
+ return module.ResourcedEmojiComponent;
61
61
  });
62
62
  };
63
63
 
@@ -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",