@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
|
@@ -2,13 +2,13 @@ import { supportsUploadFeature } from '../../api/EmojiResource';
|
|
|
2
2
|
import { uploadFailedEvent, uploadSucceededEvent } from '../../util/analytics';
|
|
3
3
|
import { messages } from '../i18n';
|
|
4
4
|
import { ufoExperiences } from '../../util/analytics/ufoExperiences';
|
|
5
|
-
export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireAnalytics) => {
|
|
5
|
+
export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry) => {
|
|
6
6
|
const startTime = Date.now();
|
|
7
7
|
errorSetter(undefined);
|
|
8
8
|
|
|
9
9
|
if (supportsUploadFeature(emojiProvider)) {
|
|
10
10
|
ufoExperiences['emoji-uploaded'].start();
|
|
11
|
-
emojiProvider.uploadCustomEmoji(upload).then(emojiDescription => {
|
|
11
|
+
emojiProvider.uploadCustomEmoji(upload, retry).then(emojiDescription => {
|
|
12
12
|
fireAnalytics(uploadSucceededEvent({
|
|
13
13
|
duration: Date.now() - startTime
|
|
14
14
|
}));
|
|
@@ -22,7 +22,12 @@ export const uploadEmoji = (upload, emojiProvider, errorSetter, onSuccess, fireA
|
|
|
22
22
|
duration: Date.now() - startTime,
|
|
23
23
|
reason: messages.emojiUploadFailed.defaultMessage
|
|
24
24
|
}));
|
|
25
|
-
ufoExperiences['emoji-uploaded'].failure(
|
|
25
|
+
ufoExperiences['emoji-uploaded'].failure({
|
|
26
|
+
metadata: {
|
|
27
|
+
source: 'UploadEmoji',
|
|
28
|
+
error: err
|
|
29
|
+
}
|
|
30
|
+
});
|
|
26
31
|
});
|
|
27
32
|
}
|
|
28
33
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { css } from '@emotion/core';
|
|
1
|
+
import { css, keyframes } from '@emotion/core';
|
|
2
2
|
import { borderRadius } from '@atlaskit/theme/constants';
|
|
3
3
|
import { token } from '@atlaskit/tokens';
|
|
4
4
|
import { defaultEmojiHeight } from '../../util/constants';
|
|
5
5
|
import { akEmojiSelectedBackgroundColor } from '../../util/shared-styles';
|
|
6
|
-
import { N20, N200, N300, N900, R300, R400 } from '@atlaskit/theme/colors';
|
|
6
|
+
import { N20, N200, N20A, N300, N900, R300, R400 } from '@atlaskit/theme/colors';
|
|
7
7
|
export const commonSelectedStyles = 'emoji-common-selected';
|
|
8
8
|
export const selectOnHoverStyles = 'emoji-common-select-on-hover';
|
|
9
9
|
export const emojiSprite = 'emoji-common-emoji-sprite';
|
|
@@ -31,7 +31,7 @@ export const emojiToneSelectorContainer = css({
|
|
|
31
31
|
padding: '8px 10px 8px 0'
|
|
32
32
|
});
|
|
33
33
|
export const emojiStyles = css({
|
|
34
|
-
borderRadius:
|
|
34
|
+
borderRadius: `${borderRadius()}px`,
|
|
35
35
|
backgroundColor: 'transparent',
|
|
36
36
|
display: 'inline-block',
|
|
37
37
|
verticalAlign: 'middle',
|
|
@@ -60,20 +60,41 @@ export const emojiContainer = css({
|
|
|
60
60
|
[`.${emojiSprite}`]: {
|
|
61
61
|
background: 'transparent no-repeat',
|
|
62
62
|
display: 'inline-block',
|
|
63
|
-
verticalAlign: 'middle',
|
|
64
63
|
minHeight: `${defaultEmojiHeight}px`,
|
|
65
|
-
minWidth: `${defaultEmojiHeight}px
|
|
64
|
+
minWidth: `${defaultEmojiHeight}px`,
|
|
65
|
+
verticalAlign: 'middle'
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
68
|
export const placeholder = 'emoji-common-placeholder';
|
|
69
69
|
export const placeholderContainer = css({
|
|
70
|
-
|
|
70
|
+
position: 'relative',
|
|
71
71
|
margin: '-1px 0',
|
|
72
72
|
display: 'inline-block',
|
|
73
73
|
background: token('color.border', '#f7f7f7'),
|
|
74
|
-
borderRadius:
|
|
74
|
+
borderRadius: `${borderRadius()}px`,
|
|
75
|
+
overflow: 'hidden',
|
|
75
76
|
verticalAlign: 'middle',
|
|
76
|
-
whiteSpace: 'nowrap'
|
|
77
|
+
whiteSpace: 'nowrap',
|
|
78
|
+
textAlign: 'center'
|
|
79
|
+
});
|
|
80
|
+
const easeSweep = keyframes`
|
|
81
|
+
from {
|
|
82
|
+
transform: translateX(-100%);
|
|
83
|
+
}
|
|
84
|
+
to {
|
|
85
|
+
transform: translateX(100%);
|
|
86
|
+
}
|
|
87
|
+
`;
|
|
88
|
+
export const placeholderContainerAnimated = css({
|
|
89
|
+
'&::before': {
|
|
90
|
+
content: '""',
|
|
91
|
+
display: 'block',
|
|
92
|
+
position: 'absolute',
|
|
93
|
+
background: token('color.background.neutral', N20A),
|
|
94
|
+
height: '100%',
|
|
95
|
+
width: '100%',
|
|
96
|
+
animation: `${easeSweep} 1s cubic-bezier(0.4, 0.0, 0.2, 1) infinite`
|
|
97
|
+
}
|
|
77
98
|
});
|
|
78
99
|
export const emojiButton = css({
|
|
79
100
|
backgroundColor: 'transparent',
|
|
@@ -87,7 +108,7 @@ export const emojiButton = css({
|
|
|
87
108
|
padding: 0
|
|
88
109
|
},
|
|
89
110
|
'&>span': {
|
|
90
|
-
borderRadius:
|
|
111
|
+
borderRadius: `${borderRadius()}px`,
|
|
91
112
|
padding: '8px',
|
|
92
113
|
// Scale sprite to fit regardless of default emoji size
|
|
93
114
|
[`&>.${emojiSprite}`]: {
|
|
@@ -81,6 +81,12 @@ export default class EmojiPickerComponent extends PureComponent {
|
|
|
81
81
|
});
|
|
82
82
|
});
|
|
83
83
|
|
|
84
|
+
_defineProperty(this, "onPreviewDisplayed", isDisplayed => {
|
|
85
|
+
this.setState({
|
|
86
|
+
isPreviewDisplayed: isDisplayed
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
84
90
|
_defineProperty(this, "onFileChooserClicked", () => {
|
|
85
91
|
this.fireAnalytics(selectedFileEvent());
|
|
86
92
|
});
|
|
@@ -247,7 +253,7 @@ export default class EmojiPickerComponent extends PureComponent {
|
|
|
247
253
|
this.scrollToEndOfList();
|
|
248
254
|
};
|
|
249
255
|
|
|
250
|
-
uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, this.fireAnalytics);
|
|
256
|
+
uploadEmoji(upload, emojiProvider, errorSetter, onSuccess, this.fireAnalytics, retry);
|
|
251
257
|
});
|
|
252
258
|
|
|
253
259
|
_defineProperty(this, "onTriggerDelete", (_emojiId, emoji) => {
|
|
@@ -353,18 +359,19 @@ export default class EmojiPickerComponent extends PureComponent {
|
|
|
353
359
|
selectedTone: !hideToneSelector ? _emojiProvider.getSelectedTone() : undefined,
|
|
354
360
|
loading: true,
|
|
355
361
|
uploadSupported: false,
|
|
356
|
-
uploading: false
|
|
362
|
+
uploading: false,
|
|
363
|
+
isPreviewDisplayed: false
|
|
357
364
|
};
|
|
358
365
|
this.openTime = 0;
|
|
359
366
|
}
|
|
360
367
|
|
|
361
368
|
UNSAFE_componentWillMount() {
|
|
369
|
+
ufoExperiences['emoji-picker-opened'].success();
|
|
362
370
|
this.openTime = Date.now();
|
|
363
371
|
this.fireAnalytics(openedPickerEvent());
|
|
364
372
|
}
|
|
365
373
|
|
|
366
374
|
componentDidMount() {
|
|
367
|
-
ufoExperiences['emoji-picker-opened'].success();
|
|
368
375
|
const {
|
|
369
376
|
emojiProvider,
|
|
370
377
|
hideToneSelector
|
|
@@ -399,8 +406,18 @@ export default class EmojiPickerComponent extends PureComponent {
|
|
|
399
406
|
this.fireAnalytics(closedPickerEvent({
|
|
400
407
|
duration: this.calculateElapsedTime()
|
|
401
408
|
}));
|
|
402
|
-
ufoExperiences['emoji-picker-opened'].abort(
|
|
403
|
-
|
|
409
|
+
ufoExperiences['emoji-picker-opened'].abort({
|
|
410
|
+
metadata: {
|
|
411
|
+
source: 'EmojiPickerComponent',
|
|
412
|
+
reason: 'unmount'
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
ufoExperiences['emoji-searched'].abort({
|
|
416
|
+
metadata: {
|
|
417
|
+
source: 'EmojiPickerComponent',
|
|
418
|
+
reason: 'unmount'
|
|
419
|
+
}
|
|
420
|
+
});
|
|
404
421
|
}
|
|
405
422
|
|
|
406
423
|
UNSAFE_componentWillReceiveProps(nextProps) {
|
|
@@ -515,7 +532,8 @@ export default class EmojiPickerComponent extends PureComponent {
|
|
|
515
532
|
emojiToDelete,
|
|
516
533
|
uploading,
|
|
517
534
|
uploadErrorMessage,
|
|
518
|
-
uploadSupported
|
|
535
|
+
uploadSupported,
|
|
536
|
+
isPreviewDisplayed
|
|
519
537
|
} = this.state;
|
|
520
538
|
const recordUsageOnSelection = createRecordSelectionDefault(emojiProvider, this.onSelectWrapper, analytic => this.fireAnalytics(analytic('picker')));
|
|
521
539
|
const formattedErrorMessage = uploadErrorMessage ? jsx(FormattedMessage, uploadErrorMessage) : null;
|
|
@@ -527,7 +545,7 @@ export default class EmojiPickerComponent extends PureComponent {
|
|
|
527
545
|
const picker = jsx(LegacyEmojiContextProvider, {
|
|
528
546
|
emojiContextValue: emojiContextValue
|
|
529
547
|
}, jsx("div", {
|
|
530
|
-
css: emojiPicker,
|
|
548
|
+
css: emojiPicker(isPreviewDisplayed),
|
|
531
549
|
ref: this.handlePickerRef,
|
|
532
550
|
"data-emoji-picker-container": true
|
|
533
551
|
}, jsx(CategorySelector, {
|
|
@@ -563,7 +581,8 @@ export default class EmojiPickerComponent extends PureComponent {
|
|
|
563
581
|
onOpenUpload: this.onOpenUpload
|
|
564
582
|
}), jsx(EmojiPickerFooter, {
|
|
565
583
|
selectedEmoji: selectedEmoji,
|
|
566
|
-
isUploading: uploading
|
|
584
|
+
isUploading: uploading,
|
|
585
|
+
onPreviewDisplayed: this.onPreviewDisplayed
|
|
567
586
|
})));
|
|
568
587
|
return picker;
|
|
569
588
|
}
|
|
@@ -12,9 +12,11 @@ export default class EmojiPickerFooter extends PureComponent {
|
|
|
12
12
|
const previewFooterClassnames = [emojiPickerFooter, emojiPickerFooterWithTopShadow];
|
|
13
13
|
|
|
14
14
|
if (!selectedEmoji || isUploading) {
|
|
15
|
+
this.props.onPreviewDisplayed(false);
|
|
15
16
|
return null;
|
|
16
17
|
}
|
|
17
18
|
|
|
19
|
+
this.props.onPreviewDisplayed(true);
|
|
18
20
|
return jsx("div", {
|
|
19
21
|
css: previewFooterClassnames
|
|
20
22
|
}, selectedEmoji && jsx(EmojiPreviewComponent, {
|
|
@@ -3,22 +3,24 @@ import { token } from '@atlaskit/tokens';
|
|
|
3
3
|
import { borderRadius } from '@atlaskit/theme/constants';
|
|
4
4
|
import { emojiPickerBorderColor, emojiPickerBoxShadow } from '../../util/shared-styles';
|
|
5
5
|
import { emojiSprite, placeholder, emojiNodeStyles } from '../common/styles';
|
|
6
|
-
import { emojiPickerHeight, emojiPickerWidth } from '../../util/constants';
|
|
6
|
+
import { emojiPickerHeight, emojiPickerHeightWithPreview, emojiPickerWidth } from '../../util/constants';
|
|
7
7
|
import { B200, B300, N100A, N200, N30, N30A, N50, N900 } from '@atlaskit/theme/colors'; // Level 1 - picker
|
|
8
8
|
|
|
9
|
-
export const emojiPicker =
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
9
|
+
export const emojiPicker = hasPreview => {
|
|
10
|
+
return css({
|
|
11
|
+
display: 'flex',
|
|
12
|
+
flexDirection: 'column',
|
|
13
|
+
justifyContent: 'space-between',
|
|
14
|
+
background: token('elevation.surface.overlay', 'white'),
|
|
15
|
+
border: `${emojiPickerBorderColor} 1px solid`,
|
|
16
|
+
borderRadius: `${borderRadius()}px`,
|
|
17
|
+
boxShadow: emojiPickerBoxShadow,
|
|
18
|
+
height: `${hasPreview ? emojiPickerHeightWithPreview : emojiPickerHeight}px`,
|
|
19
|
+
width: `${emojiPickerWidth}px`,
|
|
20
|
+
marginBottom: '8px',
|
|
21
|
+
minWidth: `${emojiPickerWidth}px`
|
|
22
|
+
});
|
|
23
|
+
}; // Level 2
|
|
22
24
|
/// Category Selector
|
|
23
25
|
|
|
24
26
|
export const addButton = 'emoji-picker-add-button';
|
|
@@ -172,8 +172,24 @@ export default class EmojiTypeAheadComponent extends PureComponent {
|
|
|
172
172
|
this.fireAnalyticsEvent(typeaheadCancelledEvent(Date.now() - this.openTime, query, emojis));
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
-
ufoExperiences['emoji-searched'].abort(
|
|
176
|
-
|
|
175
|
+
ufoExperiences['emoji-searched'].abort({
|
|
176
|
+
metadata: {
|
|
177
|
+
source: 'EmojiTypeAheadComponent',
|
|
178
|
+
reason: 'unmount',
|
|
179
|
+
data: {
|
|
180
|
+
query
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
ufoExperiences['emoji-selection-recorded'].abort({
|
|
185
|
+
metadata: {
|
|
186
|
+
source: 'EmojiTypeAheadComponent',
|
|
187
|
+
reason: 'unmount',
|
|
188
|
+
data: {
|
|
189
|
+
query
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
177
193
|
this.sessionId = uuid();
|
|
178
194
|
this.selected = false;
|
|
179
195
|
}
|
|
@@ -32,7 +32,7 @@ export default class EmojiUploadComponent extends PureComponent {
|
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
uploadEmoji(upload, emojiProvider, errorSetter, this.prepareForUpload, this.fireAnalytics);
|
|
35
|
+
uploadEmoji(upload, emojiProvider, errorSetter, this.prepareForUpload, this.fireAnalytics, retry);
|
|
36
36
|
});
|
|
37
37
|
|
|
38
38
|
_defineProperty(this, "prepareForUpload", () => {
|
|
@@ -84,7 +84,12 @@ export default class EmojiUploadComponent extends PureComponent {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
componentWillUnmount() {
|
|
87
|
-
ufoExperiences['emoji-uploaded'].abort(
|
|
87
|
+
ufoExperiences['emoji-uploaded'].abort({
|
|
88
|
+
metadata: {
|
|
89
|
+
source: 'EmojiUploadComponent',
|
|
90
|
+
reason: 'unmount'
|
|
91
|
+
}
|
|
92
|
+
});
|
|
88
93
|
}
|
|
89
94
|
|
|
90
95
|
render() {
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
1
|
+
import React, { useMemo, useEffect } from 'react';
|
|
2
2
|
import { EmojiContext } from './EmojiContext';
|
|
3
3
|
export const EmojiContextProvider = ({
|
|
4
4
|
children,
|
|
5
5
|
emojiContextValue
|
|
6
6
|
}) => {
|
|
7
7
|
const memoizedEmojiContextValue = useMemo(() => emojiContextValue, [emojiContextValue]);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
// trigger emoji fetching
|
|
10
|
+
async function fetchEmojiProvider() {
|
|
11
|
+
await (memoizedEmojiContextValue === null || memoizedEmojiContextValue === void 0 ? void 0 : memoizedEmojiContextValue.emoji.emojiProvider.fetchEmojiProvider());
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
fetchEmojiProvider();
|
|
15
|
+
}, [memoizedEmojiContextValue]);
|
|
8
16
|
return /*#__PURE__*/React.createElement(EmojiContext.Provider, {
|
|
9
17
|
value: memoizedEmojiContextValue
|
|
10
18
|
}, children);
|
package/dist/es2019/index.js
CHANGED
|
@@ -6,19 +6,20 @@ import EmojiPicker from './components/picker/EmojiPicker';
|
|
|
6
6
|
import EmojiUploader from './components/uploader/EmojiUploader';
|
|
7
7
|
import EmojiTypeAhead from './components/typeahead/EmojiTypeAhead';
|
|
8
8
|
import EmojiTypeAheadItem from './components/typeahead/EmojiTypeAheadItem';
|
|
9
|
+
import { EmojiImage } from './components/common/EmojiImage';
|
|
9
10
|
export { // renaming exports to prevent breaking changes due to renaming
|
|
10
|
-
commonSelectedStyles as selected, selectOnHoverStyles as selectOnHover, emojiSprite, emojiNodeStyles as emojiNode, emojiImage } from './components/common/styles';
|
|
11
|
+
commonSelectedStyles as selected, selectOnHoverStyles as selectOnHover, emojiSprite, emojiNodeStyles as emojiNode, emojiImage, placeholder as emojiPlaceholder } from './components/common/styles';
|
|
11
12
|
import EmojiResource from './api/EmojiResource';
|
|
12
13
|
import EmojiRepository from './api/EmojiRepository';
|
|
13
14
|
import EmojiLoader from './api/EmojiLoader';
|
|
14
15
|
import { denormaliseEmojiServiceResponse } from './api/EmojiUtils';
|
|
15
16
|
import { toEmojiId, toOptionalEmojiId } from './util/type-helpers';
|
|
16
|
-
import { recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences } from './util/analytics';
|
|
17
|
+
import { recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, withSampling } from './util/analytics';
|
|
17
18
|
import { customCategory, defaultEmojiHeight, emojiPickerWidth, emojiPickerHeight } from './util/constants';
|
|
18
19
|
import { UsageFrequencyTracker } from './api/internal/UsageFrequencyTracker';
|
|
19
20
|
export { // Classes
|
|
20
|
-
AbstractResource, Emoji, EmojiPlaceholder, EmojiLoader, EmojiPicker, EmojiUploader, EmojiResource, EmojiRepository, EmojiTypeAhead, ResourcedEmoji, // functions
|
|
21
|
-
denormaliseEmojiServiceResponse, toEmojiId, toOptionalEmojiId, recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, // Constants
|
|
21
|
+
AbstractResource, Emoji, EmojiPlaceholder, EmojiLoader, EmojiPicker, EmojiUploader, EmojiResource, EmojiRepository, EmojiTypeAhead, EmojiImage, ResourcedEmoji, // functions
|
|
22
|
+
denormaliseEmojiServiceResponse, toEmojiId, toOptionalEmojiId, recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, withSampling, // Constants
|
|
22
23
|
emojiPickerWidth, emojiPickerHeight, defaultEmojiHeight, customCategory, UsageFrequencyTracker, EmojiTypeAheadItem };
|
|
23
24
|
export { // Enums
|
|
24
25
|
SearchSort, UfoExperienceName, UfoComponentName } from './types';
|
package/dist/es2019/types.js
CHANGED
|
@@ -42,6 +42,7 @@ export let ProviderTypes;
|
|
|
42
42
|
ProviderTypes["STANDARD"] = "STANDARD";
|
|
43
43
|
ProviderTypes["ATLASSIAN"] = "ATLASSIAN";
|
|
44
44
|
ProviderTypes["UNKNOWN"] = "UNKNOWN";
|
|
45
|
+
ProviderTypes["SINGLE"] = "SINGLE";
|
|
45
46
|
})(ProviderTypes || (ProviderTypes = {}));
|
|
46
47
|
|
|
47
48
|
export let UfoExperienceName;
|
|
@@ -66,6 +67,7 @@ export let UfoComponentName;
|
|
|
66
67
|
export let UfoEmojiTimingsKeys;
|
|
67
68
|
|
|
68
69
|
(function (UfoEmojiTimingsKeys) {
|
|
70
|
+
UfoEmojiTimingsKeys["FMP"] = "fmp";
|
|
69
71
|
UfoEmojiTimingsKeys["MOUNTED"] = "emoji-mount";
|
|
70
72
|
UfoEmojiTimingsKeys["METADATA"] = "emoji-metadata";
|
|
71
73
|
UfoEmojiTimingsKeys["MEDIADATA"] = "emoji-media";
|
|
@@ -75,6 +77,7 @@ export let UfoEmojiTimingsKeys;
|
|
|
75
77
|
export let UfoEmojiTimings;
|
|
76
78
|
|
|
77
79
|
(function (UfoEmojiTimings) {
|
|
80
|
+
UfoEmojiTimings["FMP_END"] = "fmp";
|
|
78
81
|
UfoEmojiTimings["MOUNTED_END"] = "emoji-mount_end";
|
|
79
82
|
UfoEmojiTimings["METADATA_START"] = "emoji-metadata_start";
|
|
80
83
|
UfoEmojiTimings["METADATA_END"] = "emoji-metadata_end";
|
|
@@ -42,7 +42,6 @@ const hasSampledFromStart = experience => {
|
|
|
42
42
|
|
|
43
43
|
return ufoExperiencesSampled[experience.id].sampled;
|
|
44
44
|
};
|
|
45
|
-
|
|
46
45
|
/**
|
|
47
46
|
* This function is a temp solution to reduce the event traffic, as UFO package does not support it.
|
|
48
47
|
*
|
|
@@ -50,6 +49,8 @@ const hasSampledFromStart = experience => {
|
|
|
50
49
|
* @param ufoExperience
|
|
51
50
|
* @returns
|
|
52
51
|
*/
|
|
52
|
+
|
|
53
|
+
|
|
53
54
|
export const withSampling = ufoExperience => {
|
|
54
55
|
const init = () => {
|
|
55
56
|
if (!ufoExperiencesSampled[ufoExperience.id]) {
|
|
@@ -110,6 +111,14 @@ export const withSampling = ufoExperience => {
|
|
|
110
111
|
return ufoExperience.abort(config);
|
|
111
112
|
};
|
|
112
113
|
|
|
114
|
+
const addMetadata = data => {
|
|
115
|
+
if (!hasSampledFromStart(ufoExperience)) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return ufoExperience.addMetadata(data);
|
|
120
|
+
};
|
|
121
|
+
|
|
113
122
|
const mark = (name, timestamp) => {
|
|
114
123
|
if (!hasSampledFromStart(ufoExperience)) {
|
|
115
124
|
return;
|
|
@@ -137,6 +146,7 @@ export const withSampling = ufoExperience => {
|
|
|
137
146
|
init();
|
|
138
147
|
return { ...ufoExperience,
|
|
139
148
|
start,
|
|
149
|
+
addMetadata,
|
|
140
150
|
success,
|
|
141
151
|
failure,
|
|
142
152
|
abort,
|
|
@@ -23,8 +23,8 @@ const createInlineExperience = componentName => {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
const customEmojiTimings = [{
|
|
26
|
-
key: UfoEmojiTimingsKeys.
|
|
27
|
-
endMark: UfoEmojiTimings.
|
|
26
|
+
key: UfoEmojiTimingsKeys.FMP,
|
|
27
|
+
endMark: UfoEmojiTimings.FMP_END
|
|
28
28
|
}, {
|
|
29
29
|
key: UfoEmojiTimingsKeys.METADATA,
|
|
30
30
|
component: 'resourced-emoji',
|
|
@@ -35,6 +35,10 @@ const customEmojiTimings = [{
|
|
|
35
35
|
component: 'caching-emoji',
|
|
36
36
|
startMark: UfoEmojiTimings.MEDIA_START,
|
|
37
37
|
endMark: UfoEmojiTimings.MEDIA_END
|
|
38
|
+
}, {
|
|
39
|
+
key: UfoEmojiTimingsKeys.MOUNTED,
|
|
40
|
+
component: 'emoji',
|
|
41
|
+
endMark: UfoEmojiTimings.MOUNTED_END
|
|
38
42
|
}, {
|
|
39
43
|
key: UfoEmojiTimingsKeys.ONLOAD,
|
|
40
44
|
startMark: UfoEmojiTimings.ONLOAD_START,
|
|
@@ -57,4 +61,10 @@ export const ufoExperiences = {
|
|
|
57
61
|
};
|
|
58
62
|
export const sampledUfoRenderedEmoji = emojiId => {
|
|
59
63
|
return withSampling(ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName));
|
|
64
|
+
};
|
|
65
|
+
export const hasUfoMarked = (ufoExperience, name) => {
|
|
66
|
+
return ufoExperience.metrics.marks.some(mask => mask.name === name);
|
|
67
|
+
};
|
|
68
|
+
export const sampledUfoEmojiResourceFetched = providerType => {
|
|
69
|
+
return withSampling(ufoExperiences['emoji-resource-fetched'].getInstance(providerType));
|
|
60
70
|
};
|
|
@@ -30,8 +30,9 @@ export const useSampledUFOComponentExperience = (experience, samplingRate, metad
|
|
|
30
30
|
withSampling(experience).start({
|
|
31
31
|
samplingRate
|
|
32
32
|
});
|
|
33
|
+
const isMetadataEmpty = Object.keys(experience.metadata).length === 0;
|
|
33
34
|
|
|
34
|
-
if (metadata) {
|
|
35
|
+
if (metadata && isMetadataEmpty) {
|
|
35
36
|
experience.addMetadata(metadata);
|
|
36
37
|
}
|
|
37
38
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const isIntersectionObserverSupported = typeof window
|
|
1
|
+
export const isIntersectionObserverSupported = typeof window !== 'undefined' && 'IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in window.IntersectionObserverEntry.prototype;
|
|
@@ -14,6 +14,7 @@ export const MAX_ORDINAL = 100000;
|
|
|
14
14
|
export const defaultEmojiHeight = 20;
|
|
15
15
|
export const emojiPickerWidth = 350;
|
|
16
16
|
export const emojiPickerHeight = 295;
|
|
17
|
+
export const emojiPickerHeightWithPreview = 348;
|
|
17
18
|
export const localStoragePrefix = 'fabric.emoji';
|
|
18
19
|
export const selectedToneStorageKey = `${localStoragePrefix}.selectedTone`;
|
|
19
20
|
export const defaultCategories = ['PEOPLE', 'NATURE', 'FOODS', 'ACTIVITY', 'PLACES', 'OBJECTS', 'SYMBOLS', 'FLAGS'];
|
|
@@ -21,6 +22,6 @@ export const defaultListLimit = 50;
|
|
|
21
22
|
export const migrationUserId = 'hipchat_migration_emoticons';
|
|
22
23
|
export const analyticsEmojiPrefix = 'atlassian.fabric.emoji.picker'; // This is the base sampling rate in Emoji
|
|
23
24
|
|
|
24
|
-
export const SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in
|
|
25
|
+
export const SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05; // This rate is used in fetching emoji resource
|
|
25
26
|
|
|
26
|
-
export const
|
|
27
|
+
export const SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = 0.01;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useInView as useInViewLib } from 'react-intersection-observer';
|
|
2
|
+
import { isIntersectionObserverSupported } from './browser-support';
|
|
3
|
+
export const useInView = options => {
|
|
4
|
+
const hookResult = useInViewLib(options);
|
|
5
|
+
|
|
6
|
+
if (!isIntersectionObserverSupported) {
|
|
7
|
+
// Unsupported, return no `ref` and default `inView` true value
|
|
8
|
+
return [undefined, true];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return hookResult;
|
|
12
|
+
};
|
package/dist/es2019/version.json
CHANGED