@atlaskit/emoji 65.1.1 → 65.2.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 +19 -0
- package/dist/cjs/components/common/CachingEmoji.js +84 -151
- package/dist/cjs/components/common/Emoji.js +2 -2
- package/dist/cjs/components/common/EmojiActions.js +129 -175
- package/dist/cjs/components/common/EmojiErrorMessage.js +23 -59
- package/dist/cjs/components/common/EmojiPreviewComponent.js +1 -0
- package/dist/cjs/components/common/EmojiUploadPicker.js +235 -293
- package/dist/cjs/components/common/FileChooser.js +34 -71
- package/dist/cjs/components/common/Popup.js +105 -154
- package/dist/cjs/components/common/RetryableButton.js +43 -64
- package/dist/cjs/components/common/ToneSelector.js +50 -89
- package/dist/cjs/components/common/styles.js +14 -16
- package/dist/cjs/components/hooks.js +16 -0
- package/dist/cjs/components/picker/EmojiPickerCategoryHeading.js +16 -48
- package/dist/cjs/components/picker/EmojiPickerComponent.js +496 -516
- package/dist/cjs/components/picker/EmojiPickerEmojiRow.js +33 -60
- package/dist/cjs/components/picker/EmojiPickerFooter.js +13 -48
- package/dist/cjs/components/uploader/EmojiUploadComponent.js +124 -109
- package/dist/cjs/hooks/useEmojiContext.js +16 -0
- package/dist/cjs/hooks/{index.js → usePrevious.js} +0 -0
- package/dist/cjs/index.js +16 -0
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/components/common/CachingEmoji.js +65 -112
- package/dist/es2019/components/common/Emoji.js +2 -2
- package/dist/es2019/components/common/EmojiActions.js +124 -150
- package/dist/es2019/components/common/EmojiErrorMessage.js +22 -26
- package/dist/es2019/components/common/EmojiPreviewComponent.js +1 -0
- package/dist/es2019/components/common/EmojiUploadPicker.js +190 -253
- package/dist/es2019/components/common/FileChooser.js +37 -40
- package/dist/es2019/components/common/Popup.js +89 -109
- package/dist/es2019/components/common/RetryableButton.js +43 -34
- package/dist/es2019/components/common/ToneSelector.js +46 -59
- package/dist/es2019/components/common/styles.js +9 -9
- package/dist/es2019/components/hooks.js +8 -0
- package/dist/es2019/components/picker/EmojiPickerCategoryHeading.js +13 -17
- package/dist/es2019/components/picker/EmojiPickerComponent.js +417 -506
- package/dist/es2019/components/picker/EmojiPickerEmojiRow.js +32 -35
- package/dist/es2019/components/picker/EmojiPickerFooter.js +11 -21
- package/dist/es2019/components/uploader/EmojiUploadComponent.js +81 -91
- package/dist/es2019/hooks/useEmojiContext.js +3 -0
- package/dist/es2019/hooks/{index.js → usePrevious.js} +0 -0
- package/dist/es2019/index.js +4 -1
- package/dist/es2019/version.json +1 -1
- package/dist/esm/components/common/CachingEmoji.js +86 -156
- package/dist/esm/components/common/Emoji.js +2 -2
- package/dist/esm/components/common/EmojiActions.js +129 -176
- package/dist/esm/components/common/EmojiErrorMessage.js +21 -56
- package/dist/esm/components/common/EmojiPreviewComponent.js +1 -0
- package/dist/esm/components/common/EmojiUploadPicker.js +233 -299
- package/dist/esm/components/common/FileChooser.js +34 -70
- package/dist/esm/components/common/Popup.js +104 -155
- package/dist/esm/components/common/RetryableButton.js +40 -60
- package/dist/esm/components/common/ToneSelector.js +50 -87
- package/dist/esm/components/common/styles.js +10 -10
- package/dist/esm/components/hooks.js +8 -0
- package/dist/esm/components/picker/EmojiPickerCategoryHeading.js +14 -43
- package/dist/esm/components/picker/EmojiPickerComponent.js +486 -535
- package/dist/esm/components/picker/EmojiPickerEmojiRow.js +31 -59
- package/dist/esm/components/picker/EmojiPickerFooter.js +14 -49
- package/dist/esm/components/uploader/EmojiUploadComponent.js +119 -113
- package/dist/esm/hooks/useEmojiContext.js +5 -0
- package/dist/esm/hooks/{index.js → usePrevious.js} +0 -0
- package/dist/esm/index.js +4 -1
- package/dist/esm/version.json +1 -1
- package/dist/types/components/common/CachingEmoji.d.ts +3 -13
- package/dist/types/components/common/Emoji.d.ts +1 -1
- package/dist/types/components/common/EmojiActions.d.ts +6 -17
- package/dist/types/components/common/EmojiErrorMessage.d.ts +3 -6
- package/dist/types/components/common/EmojiPreviewComponent.d.ts +2 -2
- package/dist/types/components/common/EmojiUploadPicker.d.ts +3 -27
- package/dist/types/components/common/FileChooser.d.ts +3 -5
- package/dist/types/components/common/Popup.d.ts +3 -20
- package/dist/types/components/common/RetryableButton.d.ts +3 -7
- package/dist/types/components/common/ToneSelector.d.ts +4 -10
- package/dist/types/components/common/setSkinToneAriaLabelText.d.ts +1 -1
- package/dist/types/components/common/styles.d.ts +1 -3
- package/dist/types/components/hooks.d.ts +1 -0
- package/dist/types/components/picker/CategorySelector.d.ts +1 -1
- package/dist/types/components/picker/EmojiPicker.d.ts +3 -3
- package/dist/types/components/picker/EmojiPickerCategoryHeading.d.ts +3 -4
- package/dist/types/components/picker/EmojiPickerComponent.d.ts +4 -80
- package/dist/types/components/picker/EmojiPickerEmojiRow.d.ts +3 -4
- package/dist/types/components/picker/EmojiPickerFooter.d.ts +3 -6
- package/dist/types/components/uploader/EmojiUploadComponent.d.ts +3 -17
- package/dist/types/components/uploader/EmojiUploader.d.ts +5 -7
- package/dist/types/hooks/useEmojiContext.d.ts +1 -0
- package/dist/types/hooks/{index.d.ts → usePrevious.d.ts} +0 -0
- package/dist/types/index.d.ts +3 -1
- package/dist/types/types.d.ts +2 -1
- package/local-config-example.ts +3 -1
- package/package.json +17 -4
- package/dist/cjs/components/common/EmojiPreview.js +0 -194
- package/dist/es2019/components/common/EmojiPreview.js +0 -152
- package/dist/esm/components/common/EmojiPreview.js +0 -170
- package/dist/types/components/common/EmojiPreview.d.ts +0 -31
|
@@ -1,40 +1,37 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
import { jsx } from '@emotion/core';
|
|
3
|
-
import {
|
|
3
|
+
import { memo } from 'react';
|
|
4
4
|
import CachingEmoji from '../common/CachingEmoji';
|
|
5
5
|
import { emojiItem, emojiPickerRow } from './styles';
|
|
6
|
-
export default class EmojiPickerEmojiRow extends PureComponent {
|
|
7
|
-
render() {
|
|
8
|
-
const {
|
|
9
|
-
emojis,
|
|
10
|
-
onSelected,
|
|
11
|
-
onMouseMove,
|
|
12
|
-
title,
|
|
13
|
-
showDelete,
|
|
14
|
-
onDelete
|
|
15
|
-
} = this.props;
|
|
16
|
-
return jsx("div", {
|
|
17
|
-
css: emojiPickerRow
|
|
18
|
-
}, emojis.map(emoji => {
|
|
19
|
-
const {
|
|
20
|
-
shortName,
|
|
21
|
-
id
|
|
22
|
-
} = emoji;
|
|
23
|
-
const key = id ? `${id}-${title}` : `${shortName}-${title}`;
|
|
24
|
-
return jsx("span", {
|
|
25
|
-
css: emojiItem,
|
|
26
|
-
key: key
|
|
27
|
-
}, jsx(CachingEmoji, {
|
|
28
|
-
emoji: emoji,
|
|
29
|
-
selectOnHover: true,
|
|
30
|
-
onSelected: onSelected,
|
|
31
|
-
onMouseMove: onMouseMove,
|
|
32
|
-
showDelete: showDelete,
|
|
33
|
-
onDelete: onDelete,
|
|
34
|
-
placeholderSize: 24,
|
|
35
|
-
shouldBeInteractive: true
|
|
36
|
-
}));
|
|
37
|
-
}));
|
|
38
|
-
}
|
|
39
6
|
|
|
40
|
-
|
|
7
|
+
const EmojiPickerEmojiRow = ({
|
|
8
|
+
emojis,
|
|
9
|
+
onSelected,
|
|
10
|
+
onMouseMove,
|
|
11
|
+
title,
|
|
12
|
+
showDelete,
|
|
13
|
+
onDelete
|
|
14
|
+
}) => jsx("div", {
|
|
15
|
+
css: emojiPickerRow
|
|
16
|
+
}, emojis.map(emoji => {
|
|
17
|
+
const {
|
|
18
|
+
shortName,
|
|
19
|
+
id
|
|
20
|
+
} = emoji;
|
|
21
|
+
const key = id ? `${id}-${title}` : `${shortName}-${title}`;
|
|
22
|
+
return jsx("span", {
|
|
23
|
+
css: emojiItem,
|
|
24
|
+
key: key
|
|
25
|
+
}, jsx(CachingEmoji, {
|
|
26
|
+
emoji: emoji,
|
|
27
|
+
selectOnHover: true,
|
|
28
|
+
onSelected: onSelected,
|
|
29
|
+
onMouseMove: onMouseMove,
|
|
30
|
+
showDelete: showDelete,
|
|
31
|
+
onDelete: onDelete,
|
|
32
|
+
placeholderSize: 24,
|
|
33
|
+
shouldBeInteractive: true
|
|
34
|
+
}));
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
export default /*#__PURE__*/memo(EmojiPickerEmojiRow);
|
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
/** @jsx jsx */
|
|
2
2
|
import { jsx } from '@emotion/core';
|
|
3
|
-
import {
|
|
3
|
+
import { memo } from 'react';
|
|
4
4
|
import { EmojiPreviewComponent } from '../common/EmojiPreviewComponent';
|
|
5
5
|
import { emojiPickerFooter, emojiPickerFooterWithTopShadow } from './styles';
|
|
6
|
-
|
|
7
|
-
render() {
|
|
8
|
-
const {
|
|
9
|
-
selectedEmoji,
|
|
10
|
-
isUploading
|
|
11
|
-
} = this.props;
|
|
12
|
-
const previewFooterClassnames = [emojiPickerFooter, emojiPickerFooterWithTopShadow];
|
|
6
|
+
const previewFooterClassnames = [emojiPickerFooter, emojiPickerFooterWithTopShadow];
|
|
13
7
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
const EmojiPickerFooter = ({
|
|
9
|
+
selectedEmoji
|
|
10
|
+
}) => jsx("div", {
|
|
11
|
+
css: previewFooterClassnames,
|
|
12
|
+
"data-testid": "emoji-picker-footer"
|
|
13
|
+
}, selectedEmoji && jsx(EmojiPreviewComponent, {
|
|
14
|
+
emoji: selectedEmoji
|
|
15
|
+
}));
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
return jsx("div", {
|
|
21
|
-
css: previewFooterClassnames
|
|
22
|
-
}, selectedEmoji && jsx(EmojiPreviewComponent, {
|
|
23
|
-
emoji: selectedEmoji
|
|
24
|
-
}));
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
}
|
|
17
|
+
export default /*#__PURE__*/memo(EmojiPickerFooter);
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
-
|
|
3
1
|
/** @jsx jsx */
|
|
4
2
|
import { jsx } from '@emotion/core';
|
|
5
|
-
import {
|
|
3
|
+
import { useState, memo, useEffect } from 'react';
|
|
6
4
|
import { FormattedMessage } from 'react-intl-next';
|
|
7
5
|
import { supportsUploadFeature } from '../../api/EmojiResource';
|
|
8
6
|
import EmojiUploadPickerWithIntl from '../common/EmojiUploadPicker';
|
|
@@ -10,105 +8,97 @@ import { uploadEmoji } from '../common/UploadEmoji';
|
|
|
10
8
|
import { createAndFireEventInElementsChannel, selectedFileEvent, uploadCancelButton, uploadConfirmButton } from '../../util/analytics';
|
|
11
9
|
import { emojiUploadFooter, emojiUploadWidget } from './styles';
|
|
12
10
|
import { ufoExperiences } from '../../util/analytics/ufoExperiences';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
uploadEmoji(upload, emojiProvider, errorSetter, this.prepareForUpload, this.fireAnalytics, retry);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
_defineProperty(this, "prepareForUpload", () => {
|
|
39
|
-
const {
|
|
40
|
-
emojiProvider
|
|
41
|
-
} = this.props;
|
|
42
|
-
|
|
43
|
-
if (supportsUploadFeature(emojiProvider)) {
|
|
44
|
-
emojiProvider.prepareForUpload();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
this.setState({
|
|
48
|
-
uploadErrorMessage: undefined
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
if (this.ref) {
|
|
52
|
-
this.ref.clearUploadPicker();
|
|
11
|
+
import { messages } from '../i18n';
|
|
12
|
+
|
|
13
|
+
const EmojiUploadComponent = props => {
|
|
14
|
+
const {
|
|
15
|
+
emojiProvider,
|
|
16
|
+
createAnalyticsEvent,
|
|
17
|
+
onUploaderRef
|
|
18
|
+
} = props;
|
|
19
|
+
const [uploadErrorMessage, setUploadErrorMessage] = useState();
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (supportsUploadFeature(emojiProvider)) {
|
|
22
|
+
emojiProvider.prepareForUpload();
|
|
23
|
+
}
|
|
24
|
+
}, [emojiProvider]);
|
|
25
|
+
useEffect(() => () => {
|
|
26
|
+
ufoExperiences['emoji-uploaded'].abort({
|
|
27
|
+
metadata: {
|
|
28
|
+
source: 'EmojiUploadComponent',
|
|
29
|
+
reason: 'unmount'
|
|
53
30
|
}
|
|
54
31
|
});
|
|
32
|
+
}, []);
|
|
55
33
|
|
|
56
|
-
|
|
57
|
-
|
|
34
|
+
const onUploadEmoji = async (upload, retry, onSuccessHandler) => {
|
|
35
|
+
ufoExperiences['emoji-uploaded'].start();
|
|
36
|
+
ufoExperiences['emoji-uploaded'].addMetadata({
|
|
37
|
+
retry
|
|
58
38
|
});
|
|
59
39
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
40
|
+
if (supportsUploadFeature(emojiProvider)) {
|
|
41
|
+
fireAnalytics(uploadConfirmButton({
|
|
42
|
+
retry
|
|
43
|
+
}));
|
|
64
44
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
});
|
|
45
|
+
try {
|
|
46
|
+
await emojiProvider.prepareForUpload();
|
|
68
47
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
} = this.props;
|
|
48
|
+
const errorSetter = message => {
|
|
49
|
+
setUploadErrorMessage(message);
|
|
50
|
+
}; // internally handled error from upload callback
|
|
73
51
|
|
|
74
|
-
if (createAnalyticsEvent) {
|
|
75
|
-
createAndFireEventInElementsChannel(analyticsEvent)(createAnalyticsEvent);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
52
|
|
|
79
|
-
|
|
80
|
-
|
|
53
|
+
uploadEmoji(upload, emojiProvider, errorSetter, onUploaded(onSuccessHandler), fireAnalytics, retry);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
// error from upload token generation
|
|
56
|
+
const message = error instanceof Error ? error.message : 'Issue with generating upload token';
|
|
57
|
+
ufoExperiences['emoji-uploaded'].failure({
|
|
58
|
+
metadata: {
|
|
59
|
+
source: 'EmojiUploadComponent',
|
|
60
|
+
error: message
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
setUploadErrorMessage(messages.emojiUploadFailed);
|
|
64
|
+
}
|
|
81
65
|
}
|
|
66
|
+
};
|
|
82
67
|
|
|
83
|
-
|
|
84
|
-
|
|
68
|
+
const onUploaded = onSuccessHandler => () => {
|
|
69
|
+
setUploadErrorMessage(undefined);
|
|
85
70
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
reason: 'unmount'
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
}
|
|
71
|
+
if (onSuccessHandler) {
|
|
72
|
+
onSuccessHandler();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
94
75
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
} = this.state;
|
|
99
|
-
const errorMessage = uploadErrorMessage ? jsx(FormattedMessage, uploadErrorMessage) : null;
|
|
100
|
-
return jsx("div", {
|
|
101
|
-
css: emojiUploadWidget,
|
|
102
|
-
ref: this.props.onUploaderRef
|
|
103
|
-
}, jsx("div", {
|
|
104
|
-
css: emojiUploadFooter
|
|
105
|
-
}, jsx(EmojiUploadPickerWithIntl, {
|
|
106
|
-
ref: this.onUploaderRef,
|
|
107
|
-
onFileChooserClicked: this.onFileChooserClicked,
|
|
108
|
-
onUploadCancelled: this.onUploadCancelled,
|
|
109
|
-
onUploadEmoji: this.onUploadEmoji,
|
|
110
|
-
errorMessage: errorMessage
|
|
111
|
-
})));
|
|
112
|
-
}
|
|
76
|
+
const onFileChooserClicked = () => {
|
|
77
|
+
fireAnalytics(selectedFileEvent());
|
|
78
|
+
};
|
|
113
79
|
|
|
114
|
-
|
|
80
|
+
const onUploadCancelled = () => {
|
|
81
|
+
fireAnalytics(uploadCancelButton());
|
|
82
|
+
onUploaded();
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const fireAnalytics = analyticsEvent => {
|
|
86
|
+
if (createAnalyticsEvent) {
|
|
87
|
+
createAndFireEventInElementsChannel(analyticsEvent)(createAnalyticsEvent);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
return jsx("div", {
|
|
92
|
+
css: emojiUploadWidget,
|
|
93
|
+
ref: onUploaderRef
|
|
94
|
+
}, jsx("div", {
|
|
95
|
+
css: emojiUploadFooter
|
|
96
|
+
}, jsx(EmojiUploadPickerWithIntl, {
|
|
97
|
+
onFileChooserClicked: onFileChooserClicked,
|
|
98
|
+
onUploadCancelled: onUploadCancelled,
|
|
99
|
+
onUploadEmoji: onUploadEmoji,
|
|
100
|
+
errorMessage: uploadErrorMessage ? jsx(FormattedMessage, uploadErrorMessage) : null
|
|
101
|
+
})));
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export default /*#__PURE__*/memo(EmojiUploadComponent);
|
|
File without changes
|
package/dist/es2019/index.js
CHANGED
|
@@ -17,8 +17,11 @@ import { toEmojiId, toOptionalEmojiId } from './util/type-helpers';
|
|
|
17
17
|
import { recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, withSampling } from './util/analytics';
|
|
18
18
|
import { customCategory, defaultEmojiHeight, emojiPickerWidth, emojiPickerHeight } from './util/constants';
|
|
19
19
|
import { UsageFrequencyTracker } from './api/internal/UsageFrequencyTracker';
|
|
20
|
+
import { useEmojiContext } from './hooks/useEmojiContext';
|
|
21
|
+
import { EmojiContextProvider } from './context/EmojiContextProvider';
|
|
20
22
|
export { // Classes
|
|
21
|
-
AbstractResource, Emoji, EmojiPlaceholder, EmojiLoader, EmojiPicker, EmojiUploader, EmojiResource, EmojiRepository, EmojiTypeAhead, EmojiImage, ResourcedEmoji, //
|
|
23
|
+
AbstractResource, Emoji, EmojiPlaceholder, EmojiLoader, EmojiPicker, EmojiUploader, EmojiResource, EmojiRepository, EmojiTypeAhead, EmojiImage, ResourcedEmoji, EmojiContextProvider, // hooks,
|
|
24
|
+
useEmojiContext, // functions
|
|
22
25
|
denormaliseEmojiServiceResponse, toEmojiId, toOptionalEmojiId, recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, withSampling, // Constants
|
|
23
26
|
emojiPickerWidth, emojiPickerHeight, defaultEmojiHeight, customCategory, UsageFrequencyTracker, EmojiTypeAheadItem };
|
|
24
27
|
export { // Enums
|
package/dist/es2019/version.json
CHANGED
|
@@ -1,21 +1,8 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
-
import
|
|
3
|
-
import _createClass from "@babel/runtime/helpers/createClass";
|
|
4
|
-
import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
|
|
5
|
-
import _inherits from "@babel/runtime/helpers/inherits";
|
|
6
|
-
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
7
|
-
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
|
|
8
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
9
3
|
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
10
|
-
var _excluded = ["placeholderSize"]
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
14
|
-
|
|
15
|
-
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; } }
|
|
16
|
-
|
|
17
|
-
import React, { useEffect } from 'react';
|
|
18
|
-
import { PureComponent } from 'react';
|
|
4
|
+
var _excluded = ["emoji", "placeholderSize", "showTooltip", "fitToHeight", "children"];
|
|
5
|
+
import React, { useEffect, useState } from 'react';
|
|
19
6
|
import { isMediaEmoji } from '../../util/type-helpers';
|
|
20
7
|
import { UfoEmojiTimings } from '../../types';
|
|
21
8
|
import debug from '../../util/logger';
|
|
@@ -24,36 +11,35 @@ import EmojiPlaceholder from './EmojiPlaceholder';
|
|
|
24
11
|
import { UfoErrorBoundary } from './UfoErrorBoundary';
|
|
25
12
|
import { sampledUfoRenderedEmoji, ufoExperiences, useSampledUFOComponentExperience } from '../../util/analytics';
|
|
26
13
|
import { SAMPLING_RATE_EMOJI_RENDERED_EXP } from '../../util/constants';
|
|
27
|
-
import { EmojiContext } from '../../context/EmojiContext';
|
|
28
14
|
import { hasUfoMarked } from '../../util/analytics/ufoExperiences';
|
|
15
|
+
import { useEmojiContext } from '../../hooks/useEmojiContext';
|
|
16
|
+
import { useCallback } from 'react';
|
|
29
17
|
|
|
30
18
|
/**
|
|
31
19
|
* Renders an emoji from a cached image, if required.
|
|
32
20
|
*/
|
|
33
21
|
export var CachingEmoji = function CachingEmoji(props) {
|
|
34
|
-
// Optimisation to only render
|
|
22
|
+
// Optimisation to only render CachingMediaEmoji if necessary
|
|
35
23
|
// slight performance hit, which accumulates for a large number of emoji.
|
|
36
|
-
var
|
|
37
|
-
emojiProps = _objectWithoutProperties(props, _excluded); // start emoji rendered experience, it may have already started earlier in ResourcedEmoji
|
|
24
|
+
var emoji = props.emoji; // start emoji rendered experience, it may have already started earlier in ResourcedEmoji
|
|
38
25
|
|
|
39
|
-
|
|
40
|
-
useSampledUFOComponentExperience(ufoExperiences['emoji-rendered'].getInstance(emojiProps.emoji.id || emojiProps.emoji.shortName), SAMPLING_RATE_EMOJI_RENDERED_EXP, {
|
|
26
|
+
useSampledUFOComponentExperience(ufoExperiences['emoji-rendered'].getInstance(emoji.id || emoji.shortName), SAMPLING_RATE_EMOJI_RENDERED_EXP, {
|
|
41
27
|
source: 'caching-emoji',
|
|
42
|
-
emoji:
|
|
28
|
+
emoji: emoji.shortName
|
|
43
29
|
});
|
|
44
30
|
useEffect(function () {
|
|
45
|
-
if (!hasUfoMarked(sampledUfoRenderedEmoji(
|
|
46
|
-
sampledUfoRenderedEmoji(
|
|
31
|
+
if (!hasUfoMarked(sampledUfoRenderedEmoji(emoji), 'fmp')) {
|
|
32
|
+
sampledUfoRenderedEmoji(emoji).markFMP();
|
|
47
33
|
} // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
48
34
|
|
|
49
35
|
}, []);
|
|
50
36
|
|
|
51
37
|
var emojiNode = function emojiNode() {
|
|
52
|
-
if (isMediaEmoji(
|
|
38
|
+
if (isMediaEmoji(emoji)) {
|
|
53
39
|
return /*#__PURE__*/React.createElement(CachingMediaEmoji, props);
|
|
54
40
|
}
|
|
55
41
|
|
|
56
|
-
return /*#__PURE__*/React.createElement(Emoji,
|
|
42
|
+
return /*#__PURE__*/React.createElement(Emoji, props);
|
|
57
43
|
};
|
|
58
44
|
|
|
59
45
|
return /*#__PURE__*/React.createElement(UfoErrorBoundary, {
|
|
@@ -65,143 +51,87 @@ export var CachingEmoji = function CachingEmoji(props) {
|
|
|
65
51
|
* rendering paths depending on caching strategy.
|
|
66
52
|
*/
|
|
67
53
|
|
|
68
|
-
export var CachingMediaEmoji =
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
54
|
+
export var CachingMediaEmoji = function CachingMediaEmoji(props) {
|
|
55
|
+
var emoji = props.emoji,
|
|
56
|
+
placeholderSize = props.placeholderSize,
|
|
57
|
+
showTooltip = props.showTooltip,
|
|
58
|
+
fitToHeight = props.fitToHeight,
|
|
59
|
+
children = props.children,
|
|
60
|
+
restProps = _objectWithoutProperties(props, _excluded);
|
|
61
|
+
|
|
62
|
+
var shortName = emoji.shortName,
|
|
63
|
+
representation = emoji.representation;
|
|
64
|
+
|
|
65
|
+
var _useState = useState(),
|
|
66
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
67
|
+
cachedEmoji = _useState2[0],
|
|
68
|
+
setCachedEmoji = _useState2[1];
|
|
69
|
+
|
|
70
|
+
var _useState3 = useState(false),
|
|
71
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
72
|
+
inValidImage = _useState4[0],
|
|
73
|
+
setInvalidImage = _useState4[1];
|
|
74
|
+
|
|
75
|
+
var context = useEmojiContext();
|
|
76
|
+
var loadEmoji = useCallback(function (emojiProvider) {
|
|
77
|
+
debug('Loading image via media cache', emoji.shortName);
|
|
78
|
+
sampledUfoRenderedEmoji(emoji).mark(UfoEmojiTimings.MEDIA_START);
|
|
79
|
+
emojiProvider.getMediaEmojiDescriptionURLWithInlineToken(emoji).then(function (cachedEmoji) {
|
|
80
|
+
setCachedEmoji(cachedEmoji);
|
|
81
|
+
setInvalidImage(false);
|
|
82
|
+
sampledUfoRenderedEmoji(emoji).mark(UfoEmojiTimings.MEDIA_END);
|
|
83
|
+
}).catch(function () {
|
|
84
|
+
setCachedEmoji(undefined);
|
|
85
|
+
setInvalidImage(true);
|
|
86
|
+
sampledUfoRenderedEmoji(emoji).failure({
|
|
82
87
|
metadata: {
|
|
83
|
-
reason: 'load
|
|
88
|
+
reason: 'failed to load media emoji',
|
|
84
89
|
source: 'CachingMediaEmoji',
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
90
|
+
data: {
|
|
91
|
+
emoji: {
|
|
92
|
+
id: emoji.id,
|
|
93
|
+
shortName: emoji.shortName,
|
|
94
|
+
name: emoji.name
|
|
95
|
+
}
|
|
88
96
|
}
|
|
89
97
|
}
|
|
90
98
|
});
|
|
91
|
-
|
|
92
|
-
_this.setState({
|
|
93
|
-
invalidImage: true
|
|
94
|
-
});
|
|
95
99
|
});
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
_this.loadEmoji(props.emoji, context);
|
|
102
|
-
|
|
103
|
-
return _this;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
_createClass(CachingMediaEmoji, [{
|
|
107
|
-
key: "componentDidUpdate",
|
|
108
|
-
value: function componentDidUpdate() {
|
|
109
|
-
var _this$state$cachedEmo;
|
|
110
|
-
|
|
111
|
-
if (this.props.emoji.shortName !== ((_this$state$cachedEmo = this.state.cachedEmoji) === null || _this$state$cachedEmo === void 0 ? void 0 : _this$state$cachedEmo.shortName)) {
|
|
112
|
-
this.loadEmoji(this.props.emoji, this.context);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}, {
|
|
116
|
-
key: "loadEmoji",
|
|
117
|
-
value: function loadEmoji(emoji, context) {
|
|
118
|
-
var _this2 = this;
|
|
119
|
-
|
|
120
|
-
if (!context) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (!context.emoji) {
|
|
125
|
-
return undefined;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
var emojiProvider = context.emoji.emojiProvider;
|
|
129
|
-
|
|
130
|
-
if (!emojiProvider) {
|
|
131
|
-
return undefined;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
debug('Loading image via media cache', emoji.shortName);
|
|
135
|
-
sampledUfoRenderedEmoji(emoji).mark(UfoEmojiTimings.MEDIA_START);
|
|
136
|
-
emojiProvider.getMediaEmojiDescriptionURLWithInlineToken(emoji).then(function (cachedEmoji) {
|
|
137
|
-
_this2.setState({
|
|
138
|
-
cachedEmoji: cachedEmoji,
|
|
139
|
-
invalidImage: false
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
sampledUfoRenderedEmoji(emoji).mark(UfoEmojiTimings.MEDIA_END);
|
|
143
|
-
}).catch(function () {
|
|
144
|
-
_this2.setState({
|
|
145
|
-
cachedEmoji: undefined,
|
|
146
|
-
invalidImage: true
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
sampledUfoRenderedEmoji(emoji).failure({
|
|
150
|
-
metadata: {
|
|
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
|
-
}
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
});
|
|
100
|
+
}, [emoji]);
|
|
101
|
+
useEffect(function () {
|
|
102
|
+
if (context && context.emoji.emojiProvider) {
|
|
103
|
+
loadEmoji(context.emoji.emojiProvider);
|
|
163
104
|
}
|
|
164
|
-
},
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
var emojiComponent;
|
|
176
|
-
|
|
177
|
-
if (cachedEmoji && !invalidImage) {
|
|
178
|
-
emojiComponent = /*#__PURE__*/React.createElement(Emoji, _extends({}, otherProps, {
|
|
179
|
-
emoji: cachedEmoji,
|
|
180
|
-
onLoadError: this.handleLoadError
|
|
181
|
-
}));
|
|
182
|
-
} else {
|
|
183
|
-
var _this$props2 = this.props,
|
|
184
|
-
emoji = _this$props2.emoji,
|
|
185
|
-
placeholderSize = _this$props2.placeholderSize,
|
|
186
|
-
showTooltip = _this$props2.showTooltip,
|
|
187
|
-
fitToHeight = _this$props2.fitToHeight;
|
|
188
|
-
var shortName = emoji.shortName,
|
|
189
|
-
representation = emoji.representation;
|
|
190
|
-
emojiComponent = /*#__PURE__*/React.createElement(EmojiPlaceholder, {
|
|
191
|
-
size: fitToHeight || placeholderSize,
|
|
192
|
-
shortName: shortName,
|
|
193
|
-
showTooltip: showTooltip,
|
|
194
|
-
representation: representation
|
|
195
|
-
});
|
|
105
|
+
}, [context, loadEmoji]);
|
|
106
|
+
|
|
107
|
+
var handleLoadError = function handleLoadError(_emojiId) {
|
|
108
|
+
sampledUfoRenderedEmoji(_emojiId).failure({
|
|
109
|
+
metadata: {
|
|
110
|
+
reason: 'load error',
|
|
111
|
+
source: 'CachingMediaEmoji',
|
|
112
|
+
emoji: {
|
|
113
|
+
id: _emojiId.id,
|
|
114
|
+
shortName: _emojiId.shortName
|
|
115
|
+
}
|
|
196
116
|
}
|
|
117
|
+
});
|
|
118
|
+
setInvalidImage(true);
|
|
119
|
+
};
|
|
197
120
|
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
121
|
+
if (cachedEmoji && !inValidImage) {
|
|
122
|
+
return /*#__PURE__*/React.createElement(Emoji, _extends({}, restProps, {
|
|
123
|
+
showTooltip: showTooltip,
|
|
124
|
+
fitToHeight: fitToHeight,
|
|
125
|
+
emoji: cachedEmoji,
|
|
126
|
+
onLoadError: handleLoadError
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
206
129
|
|
|
130
|
+
return /*#__PURE__*/React.createElement(EmojiPlaceholder, {
|
|
131
|
+
size: fitToHeight || placeholderSize,
|
|
132
|
+
shortName: shortName,
|
|
133
|
+
showTooltip: showTooltip,
|
|
134
|
+
representation: representation
|
|
135
|
+
});
|
|
136
|
+
};
|
|
207
137
|
export default CachingEmoji;
|
|
@@ -130,7 +130,7 @@ export var SpriteEmoji = function SpriteEmoji(props) {
|
|
|
130
130
|
onMouseDown: function onMouseDown(event) {
|
|
131
131
|
handleMouseDown(props, event);
|
|
132
132
|
},
|
|
133
|
-
|
|
133
|
+
onMouseEnter: function onMouseEnter(event) {
|
|
134
134
|
handleMouseMove(props, event);
|
|
135
135
|
},
|
|
136
136
|
"aria-label": emoji.shortName,
|
|
@@ -263,7 +263,7 @@ export var ImageEmoji = function ImageEmoji(props) {
|
|
|
263
263
|
onMouseDown: function onMouseDown(event) {
|
|
264
264
|
handleMouseDown(props, event);
|
|
265
265
|
},
|
|
266
|
-
|
|
266
|
+
onMouseEnter: function onMouseEnter(event) {
|
|
267
267
|
handleMouseMove(props, event);
|
|
268
268
|
},
|
|
269
269
|
"aria-label": emoji.shortName,
|