@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
@@ -25,6 +25,7 @@ import { UfoErrorBoundary } from './UfoErrorBoundary';
25
25
  import { sampledUfoRenderedEmoji, ufoExperiences, useSampledUFOComponentExperience } from '../../util/analytics';
26
26
  import { SAMPLING_RATE_EMOJI_RENDERED_EXP } from '../../util/constants';
27
27
  import { EmojiContext } from '../../context/EmojiContext';
28
+ import { hasUfoMarked } from '../../util/analytics/ufoExperiences';
28
29
 
29
30
  /**
30
31
  * Renders an emoji from a cached image, if required.
@@ -41,7 +42,10 @@ export var CachingEmoji = function CachingEmoji(props) {
41
42
  emoji: emojiProps.emoji.shortName
42
43
  });
43
44
  useEffect(function () {
44
- sampledUfoRenderedEmoji(emojiProps.emoji).mark(UfoEmojiTimings.MOUNTED_END); // eslint-disable-next-line react-hooks/exhaustive-deps
45
+ if (!hasUfoMarked(sampledUfoRenderedEmoji(emojiProps.emoji), 'fmp')) {
46
+ sampledUfoRenderedEmoji(emojiProps.emoji).markFMP();
47
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
48
+
45
49
  }, []);
46
50
 
47
51
  var emojiNode = function emojiNode() {
@@ -76,7 +80,12 @@ export var CachingMediaEmoji = /*#__PURE__*/function (_PureComponent) {
76
80
  _defineProperty(_assertThisInitialized(_this), "handleLoadError", function (_emojiId) {
77
81
  sampledUfoRenderedEmoji(_emojiId).failure({
78
82
  metadata: {
79
- reason: 'load error'
83
+ reason: 'load error',
84
+ source: 'CachingMediaEmoji',
85
+ emoji: {
86
+ id: _emojiId.id,
87
+ shortName: _emojiId.shortName
88
+ }
80
89
  }
81
90
  });
82
91
 
@@ -139,7 +148,15 @@ export var CachingMediaEmoji = /*#__PURE__*/function (_PureComponent) {
139
148
 
140
149
  sampledUfoRenderedEmoji(emoji).failure({
141
150
  metadata: {
142
- reason: 'failed to load media emoji'
151
+ reason: 'failed to load media emoji',
152
+ source: 'CachingMediaEmoji',
153
+ data: {
154
+ emoji: {
155
+ id: emoji.id,
156
+ shortName: emoji.shortName,
157
+ name: emoji.name
158
+ }
159
+ }
143
160
  }
144
161
  });
145
162
  });
@@ -10,16 +10,16 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
10
10
  import { jsx } from '@emotion/core';
11
11
  import React, { useEffect, useCallback } from 'react';
12
12
  import { shouldUseAltRepresentation } from '../../api/EmojiUtils';
13
- import { deleteEmojiLabel } from '../../util/constants';
13
+ import { deleteEmojiLabel, SAMPLING_RATE_EMOJI_RENDERED_EXP } from '../../util/constants';
14
14
  import { isImageRepresentation, isMediaRepresentation, isSpriteRepresentation, toEmojiId } from '../../util/type-helpers';
15
15
  import { UfoEmojiTimings } from '../../types';
16
16
  import { leftClick } from '../../util/mouse';
17
17
  import DeleteButton from './DeleteButton';
18
18
  import { emojiContainer, emojiNodeStyles, commonSelectedStyles, selectOnHoverStyles, emojiSprite, emojiMainStyle, emojiStyles, emojiImage } from './styles';
19
- import { sampledUfoRenderedEmoji } from '../../util/analytics';
20
- import { EmojiPlaceholder } from '../..';
21
- import { useInView } from 'react-intersection-observer';
22
- import { isIntersectionObserverSupported } from '../../util/browser-support'; // import { isIntersectionObserverSupported } from '../../util/browser-support';
19
+ import { sampledUfoRenderedEmoji, ufoExperiences, useSampledUFOComponentExperience } from '../../util/analytics';
20
+ import { isIntersectionObserverSupported } from '../../util/browser-support';
21
+ import { useInView } from '../../util/useInView';
22
+ import { hasUfoMarked } from '../../util/analytics/ufoExperiences';
23
23
 
24
24
  var handleMouseDown = function handleMouseDown(props, event) {
25
25
  // Clicked emoji delete button
@@ -83,6 +83,7 @@ var handleImageError = function handleImageError(props, event) {
83
83
  }
84
84
  }; // Pure functional components are used in favour of class based components, due to the performance!
85
85
  // When rendering 1500+ emoji using class based components had a significant impact.
86
+ // TODO: add UFO tracking for sprite emoji
86
87
 
87
88
 
88
89
  export var SpriteEmoji = function SpriteEmoji(props) {
@@ -149,6 +150,15 @@ export var ImageEmoji = function ImageEmoji(props) {
149
150
  showTooltip = props.showTooltip,
150
151
  showDelete = props.showDelete,
151
152
  shouldBeInteractive = props.shouldBeInteractive;
153
+
154
+ var _useInView = useInView({
155
+ triggerOnce: true
156
+ }),
157
+ _useInView2 = _slicedToArray(_useInView, 2),
158
+ ref = _useInView2[0],
159
+ inView = _useInView2[1];
160
+
161
+ var ufoExp = sampledUfoRenderedEmoji(emoji);
152
162
  var classes = "".concat(emojiMainStyle, " ").concat(emojiNodeStyles, " ").concat(selected ? commonSelectedStyles : '', " ").concat(selectOnHover ? selectOnHoverStyles : '', " ").concat(emojiImage, " ").concat(className ? className : '');
153
163
  var width;
154
164
  var height;
@@ -189,21 +199,35 @@ export var ImageEmoji = function ImageEmoji(props) {
189
199
  handleImageError(props, event);
190
200
  };
191
201
 
202
+ var markStartLoadFromMountedTime = useCallback(function () {
203
+ var mountedMark = ufoExp.metrics.marks.find(function (mark) {
204
+ return mark.name === UfoEmojiTimings.MOUNTED_END;
205
+ });
206
+ ufoExp.mark(UfoEmojiTimings.ONLOAD_START, mountedMark === null || mountedMark === void 0 ? void 0 : mountedMark.time);
207
+ }, [ufoExp]);
208
+
192
209
  var onLoad = function onLoad() {
193
- sampledUfoRenderedEmoji(emoji).mark(UfoEmojiTimings.ONLOAD_END);
194
- sampledUfoRenderedEmoji(emoji).success();
210
+ // onload could trigger before onBeforeLoad when emojis in viewport at start, so we need to mark onload start manually.
211
+ if (!hasUfoMarked(ufoExp, UfoEmojiTimings.ONLOAD_START)) {
212
+ markStartLoadFromMountedTime();
213
+ }
214
+
215
+ if (!hasUfoMarked(ufoExp, UfoEmojiTimings.ONLOAD_END)) {
216
+ ufoExp.mark(UfoEmojiTimings.ONLOAD_END);
217
+ }
218
+
219
+ ufoExp.success({
220
+ metadata: {
221
+ IBSupported: isIntersectionObserverSupported
222
+ }
223
+ });
195
224
  };
196
225
 
197
226
  var onBeforeLoad = useCallback(function () {
198
- sampledUfoRenderedEmoji(emoji).mark(UfoEmojiTimings.ONLOAD_START);
199
- }, [emoji]);
200
-
201
- var _useInView = useInView({
202
- triggerOnce: true
203
- }),
204
- _useInView2 = _slicedToArray(_useInView, 2),
205
- ref = _useInView2[0],
206
- inView = _useInView2[1];
227
+ if (!hasUfoMarked(ufoExp, UfoEmojiTimings.ONLOAD_START)) {
228
+ ufoExp.mark(UfoEmojiTimings.ONLOAD_START);
229
+ }
230
+ }, [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.
207
231
 
208
232
  useEffect(function () {
209
233
  if (inView) {
@@ -226,26 +250,6 @@ export var ImageEmoji = function ImageEmoji(props) {
226
250
  onError: onError,
227
251
  onLoad: onLoad
228
252
  }, sizing));
229
- var placeholder = jsx(EmojiPlaceholder, {
230
- shortName: emoji.shortName,
231
- size: fitToHeight,
232
- showTooltip: showTooltip,
233
- representation: emoji.representation
234
- });
235
-
236
- var renderLazyLoadedEmoji = function renderLazyLoadedEmoji() {
237
- // if browser not supported, render emoji node directly
238
- if (!isIntersectionObserverSupported) {
239
- return emojiNode;
240
- }
241
-
242
- if (inView) {
243
- return emojiNode;
244
- }
245
-
246
- return placeholder;
247
- };
248
-
249
253
  return jsx("span", {
250
254
  "data-testid": "image-emoji-".concat(emoji.shortName),
251
255
  "data-emoji-type": "image",
@@ -265,10 +269,27 @@ export var ImageEmoji = function ImageEmoji(props) {
265
269
  "aria-label": emoji.shortName,
266
270
  title: showTooltip ? emoji.shortName : '',
267
271
  ref: ref
268
- }, deleteButton, renderLazyLoadedEmoji());
272
+ }, deleteButton, emojiNode);
269
273
  };
270
274
  export var Emoji = function Emoji(props) {
271
- var emoji = props.emoji; // TODO: We always prefer render as image as having accessibility issues with sprite representation
275
+ var emoji = props.emoji; // start emoji rendered experience, it may have already started earlier in ResourcedEmoji or CachingEmoji
276
+
277
+ useSampledUFOComponentExperience(ufoExperiences['emoji-rendered'].getInstance(emoji.id || emoji.shortName), SAMPLING_RATE_EMOJI_RENDERED_EXP, {
278
+ source: 'emoji',
279
+ emoji: emoji.shortName
280
+ });
281
+ useEffect(function () {
282
+ var ufoExp = sampledUfoRenderedEmoji(emoji);
283
+
284
+ if (!hasUfoMarked(ufoExp, 'fmp')) {
285
+ ufoExp.markFMP();
286
+ }
287
+
288
+ if (!hasUfoMarked(ufoExp, UfoEmojiTimings.MOUNTED_END)) {
289
+ ufoExp.mark(UfoEmojiTimings.MOUNTED_END);
290
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
291
+
292
+ }, []); // TODO: We always prefer render as image as having accessibility issues with sprite representation
272
293
 
273
294
  if (isSpriteRepresentation(emoji.representation)) {
274
295
  return jsx(SpriteEmoji, props);
@@ -0,0 +1,84 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+
3
+ /** @jsx jsx */
4
+ import { jsx } from '@emotion/core';
5
+ import { useMemo, useState } from 'react';
6
+ import { emojiContainer, emojiImage, emojiMainStyle, emojiNodeStyles, emojiStyles } from './styles';
7
+ import { defaultEmojiHeight } from '../../util/constants';
8
+ export var EmojiImage = function EmojiImage(props) {
9
+ var _props$maxSize = props.maxSize,
10
+ maxSize = _props$maxSize === void 0 ? defaultEmojiHeight : _props$maxSize,
11
+ representation = props.representation,
12
+ showTooltip = props.showTooltip,
13
+ imageUrl = props.imageUrl,
14
+ showImageBeforeLoad = props.showImageBeforeLoad,
15
+ emojiId = props.emojiId,
16
+ onImageLoadError = props.onImageLoadError;
17
+ var shortName = emojiId.shortName;
18
+
19
+ var _useState = useState(false),
20
+ _useState2 = _slicedToArray(_useState, 2),
21
+ validImage = _useState2[0],
22
+ setValidImage = _useState2[1];
23
+
24
+ var imageSize = useMemo(function () {
25
+ if (representation) {
26
+ return {
27
+ width: maxSize / (representation.height * representation.width),
28
+ height: maxSize
29
+ };
30
+ }
31
+
32
+ return {
33
+ width: maxSize,
34
+ height: maxSize
35
+ };
36
+ }, [maxSize, representation]);
37
+ var style = {
38
+ minWidth: "".concat(imageSize.width, "px"),
39
+ width: "".concat(imageSize.width, "px"),
40
+ height: "".concat(imageSize.height, "px")
41
+ };
42
+
43
+ var handleImageLoad = function handleImageLoad() {
44
+ return setValidImage(true);
45
+ };
46
+
47
+ var handleImageLoadError = function handleImageLoadError() {
48
+ setValidImage(false);
49
+
50
+ if (onImageLoadError) {
51
+ onImageLoadError();
52
+ }
53
+ };
54
+
55
+ var visibility = useMemo(function () {
56
+ return showImageBeforeLoad || validImage ? 'initial' : 'hidden';
57
+ }, [validImage, showImageBeforeLoad]);
58
+ return jsx("span", {
59
+ "data-testid": "emoji-image-".concat(shortName),
60
+ "aria-label": shortName,
61
+ className: "".concat(emojiMainStyle, " ").concat(emojiNodeStyles, " ").concat(emojiImage),
62
+ style: style,
63
+ css: [emojiContainer, emojiStyles],
64
+ title: showTooltip ? shortName : ''
65
+ }, jsx("img", {
66
+ className: "emoji",
67
+ alt: shortName,
68
+ onLoad: function onLoad() {
69
+ return handleImageLoad();
70
+ },
71
+ onError: function onError() {
72
+ return handleImageLoadError();
73
+ },
74
+ src: imageUrl,
75
+ style: {
76
+ objectFit: 'contain',
77
+ visibility: visibility
78
+ },
79
+ width: imageSize.width,
80
+ height: imageSize.height //@ts-ignore
81
+ ,
82
+ loading: "lazy"
83
+ }));
84
+ };
@@ -1,19 +1,20 @@
1
1
  /** @jsx jsx */
2
2
  import { jsx } from '@emotion/core';
3
- import { placeholder, placeholderContainer } from './styles';
3
+ import { placeholder, placeholderContainer, placeholderContainerAnimated } from './styles';
4
4
  import { defaultEmojiHeight } from '../../util/constants';
5
- import { isImageRepresentation, isMediaRepresentation } from '../../util/type-helpers';
6
5
 
7
6
  var EmojiPlaceholder = function EmojiPlaceholder(props) {
8
7
  var shortName = props.shortName,
9
8
  _props$size = props.size,
10
9
  size = _props$size === void 0 ? defaultEmojiHeight : _props$size,
11
10
  showTooltip = props.showTooltip,
12
- representation = props.representation;
11
+ representation = props.representation,
12
+ _props$loading = props.loading,
13
+ loading = _props$loading === void 0 ? false : _props$loading;
13
14
  var scaledWidth;
14
15
  var scaledHeight;
15
16
 
16
- if (representation && size && (isImageRepresentation(representation) || isMediaRepresentation(representation))) {
17
+ if (representation && size) {
17
18
  var _width = representation.width;
18
19
  var _height = representation.height;
19
20
 
@@ -27,14 +28,16 @@ var EmojiPlaceholder = function EmojiPlaceholder(props) {
27
28
  var height = scaledHeight || size;
28
29
  var style = {
29
30
  fill: 'f7f7f7',
31
+ minWidth: "".concat(width, "px"),
30
32
  width: "".concat(width, "px"),
31
33
  height: "".concat(height, "px")
32
34
  };
33
35
  return jsx("span", {
34
36
  "data-testid": "emoji-placeholder-".concat(shortName),
37
+ "aria-busy": loading,
35
38
  "aria-label": shortName,
36
39
  className: placeholder,
37
- css: placeholderContainer,
40
+ css: loading ? [placeholderContainer, placeholderContainerAnimated] : placeholderContainer,
38
41
  style: style,
39
42
  title: showTooltip ? shortName : ''
40
43
  });
@@ -18,7 +18,19 @@ export var createRecordSelectionDefault = function createRecordSelectionDefault(
18
18
  ufoExperiences['emoji-selection-recorded'].success();
19
19
  }).catch(function () {
20
20
  fireAnalytics && fireAnalytics(recordFailed);
21
- ufoExperiences['emoji-selection-recorded'].failure();
21
+ ufoExperiences['emoji-selection-recorded'].failure({
22
+ metadata: {
23
+ reason: 'recordSelection error',
24
+ source: 'RecordSelectionDefault',
25
+ data: {
26
+ emoji: {
27
+ id: emoji.id,
28
+ name: emoji.name,
29
+ shortName: emoji.shortName
30
+ }
31
+ }
32
+ }
33
+ });
22
34
  });
23
35
  }
24
36
  } finally {
@@ -14,7 +14,7 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
14
14
  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; } }
15
15
 
16
16
  import React from 'react';
17
- import { defaultEmojiHeight, SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI } from '../../util/constants';
17
+ import { defaultEmojiHeight, SAMPLING_RATE_EMOJI_RENDERED_EXP } from '../../util/constants';
18
18
  import EmojiPlaceholder from './EmojiPlaceholder';
19
19
  import LoadingEmojiComponent from './LoadingEmojiComponent';
20
20
  import { sampledUfoRenderedEmoji, ufoExperiences } from '../../util/analytics';
@@ -28,7 +28,7 @@ var resourcedEmojiModuleLoader = function resourcedEmojiModuleLoader() {
28
28
 
29
29
  var resourcedEmojiComponentLoader = function resourcedEmojiComponentLoader() {
30
30
  return resourcedEmojiModuleLoader().then(function (module) {
31
- return module.default;
31
+ return module.ResourcedEmojiComponent;
32
32
  });
33
33
  };
34
34
 
@@ -51,10 +51,11 @@ var ResourcedEmoji = /*#__PURE__*/function (_LoadingEmojiComponen) {
51
51
  });
52
52
 
53
53
  sampledUfoRenderedEmoji(props.emojiId).start({
54
- samplingRate: SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI
54
+ samplingRate: SAMPLING_RATE_EMOJI_RENDERED_EXP
55
55
  });
56
56
  ufoExperiences['emoji-rendered'].getInstance(props.emojiId.id || props.emojiId.shortName).addMetadata({
57
- source: 'resourced-emoji'
57
+ source: 'resourced-emoji',
58
+ emoji: props.emojiId.shortName
58
59
  });
59
60
  return _this;
60
61
  }
@@ -62,7 +63,16 @@ var ResourcedEmoji = /*#__PURE__*/function (_LoadingEmojiComponen) {
62
63
  _createClass(ResourcedEmoji, [{
63
64
  key: "componentWillUnmount",
64
65
  value: function componentWillUnmount() {
65
- sampledUfoRenderedEmoji(this.props.emojiId).abort();
66
+ sampledUfoRenderedEmoji(this.props.emojiId).abort({
67
+ metadata: {
68
+ source: 'ResourcedEmoji',
69
+ reason: 'unmount',
70
+ data: {
71
+ emojiId: this.props.emojiId.id,
72
+ shortName: this.props.emojiId.shortName
73
+ }
74
+ }
75
+ });
66
76
  }
67
77
  }, {
68
78
  key: "asyncLoadComponent",