@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.
Files changed (95) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/components/common/CachingEmoji.js +84 -151
  3. package/dist/cjs/components/common/Emoji.js +2 -2
  4. package/dist/cjs/components/common/EmojiActions.js +129 -175
  5. package/dist/cjs/components/common/EmojiErrorMessage.js +23 -59
  6. package/dist/cjs/components/common/EmojiPreviewComponent.js +1 -0
  7. package/dist/cjs/components/common/EmojiUploadPicker.js +235 -293
  8. package/dist/cjs/components/common/FileChooser.js +34 -71
  9. package/dist/cjs/components/common/Popup.js +105 -154
  10. package/dist/cjs/components/common/RetryableButton.js +43 -64
  11. package/dist/cjs/components/common/ToneSelector.js +50 -89
  12. package/dist/cjs/components/common/styles.js +14 -16
  13. package/dist/cjs/components/hooks.js +16 -0
  14. package/dist/cjs/components/picker/EmojiPickerCategoryHeading.js +16 -48
  15. package/dist/cjs/components/picker/EmojiPickerComponent.js +496 -516
  16. package/dist/cjs/components/picker/EmojiPickerEmojiRow.js +33 -60
  17. package/dist/cjs/components/picker/EmojiPickerFooter.js +13 -48
  18. package/dist/cjs/components/uploader/EmojiUploadComponent.js +124 -109
  19. package/dist/cjs/hooks/useEmojiContext.js +16 -0
  20. package/dist/cjs/hooks/{index.js → usePrevious.js} +0 -0
  21. package/dist/cjs/index.js +16 -0
  22. package/dist/cjs/version.json +1 -1
  23. package/dist/es2019/components/common/CachingEmoji.js +65 -112
  24. package/dist/es2019/components/common/Emoji.js +2 -2
  25. package/dist/es2019/components/common/EmojiActions.js +124 -150
  26. package/dist/es2019/components/common/EmojiErrorMessage.js +22 -26
  27. package/dist/es2019/components/common/EmojiPreviewComponent.js +1 -0
  28. package/dist/es2019/components/common/EmojiUploadPicker.js +190 -253
  29. package/dist/es2019/components/common/FileChooser.js +37 -40
  30. package/dist/es2019/components/common/Popup.js +89 -109
  31. package/dist/es2019/components/common/RetryableButton.js +43 -34
  32. package/dist/es2019/components/common/ToneSelector.js +46 -59
  33. package/dist/es2019/components/common/styles.js +9 -9
  34. package/dist/es2019/components/hooks.js +8 -0
  35. package/dist/es2019/components/picker/EmojiPickerCategoryHeading.js +13 -17
  36. package/dist/es2019/components/picker/EmojiPickerComponent.js +417 -506
  37. package/dist/es2019/components/picker/EmojiPickerEmojiRow.js +32 -35
  38. package/dist/es2019/components/picker/EmojiPickerFooter.js +11 -21
  39. package/dist/es2019/components/uploader/EmojiUploadComponent.js +81 -91
  40. package/dist/es2019/hooks/useEmojiContext.js +3 -0
  41. package/dist/es2019/hooks/{index.js → usePrevious.js} +0 -0
  42. package/dist/es2019/index.js +4 -1
  43. package/dist/es2019/version.json +1 -1
  44. package/dist/esm/components/common/CachingEmoji.js +86 -156
  45. package/dist/esm/components/common/Emoji.js +2 -2
  46. package/dist/esm/components/common/EmojiActions.js +129 -176
  47. package/dist/esm/components/common/EmojiErrorMessage.js +21 -56
  48. package/dist/esm/components/common/EmojiPreviewComponent.js +1 -0
  49. package/dist/esm/components/common/EmojiUploadPicker.js +233 -299
  50. package/dist/esm/components/common/FileChooser.js +34 -70
  51. package/dist/esm/components/common/Popup.js +104 -155
  52. package/dist/esm/components/common/RetryableButton.js +40 -60
  53. package/dist/esm/components/common/ToneSelector.js +50 -87
  54. package/dist/esm/components/common/styles.js +10 -10
  55. package/dist/esm/components/hooks.js +8 -0
  56. package/dist/esm/components/picker/EmojiPickerCategoryHeading.js +14 -43
  57. package/dist/esm/components/picker/EmojiPickerComponent.js +486 -535
  58. package/dist/esm/components/picker/EmojiPickerEmojiRow.js +31 -59
  59. package/dist/esm/components/picker/EmojiPickerFooter.js +14 -49
  60. package/dist/esm/components/uploader/EmojiUploadComponent.js +119 -113
  61. package/dist/esm/hooks/useEmojiContext.js +5 -0
  62. package/dist/esm/hooks/{index.js → usePrevious.js} +0 -0
  63. package/dist/esm/index.js +4 -1
  64. package/dist/esm/version.json +1 -1
  65. package/dist/types/components/common/CachingEmoji.d.ts +3 -13
  66. package/dist/types/components/common/Emoji.d.ts +1 -1
  67. package/dist/types/components/common/EmojiActions.d.ts +6 -17
  68. package/dist/types/components/common/EmojiErrorMessage.d.ts +3 -6
  69. package/dist/types/components/common/EmojiPreviewComponent.d.ts +2 -2
  70. package/dist/types/components/common/EmojiUploadPicker.d.ts +3 -27
  71. package/dist/types/components/common/FileChooser.d.ts +3 -5
  72. package/dist/types/components/common/Popup.d.ts +3 -20
  73. package/dist/types/components/common/RetryableButton.d.ts +3 -7
  74. package/dist/types/components/common/ToneSelector.d.ts +4 -10
  75. package/dist/types/components/common/setSkinToneAriaLabelText.d.ts +1 -1
  76. package/dist/types/components/common/styles.d.ts +1 -3
  77. package/dist/types/components/hooks.d.ts +1 -0
  78. package/dist/types/components/picker/CategorySelector.d.ts +1 -1
  79. package/dist/types/components/picker/EmojiPicker.d.ts +3 -3
  80. package/dist/types/components/picker/EmojiPickerCategoryHeading.d.ts +3 -4
  81. package/dist/types/components/picker/EmojiPickerComponent.d.ts +4 -80
  82. package/dist/types/components/picker/EmojiPickerEmojiRow.d.ts +3 -4
  83. package/dist/types/components/picker/EmojiPickerFooter.d.ts +3 -6
  84. package/dist/types/components/uploader/EmojiUploadComponent.d.ts +3 -17
  85. package/dist/types/components/uploader/EmojiUploader.d.ts +5 -7
  86. package/dist/types/hooks/useEmojiContext.d.ts +1 -0
  87. package/dist/types/hooks/{index.d.ts → usePrevious.d.ts} +0 -0
  88. package/dist/types/index.d.ts +3 -1
  89. package/dist/types/types.d.ts +2 -1
  90. package/local-config-example.ts +3 -1
  91. package/package.json +17 -4
  92. package/dist/cjs/components/common/EmojiPreview.js +0 -194
  93. package/dist/es2019/components/common/EmojiPreview.js +0 -152
  94. package/dist/esm/components/common/EmojiPreview.js +0 -170
  95. 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 { PureComponent } from 'react';
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 { PureComponent } from 'react';
3
+ import { memo } from 'react';
4
4
  import { EmojiPreviewComponent } from '../common/EmojiPreviewComponent';
5
5
  import { emojiPickerFooter, emojiPickerFooterWithTopShadow } from './styles';
6
- export default class EmojiPickerFooter extends PureComponent {
7
- render() {
8
- const {
9
- selectedEmoji,
10
- isUploading
11
- } = this.props;
12
- const previewFooterClassnames = [emojiPickerFooter, emojiPickerFooterWithTopShadow];
6
+ const previewFooterClassnames = [emojiPickerFooter, emojiPickerFooterWithTopShadow];
13
7
 
14
- if (!selectedEmoji || isUploading) {
15
- this.props.onPreviewDisplayed(false);
16
- return null;
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
- this.props.onPreviewDisplayed(true);
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 { PureComponent } from 'react';
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
- export default class EmojiUploadComponent extends PureComponent {
14
- constructor(props) {
15
- super(props);
16
-
17
- _defineProperty(this, "onUploadEmoji", (upload, retry) => {
18
- const {
19
- emojiProvider
20
- } = this.props;
21
- ufoExperiences['emoji-uploaded'].start();
22
- ufoExperiences['emoji-uploaded'].addMetadata({
23
- retry
24
- });
25
- this.fireAnalytics(uploadConfirmButton({
26
- retry
27
- }));
28
-
29
- const errorSetter = message => {
30
- this.setState({
31
- uploadErrorMessage: message
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
- _defineProperty(this, "onFileChooserClicked", () => {
57
- this.fireAnalytics(selectedFileEvent());
34
+ const onUploadEmoji = async (upload, retry, onSuccessHandler) => {
35
+ ufoExperiences['emoji-uploaded'].start();
36
+ ufoExperiences['emoji-uploaded'].addMetadata({
37
+ retry
58
38
  });
59
39
 
60
- _defineProperty(this, "onUploadCancelled", () => {
61
- this.fireAnalytics(uploadCancelButton());
62
- this.prepareForUpload();
63
- });
40
+ if (supportsUploadFeature(emojiProvider)) {
41
+ fireAnalytics(uploadConfirmButton({
42
+ retry
43
+ }));
64
44
 
65
- _defineProperty(this, "onUploaderRef", emojiUploadPicker => {
66
- this.ref = emojiUploadPicker;
67
- });
45
+ try {
46
+ await emojiProvider.prepareForUpload();
68
47
 
69
- _defineProperty(this, "fireAnalytics", analyticsEvent => {
70
- const {
71
- createAnalyticsEvent
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
- if (supportsUploadFeature(props.emojiProvider)) {
80
- props.emojiProvider.prepareForUpload();
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
- this.state = {};
84
- }
68
+ const onUploaded = onSuccessHandler => () => {
69
+ setUploadErrorMessage(undefined);
85
70
 
86
- componentWillUnmount() {
87
- ufoExperiences['emoji-uploaded'].abort({
88
- metadata: {
89
- source: 'EmojiUploadComponent',
90
- reason: 'unmount'
91
- }
92
- });
93
- }
71
+ if (onSuccessHandler) {
72
+ onSuccessHandler();
73
+ }
74
+ };
94
75
 
95
- render() {
96
- const {
97
- uploadErrorMessage
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);
@@ -0,0 +1,3 @@
1
+ import { useContext } from 'react';
2
+ import { EmojiContext } from '../context/EmojiContext';
3
+ export const useEmojiContext = () => useContext(EmojiContext);
File without changes
@@ -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, // functions
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
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "65.1.1",
3
+ "version": "65.2.0",
4
4
  "sideEffects": false
5
5
  }
@@ -1,21 +1,8 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
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
- _excluded2 = ["children"];
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 the class based CachingMediaEmoji if necessary
22
+ // Optimisation to only render CachingMediaEmoji if necessary
35
23
  // slight performance hit, which accumulates for a large number of emoji.
36
- var placeholderSize = props.placeholderSize,
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: emojiProps.emoji.shortName
28
+ emoji: emoji.shortName
43
29
  });
44
30
  useEffect(function () {
45
- if (!hasUfoMarked(sampledUfoRenderedEmoji(emojiProps.emoji), 'fmp')) {
46
- sampledUfoRenderedEmoji(emojiProps.emoji).markFMP();
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(props.emoji)) {
38
+ if (isMediaEmoji(emoji)) {
53
39
  return /*#__PURE__*/React.createElement(CachingMediaEmoji, props);
54
40
  }
55
41
 
56
- return /*#__PURE__*/React.createElement(Emoji, emojiProps);
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 = /*#__PURE__*/function (_PureComponent) {
69
- _inherits(CachingMediaEmoji, _PureComponent);
70
-
71
- var _super = _createSuper(CachingMediaEmoji);
72
-
73
- function CachingMediaEmoji(props, context) {
74
- var _this;
75
-
76
- _classCallCheck(this, CachingMediaEmoji);
77
-
78
- _this = _super.call(this, props);
79
-
80
- _defineProperty(_assertThisInitialized(_this), "handleLoadError", function (_emojiId) {
81
- sampledUfoRenderedEmoji(_emojiId).failure({
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 error',
88
+ reason: 'failed to load media emoji',
84
89
  source: 'CachingMediaEmoji',
85
- emoji: {
86
- id: _emojiId.id,
87
- shortName: _emojiId.shortName
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
- _this.state = {
98
- cachedEmoji: undefined
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
- key: "render",
166
- value: function render() {
167
- var _this$state = this.state,
168
- cachedEmoji = _this$state.cachedEmoji,
169
- invalidImage = _this$state.invalidImage;
170
-
171
- var _this$props = this.props,
172
- children = _this$props.children,
173
- otherProps = _objectWithoutProperties(_this$props, _excluded2);
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
- return emojiComponent;
199
- }
200
- }]);
201
-
202
- return CachingMediaEmoji;
203
- }(PureComponent);
204
-
205
- _defineProperty(CachingMediaEmoji, "contextType", EmojiContext);
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
- onMouseMove: function onMouseMove(event) {
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
- onMouseMove: function onMouseMove(event) {
266
+ onMouseEnter: function onMouseEnter(event) {
267
267
  handleMouseMove(props, event);
268
268
  },
269
269
  "aria-label": emoji.shortName,