@atlaskit/emoji 65.0.0 → 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 (115) hide show
  1. package/CHANGELOG.md +36 -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/ResourcedEmojiComponent.js +10 -5
  11. package/dist/cjs/components/common/RetryableButton.js +43 -64
  12. package/dist/cjs/components/common/ToneSelector.js +50 -89
  13. package/dist/cjs/components/common/styles.js +14 -16
  14. package/dist/cjs/components/hooks.js +16 -0
  15. package/dist/cjs/components/picker/EmojiPickerCategoryHeading.js +16 -48
  16. package/dist/cjs/components/picker/EmojiPickerComponent.js +496 -508
  17. package/dist/cjs/components/picker/EmojiPickerEmojiRow.js +33 -60
  18. package/dist/cjs/components/picker/EmojiPickerFooter.js +13 -46
  19. package/dist/cjs/components/picker/styles.js +16 -13
  20. package/dist/cjs/components/uploader/EmojiUploadComponent.js +124 -109
  21. package/dist/cjs/hooks/useEmojiContext.js +16 -0
  22. package/dist/cjs/hooks/usePrevious.js +16 -0
  23. package/dist/cjs/index.js +16 -0
  24. package/dist/cjs/util/constants.js +3 -1
  25. package/dist/cjs/version.json +1 -1
  26. package/dist/es2019/components/common/CachingEmoji.js +65 -112
  27. package/dist/es2019/components/common/Emoji.js +2 -2
  28. package/dist/es2019/components/common/EmojiActions.js +124 -150
  29. package/dist/es2019/components/common/EmojiErrorMessage.js +22 -26
  30. package/dist/es2019/components/common/EmojiPreviewComponent.js +1 -0
  31. package/dist/es2019/components/common/EmojiUploadPicker.js +190 -253
  32. package/dist/es2019/components/common/FileChooser.js +37 -40
  33. package/dist/es2019/components/common/Popup.js +89 -109
  34. package/dist/es2019/components/common/ResourcedEmojiComponent.js +5 -4
  35. package/dist/es2019/components/common/RetryableButton.js +43 -34
  36. package/dist/es2019/components/common/ToneSelector.js +46 -59
  37. package/dist/es2019/components/common/styles.js +9 -9
  38. package/dist/es2019/components/hooks.js +8 -0
  39. package/dist/es2019/components/picker/EmojiPickerCategoryHeading.js +13 -17
  40. package/dist/es2019/components/picker/EmojiPickerComponent.js +417 -497
  41. package/dist/es2019/components/picker/EmojiPickerEmojiRow.js +32 -35
  42. package/dist/es2019/components/picker/EmojiPickerFooter.js +11 -19
  43. package/dist/es2019/components/picker/styles.js +16 -14
  44. package/dist/es2019/components/uploader/EmojiUploadComponent.js +81 -91
  45. package/dist/es2019/hooks/useEmojiContext.js +3 -0
  46. package/dist/es2019/hooks/usePrevious.js +8 -0
  47. package/dist/es2019/index.js +4 -1
  48. package/dist/es2019/util/constants.js +1 -0
  49. package/dist/es2019/version.json +1 -1
  50. package/dist/esm/components/common/CachingEmoji.js +86 -156
  51. package/dist/esm/components/common/Emoji.js +2 -2
  52. package/dist/esm/components/common/EmojiActions.js +129 -176
  53. package/dist/esm/components/common/EmojiErrorMessage.js +21 -56
  54. package/dist/esm/components/common/EmojiPreviewComponent.js +1 -0
  55. package/dist/esm/components/common/EmojiUploadPicker.js +233 -299
  56. package/dist/esm/components/common/FileChooser.js +34 -70
  57. package/dist/esm/components/common/Popup.js +104 -155
  58. package/dist/esm/components/common/ResourcedEmojiComponent.js +8 -4
  59. package/dist/esm/components/common/RetryableButton.js +40 -60
  60. package/dist/esm/components/common/ToneSelector.js +50 -87
  61. package/dist/esm/components/common/styles.js +10 -10
  62. package/dist/esm/components/hooks.js +8 -0
  63. package/dist/esm/components/picker/EmojiPickerCategoryHeading.js +14 -43
  64. package/dist/esm/components/picker/EmojiPickerComponent.js +486 -526
  65. package/dist/esm/components/picker/EmojiPickerEmojiRow.js +31 -59
  66. package/dist/esm/components/picker/EmojiPickerFooter.js +14 -47
  67. package/dist/esm/components/picker/styles.js +16 -14
  68. package/dist/esm/components/uploader/EmojiUploadComponent.js +119 -113
  69. package/dist/esm/hooks/useEmojiContext.js +5 -0
  70. package/dist/esm/hooks/usePrevious.js +8 -0
  71. package/dist/esm/index.js +4 -1
  72. package/dist/esm/util/constants.js +1 -0
  73. package/dist/esm/version.json +1 -1
  74. package/dist/types/api/EmojiResource.d.ts +2 -3
  75. package/dist/types/components/common/CachingEmoji.d.ts +3 -13
  76. package/dist/types/components/common/Emoji.d.ts +1 -2
  77. package/dist/types/components/common/EmojiActions.d.ts +6 -17
  78. package/dist/types/components/common/EmojiErrorMessage.d.ts +3 -6
  79. package/dist/types/components/common/EmojiPreviewComponent.d.ts +2 -2
  80. package/dist/types/components/common/EmojiUploadPicker.d.ts +3 -27
  81. package/dist/types/components/common/FileChooser.d.ts +3 -5
  82. package/dist/types/components/common/LoadingEmojiComponent.d.ts +3 -0
  83. package/dist/types/components/common/Popup.d.ts +3 -20
  84. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +23 -11
  85. package/dist/types/components/common/RetryableButton.d.ts +3 -7
  86. package/dist/types/components/common/ToneSelector.d.ts +4 -10
  87. package/dist/types/components/common/setSkinToneAriaLabelText.d.ts +1 -1
  88. package/dist/types/components/common/styles.d.ts +1 -3
  89. package/dist/types/components/hooks.d.ts +1 -0
  90. package/dist/types/components/picker/CategorySelector.d.ts +1 -1
  91. package/dist/types/components/picker/EmojiPicker.d.ts +12 -3
  92. package/dist/types/components/picker/EmojiPickerCategoryHeading.d.ts +3 -4
  93. package/dist/types/components/picker/EmojiPickerComponent.d.ts +14 -76
  94. package/dist/types/components/picker/EmojiPickerEmojiRow.d.ts +3 -4
  95. package/dist/types/components/picker/EmojiPickerFooter.d.ts +3 -5
  96. package/dist/types/components/picker/styles.d.ts +1 -1
  97. package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +18 -0
  98. package/dist/types/components/uploader/EmojiUploadComponent.d.ts +3 -17
  99. package/dist/types/components/uploader/EmojiUploader.d.ts +5 -7
  100. package/dist/types/hooks/useEmojiContext.d.ts +1 -0
  101. package/dist/types/hooks/usePrevious.d.ts +1 -0
  102. package/dist/types/index.d.ts +3 -1
  103. package/dist/types/types.d.ts +2 -1
  104. package/dist/types/util/constants.d.ts +1 -0
  105. package/docs/0-intro.tsx +35 -27
  106. package/docs/1-resourced-emoji.tsx +74 -0
  107. package/docs/2-emoji-picker.tsx +56 -0
  108. package/docs/3-typeahead.tsx +20 -0
  109. package/docs/4-emoji-provider.tsx +98 -0
  110. package/local-config-example.ts +3 -1
  111. package/package.json +19 -6
  112. package/dist/cjs/components/common/EmojiPreview.js +0 -194
  113. package/dist/es2019/components/common/EmojiPreview.js +0 -152
  114. package/dist/esm/components/common/EmojiPreview.js +0 -170
  115. package/dist/types/components/common/EmojiPreview.d.ts +0 -31
@@ -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,
@@ -1,18 +1,9 @@
1
- import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
- import _createClass from "@babel/runtime/helpers/createClass";
3
- import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
4
- import _inherits from "@babel/runtime/helpers/inherits";
5
- import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
6
- import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
7
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
8
-
9
- 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); }; }
10
-
11
- 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; } }
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
12
3
 
13
4
  /** @jsx jsx */
14
5
  import { jsx } from '@emotion/core';
15
- import { PureComponent } from 'react';
6
+ import { Fragment, useState } from 'react';
16
7
  import { FormattedMessage, injectIntl } from 'react-intl-next';
17
8
  import EmojiDeletePreview from '../common/EmojiDeletePreview';
18
9
  import EmojiUploadPicker from '../common/EmojiUploadPicker';
@@ -23,179 +14,141 @@ import { messages } from '../i18n';
23
14
  import AkButton from '@atlaskit/button/standard-button';
24
15
  import AddIcon from '@atlaskit/icon/glyph/add';
25
16
  import { setSkinToneAriaLabelText } from './setSkinToneAriaLabelText';
26
- import { addCustomEmoji, addCustomEmojiButton, emojiPickerAddEmoji, emojiToneSelectorContainer } from './styles';
17
+ import { addCustomEmoji, addCustomEmojiButton, emojiActionsWrapper, emojiPickerAddEmoji, emojiToneSelectorContainer } from './styles';
27
18
  import { emojiActionsContainerWithBottomShadow, emojiPickerFooter } from '../picker/styles';
28
- export var EmojiActions = /*#__PURE__*/function (_PureComponent) {
29
- _inherits(EmojiActions, _PureComponent);
30
19
 
31
- var _super = _createSuper(EmojiActions);
20
+ var AddOwnEmoji = function AddOwnEmoji(props) {
21
+ var onOpenUpload = props.onOpenUpload,
22
+ uploadEnabled = props.uploadEnabled,
23
+ formatMessage = props.intl.formatMessage;
24
+ return jsx(Fragment, null, uploadEnabled && jsx("div", {
25
+ css: addCustomEmoji
26
+ }, jsx(FormattedMessage, messages.addCustomEmojiLabel, function (label) {
27
+ return jsx(AkButton, {
28
+ onClick: onOpenUpload,
29
+ iconBefore: jsx(AddIcon, {
30
+ label: formatMessage(messages.addCustomEmojiLabel),
31
+ size: "small"
32
+ }),
33
+ appearance: "subtle",
34
+ css: addCustomEmojiButton,
35
+ className: emojiPickerAddEmoji
36
+ }, label);
37
+ })));
38
+ };
39
+
40
+ var TonesWrapper = function TonesWrapper(props) {
41
+ var toneEmoji = props.toneEmoji,
42
+ selectedTone = props.selectedTone,
43
+ intl = props.intl,
44
+ onToneSelected = props.onToneSelected,
45
+ onToneOpen = props.onToneOpen,
46
+ showToneSelector = props.showToneSelector;
47
+ var formatMessage = intl.formatMessage;
48
+
49
+ if (!toneEmoji) {
50
+ return null;
51
+ }
32
52
 
33
- function EmojiActions() {
34
- var _this;
53
+ var previewEmoji = toneEmoji;
35
54
 
36
- _classCallCheck(this, EmojiActions);
55
+ if (selectedTone && previewEmoji.skinVariations) {
56
+ previewEmoji = previewEmoji.skinVariations[(selectedTone || 1) - 1];
57
+ }
37
58
 
38
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
39
- args[_key] = arguments[_key];
59
+ return jsx("div", {
60
+ css: emojiToneSelectorContainer
61
+ }, showToneSelector && jsx(ToneSelector, {
62
+ emoji: toneEmoji,
63
+ onToneSelected: onToneSelected,
64
+ previewEmojiId: previewEmoji.id
65
+ }), jsx(EmojiButton, {
66
+ ariaExpanded: showToneSelector,
67
+ emoji: previewEmoji,
68
+ selectOnHover: true,
69
+ onSelected: onToneOpen,
70
+ ariaLabelText: formatMessage(messages.emojiSelectSkinToneButtonAriaLabelText, {
71
+ selectedTone: "".concat(setSkinToneAriaLabelText(previewEmoji.name), " selected")
72
+ })
73
+ }));
74
+ };
75
+
76
+ export var EmojiActions = function EmojiActions(props) {
77
+ var onToneSelected = props.onToneSelected,
78
+ onToneSelectorCancelled = props.onToneSelectorCancelled,
79
+ initialUploadName = props.initialUploadName,
80
+ onUploadCancelled = props.onUploadCancelled,
81
+ onCloseDelete = props.onCloseDelete,
82
+ onDeleteEmoji = props.onDeleteEmoji,
83
+ onUploadEmoji = props.onUploadEmoji,
84
+ uploadErrorMessage = props.uploadErrorMessage,
85
+ uploading = props.uploading,
86
+ onFileChooserClicked = props.onFileChooserClicked,
87
+ emojiToDelete = props.emojiToDelete,
88
+ onChange = props.onChange,
89
+ query = props.query;
90
+
91
+ var _useState = useState(false),
92
+ _useState2 = _slicedToArray(_useState, 2),
93
+ showToneSelector = _useState2[0],
94
+ setShowToneSelector = _useState2[1];
95
+
96
+ var previewFooterClassnames = [emojiPickerFooter, emojiActionsContainerWithBottomShadow];
97
+
98
+ var onToneOpenHandler = function onToneOpenHandler() {
99
+ return setShowToneSelector(true);
100
+ };
101
+
102
+ var onToneSelectedHandler = function onToneSelectedHandler(toneValue) {
103
+ setShowToneSelector(false);
104
+
105
+ if (onToneSelected) {
106
+ onToneSelected(toneValue);
40
107
  }
108
+ };
41
109
 
42
- _this = _super.call.apply(_super, [this].concat(args));
43
-
44
- _defineProperty(_assertThisInitialized(_this), "state", {
45
- selectingTone: false
46
- });
47
-
48
- _defineProperty(_assertThisInitialized(_this), "onToneButtonClick", function () {
49
- _this.setState({
50
- selectingTone: !_this.state.selectingTone
51
- });
52
- });
53
-
54
- _defineProperty(_assertThisInitialized(_this), "onToneSelected", function (toneValue) {
55
- _this.setState({
56
- selectingTone: false
57
- });
58
-
59
- if (_this.props.onToneSelected) {
60
- _this.props.onToneSelected(toneValue);
61
- }
62
- });
63
-
64
- _defineProperty(_assertThisInitialized(_this), "onMouseLeave", function () {
65
- var selectingTone = _this.state.selectingTone;
66
- var onToneSelectorCancelled = _this.props.onToneSelectorCancelled;
67
-
68
- if (selectingTone && onToneSelectorCancelled) {
69
- onToneSelectorCancelled();
70
- }
71
-
72
- _this.setState({
73
- selectingTone: false
74
- });
75
- });
110
+ var onMouseLeaveHandler = function onMouseLeaveHandler() {
111
+ if (showToneSelector && onToneSelectorCancelled) {
112
+ onToneSelectorCancelled();
113
+ }
76
114
 
77
- return _this;
115
+ setShowToneSelector(false);
116
+ };
117
+
118
+ if (uploading) {
119
+ return jsx("div", {
120
+ css: previewFooterClassnames
121
+ }, jsx(EmojiUploadPicker, {
122
+ onUploadCancelled: onUploadCancelled,
123
+ onUploadEmoji: onUploadEmoji,
124
+ onFileChooserClicked: onFileChooserClicked,
125
+ errorMessage: uploadErrorMessage,
126
+ initialUploadName: initialUploadName
127
+ }));
78
128
  }
79
129
 
80
- _createClass(EmojiActions, [{
81
- key: "renderTones",
82
- value: function renderTones() {
83
- var _this$props = this.props,
84
- toneEmoji = _this$props.toneEmoji,
85
- selectedTone = _this$props.selectedTone,
86
- intl = _this$props.intl;
87
- var formatMessage = intl.formatMessage;
88
-
89
- if (!toneEmoji) {
90
- return null;
91
- }
92
-
93
- var previewEmoji = toneEmoji;
94
-
95
- if (selectedTone && previewEmoji.skinVariations) {
96
- previewEmoji = previewEmoji.skinVariations[(selectedTone || 1) - 1];
97
- }
98
-
99
- return jsx("div", {
100
- css: emojiToneSelectorContainer
101
- }, this.state.selectingTone && jsx(ToneSelector, {
102
- emoji: toneEmoji,
103
- onToneSelected: this.onToneSelected,
104
- previewEmojiId: previewEmoji.id
105
- }), jsx(EmojiButton, {
106
- ariaExpanded: this.state.selectingTone,
107
- emoji: previewEmoji,
108
- selectOnHover: true,
109
- onSelected: this.onToneButtonClick,
110
- ariaLabelText: formatMessage(messages.emojiSelectSkinToneButtonAriaLabelText, {
111
- selectedTone: "".concat(setSkinToneAriaLabelText(previewEmoji.name), " selected")
112
- })
113
- }));
114
- } // note: emoji-picker-add-emoji className is used by pollinator synthetic checks
115
-
116
- }, {
117
- key: "renderAddOwnEmoji",
118
- value: function renderAddOwnEmoji() {
119
- var _this$props2 = this.props,
120
- onOpenUpload = _this$props2.onOpenUpload,
121
- uploadEnabled = _this$props2.uploadEnabled,
122
- intl = _this$props2.intl;
123
- var formatMessage = intl.formatMessage;
124
-
125
- if (!uploadEnabled) {
126
- return null;
127
- }
128
-
129
- return jsx("div", {
130
- css: addCustomEmoji
131
- }, jsx(FormattedMessage, messages.addCustomEmojiLabel, function (label) {
132
- return jsx(AkButton, {
133
- onClick: onOpenUpload,
134
- iconBefore: jsx(AddIcon, {
135
- label: formatMessage(messages.addCustomEmojiLabel),
136
- size: "small"
137
- }),
138
- appearance: "subtle",
139
- css: addCustomEmojiButton,
140
- className: emojiPickerAddEmoji
141
- }, label);
142
- }));
143
- }
144
- }, {
145
- key: "render",
146
- value: function render() {
147
- var _this$props3 = this.props,
148
- initialUploadName = _this$props3.initialUploadName,
149
- onUploadCancelled = _this$props3.onUploadCancelled,
150
- onUploadEmoji = _this$props3.onUploadEmoji,
151
- onCloseDelete = _this$props3.onCloseDelete,
152
- onDeleteEmoji = _this$props3.onDeleteEmoji,
153
- uploadErrorMessage = _this$props3.uploadErrorMessage,
154
- uploading = _this$props3.uploading,
155
- onFileChooserClicked = _this$props3.onFileChooserClicked,
156
- emojiToDelete = _this$props3.emojiToDelete,
157
- onChange = _this$props3.onChange,
158
- query = _this$props3.query;
159
- var previewFooterClassnames = [emojiPickerFooter, emojiActionsContainerWithBottomShadow];
160
-
161
- if (uploading) {
162
- return jsx("div", {
163
- css: previewFooterClassnames
164
- }, jsx(EmojiUploadPicker, {
165
- onUploadCancelled: onUploadCancelled,
166
- onUploadEmoji: onUploadEmoji,
167
- onFileChooserClicked: onFileChooserClicked,
168
- errorMessage: uploadErrorMessage,
169
- initialUploadName: initialUploadName
170
- }));
171
- }
172
-
173
- if (emojiToDelete) {
174
- return jsx("div", {
175
- css: previewFooterClassnames
176
- }, jsx(EmojiDeletePreview, {
177
- emoji: emojiToDelete,
178
- onDeleteEmoji: onDeleteEmoji,
179
- onCloseDelete: onCloseDelete
180
- }));
181
- }
182
-
183
- return jsx("div", {
184
- css: previewFooterClassnames,
185
- onMouseLeave: this.onMouseLeave
186
- }, jsx("div", {
187
- style: {
188
- display: 'flex',
189
- justifyContent: 'flex-end',
190
- alignItems: 'center'
191
- }
192
- }, !this.state.selectingTone && jsx(EmojiPickerListSearch, {
193
- onChange: onChange,
194
- query: query
195
- }), this.renderTones()), this.renderAddOwnEmoji());
196
- }
197
- }]);
130
+ if (emojiToDelete) {
131
+ return jsx("div", {
132
+ css: previewFooterClassnames
133
+ }, jsx(EmojiDeletePreview, {
134
+ emoji: emojiToDelete,
135
+ onDeleteEmoji: onDeleteEmoji,
136
+ onCloseDelete: onCloseDelete
137
+ }));
138
+ }
198
139
 
199
- return EmojiActions;
200
- }(PureComponent);
140
+ return jsx("div", {
141
+ css: previewFooterClassnames,
142
+ onMouseLeave: onMouseLeaveHandler
143
+ }, jsx("div", {
144
+ css: emojiActionsWrapper
145
+ }, !showToneSelector && jsx(EmojiPickerListSearch, {
146
+ onChange: onChange,
147
+ query: query
148
+ }), jsx(TonesWrapper, _extends({}, props, {
149
+ onToneOpen: onToneOpenHandler,
150
+ onToneSelected: onToneSelectedHandler,
151
+ showToneSelector: showToneSelector
152
+ }))), jsx(AddOwnEmoji, props));
153
+ };
201
154
  export default injectIntl(EmojiActions);