@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.
- package/CHANGELOG.md +36 -0
- package/dist/cjs/api/EmojiResource.js +250 -87
- package/dist/cjs/api/media/SiteEmojiResource.js +4 -2
- package/dist/cjs/api/media/TokenManager.js +13 -12
- package/dist/cjs/components/common/CachingEmoji.js +21 -3
- package/dist/cjs/components/common/Emoji.js +57 -36
- package/dist/cjs/components/common/EmojiImage.js +99 -0
- package/dist/cjs/components/common/EmojiPlaceholder.js +7 -5
- package/dist/cjs/components/common/RecordSelectionDefault.js +13 -1
- package/dist/cjs/components/common/ResourcedEmoji.js +14 -4
- package/dist/cjs/components/common/ResourcedEmojiComponent.js +173 -156
- package/dist/cjs/components/common/UfoErrorBoundary.js +30 -4
- package/dist/cjs/components/common/UploadEmoji.js +8 -3
- package/dist/cjs/components/common/styles.js +26 -9
- package/dist/cjs/components/picker/EmojiPickerComponent.js +27 -9
- package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/cjs/components/picker/styles.js +16 -13
- package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +18 -2
- package/dist/cjs/components/uploader/EmojiUploadComponent.js +7 -2
- package/dist/cjs/context/EmojiContextProvider.js +33 -0
- package/dist/cjs/hooks/index.js +16 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/util/analytics/samplingUfo.js +13 -3
- package/dist/cjs/util/analytics/ufoExperiences.js +22 -4
- package/dist/cjs/util/analytics/useSampledUFOComponentExperience.js +2 -1
- package/dist/cjs/util/browser-support.js +1 -1
- package/dist/cjs/util/constants.js +6 -5
- package/dist/cjs/util/useInView.js +23 -0
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/api/EmojiResource.js +117 -37
- package/dist/es2019/api/media/SiteEmojiResource.js +2 -2
- package/dist/es2019/api/media/TokenManager.js +12 -12
- package/dist/es2019/components/common/CachingEmoji.js +20 -3
- package/dist/es2019/components/common/Emoji.js +53 -34
- package/dist/es2019/components/common/EmojiImage.js +74 -0
- package/dist/es2019/components/common/EmojiPlaceholder.js +7 -5
- package/dist/es2019/components/common/RecordSelectionDefault.js +13 -1
- package/dist/es2019/components/common/ResourcedEmoji.js +15 -5
- package/dist/es2019/components/common/ResourcedEmojiComponent.js +136 -105
- package/dist/es2019/components/common/UfoErrorBoundary.js +14 -2
- package/dist/es2019/components/common/UploadEmoji.js +8 -3
- package/dist/es2019/components/common/styles.js +30 -9
- package/dist/es2019/components/picker/EmojiPickerComponent.js +27 -8
- package/dist/es2019/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/es2019/components/picker/styles.js +16 -14
- package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +18 -2
- package/dist/es2019/components/uploader/EmojiUploadComponent.js +7 -2
- package/dist/es2019/context/EmojiContextProvider.js +9 -1
- package/dist/es2019/hooks/index.js +8 -0
- package/dist/es2019/index.js +5 -4
- package/dist/es2019/types.js +3 -0
- package/dist/es2019/util/analytics/samplingUfo.js +11 -1
- package/dist/es2019/util/analytics/ufoExperiences.js +12 -2
- package/dist/es2019/util/analytics/useSampledUFOComponentExperience.js +2 -1
- package/dist/es2019/util/browser-support.js +1 -1
- package/dist/es2019/util/constants.js +3 -2
- package/dist/es2019/util/useInView.js +12 -0
- package/dist/es2019/version.json +1 -1
- package/dist/esm/api/EmojiResource.js +257 -89
- package/dist/esm/api/media/SiteEmojiResource.js +5 -3
- package/dist/esm/api/media/TokenManager.js +13 -12
- package/dist/esm/components/common/CachingEmoji.js +20 -3
- package/dist/esm/components/common/Emoji.js +59 -38
- package/dist/esm/components/common/EmojiImage.js +84 -0
- package/dist/esm/components/common/EmojiPlaceholder.js +8 -5
- package/dist/esm/components/common/RecordSelectionDefault.js +13 -1
- package/dist/esm/components/common/ResourcedEmoji.js +15 -5
- package/dist/esm/components/common/ResourcedEmojiComponent.js +167 -156
- package/dist/esm/components/common/UfoErrorBoundary.js +30 -4
- package/dist/esm/components/common/UploadEmoji.js +8 -3
- package/dist/esm/components/common/styles.js +25 -10
- package/dist/esm/components/picker/EmojiPickerComponent.js +27 -8
- package/dist/esm/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/esm/components/picker/styles.js +16 -14
- package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +18 -2
- package/dist/esm/components/uploader/EmojiUploadComponent.js +7 -2
- package/dist/esm/context/EmojiContextProvider.js +30 -1
- package/dist/esm/hooks/index.js +8 -0
- package/dist/esm/index.js +5 -4
- package/dist/esm/types.js +3 -0
- package/dist/esm/util/analytics/samplingUfo.js +13 -2
- package/dist/esm/util/analytics/ufoExperiences.js +14 -2
- package/dist/esm/util/analytics/useSampledUFOComponentExperience.js +2 -1
- package/dist/esm/util/browser-support.js +1 -1
- package/dist/esm/util/constants.js +3 -2
- package/dist/esm/util/useInView.js +12 -0
- package/dist/esm/version.json +1 -1
- package/dist/types/api/EmojiResource.d.ts +19 -2
- package/dist/types/api/EmojiUtils.d.ts +7 -1
- package/dist/types/api/media/SiteEmojiResource.d.ts +1 -1
- package/dist/types/api/media/TokenManager.d.ts +1 -0
- package/dist/types/components/common/Emoji.d.ts +0 -1
- package/dist/types/components/common/EmojiImage.d.ts +13 -0
- package/dist/types/components/common/EmojiPlaceholder.d.ts +1 -0
- package/dist/types/components/common/LoadingEmojiComponent.d.ts +7 -4
- package/dist/types/components/common/ResourcedEmoji.d.ts +3 -3
- package/dist/types/components/common/ResourcedEmojiComponent.d.ts +41 -20
- package/dist/types/components/common/UfoErrorBoundary.d.ts +2 -2
- package/dist/types/components/common/UploadEmoji.d.ts +1 -1
- package/dist/types/components/common/styles.d.ts +1 -0
- package/dist/types/components/picker/EmojiPicker.d.ts +9 -0
- package/dist/types/components/picker/EmojiPickerComponent.d.ts +14 -0
- package/dist/types/components/picker/EmojiPickerFooter.d.ts +1 -0
- package/dist/types/components/picker/styles.d.ts +1 -1
- package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +18 -0
- package/dist/types/hooks/index.d.ts +1 -0
- package/dist/types/index.d.ts +5 -4
- package/dist/types/types.d.ts +14 -2
- package/dist/types/util/analytics/index.d.ts +1 -1
- package/dist/types/util/analytics/samplingUfo.d.ts +6 -6
- package/dist/types/util/analytics/ufoExperiences.d.ts +5 -2
- package/dist/types/util/constants.d.ts +2 -1
- package/dist/types/util/useInView.d.ts +4 -0
- package/docs/0-intro.tsx +35 -27
- package/docs/1-resourced-emoji.tsx +74 -0
- package/docs/2-emoji-picker.tsx +56 -0
- package/docs/3-typeahead.tsx +20 -0
- package/docs/4-emoji-provider.tsx +98 -0
- package/local-config-example.ts +22 -1
- package/package.json +4 -4
- 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)
|
|
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 {
|
|
21
|
-
import { useInView } from '
|
|
22
|
-
import {
|
|
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
|
-
|
|
194
|
-
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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,
|
|
272
|
+
}, deleteButton, emojiNode);
|
|
269
273
|
};
|
|
270
274
|
export var Emoji = function Emoji(props) {
|
|
271
|
-
var emoji = props.emoji; //
|
|
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
|
|
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,
|
|
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.
|
|
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:
|
|
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",
|