@atlaskit/emoji 67.0.7 → 67.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 (238) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/cjs/api/EmojiResource.js +41 -25
  3. package/dist/cjs/api/media/TokenManager.js +4 -4
  4. package/dist/cjs/components/common/CachingEmoji.js +14 -6
  5. package/dist/cjs/components/common/Emoji.js +48 -12
  6. package/dist/cjs/components/common/EmojiActions.js +62 -26
  7. package/dist/cjs/components/common/EmojiErrorMessage.js +12 -7
  8. package/dist/cjs/components/common/EmojiPlaceholder.js +1 -0
  9. package/dist/cjs/components/common/{EmojiButton.js → EmojiRadioButton.js} +28 -19
  10. package/dist/cjs/components/common/EmojiUploadPicker.js +80 -37
  11. package/dist/cjs/components/common/EmojiUploadPreview.js +11 -2
  12. package/dist/cjs/components/common/FileChooser.js +2 -2
  13. package/dist/cjs/components/common/ResourcedEmojiComponent.js +4 -0
  14. package/dist/cjs/components/common/RetryableButton.js +7 -3
  15. package/dist/cjs/components/common/TonePreviewButton.js +44 -0
  16. package/dist/cjs/components/common/ToneSelector.js +53 -25
  17. package/dist/cjs/components/common/styles.js +45 -16
  18. package/dist/cjs/components/i18n.js +44 -4
  19. package/dist/cjs/components/picker/CategorySelector.js +112 -90
  20. package/dist/cjs/components/picker/CategoryTracker.js +0 -28
  21. package/dist/cjs/components/picker/EmojiPickerCategoryHeading.js +2 -1
  22. package/dist/cjs/components/picker/EmojiPickerComponent.js +33 -44
  23. package/dist/cjs/components/picker/EmojiPickerEmojiRow.js +32 -4
  24. package/dist/cjs/components/picker/EmojiPickerList.js +154 -88
  25. package/dist/cjs/components/picker/EmojiPickerListSearch.js +66 -117
  26. package/dist/cjs/components/picker/EmojiPickerVirtualItems.js +5 -2
  27. package/dist/cjs/components/picker/VirtualList.js +273 -171
  28. package/dist/cjs/components/picker/styles.js +43 -51
  29. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +0 -10
  30. package/dist/cjs/context/EmojiPickerListContext.js +33 -0
  31. package/dist/cjs/hooks/useEmojiPickerListContext.js +12 -0
  32. package/dist/cjs/hooks/useIsMounted.js +17 -0
  33. package/dist/cjs/i18n/cs.js +35 -34
  34. package/dist/cjs/i18n/da.js +35 -34
  35. package/dist/cjs/i18n/de.js +35 -34
  36. package/dist/cjs/i18n/en.js +35 -34
  37. package/dist/cjs/i18n/en_GB.js +35 -34
  38. package/dist/cjs/i18n/es.js +35 -34
  39. package/dist/cjs/i18n/fi.js +35 -34
  40. package/dist/cjs/i18n/fr.js +35 -34
  41. package/dist/cjs/i18n/hu.js +35 -34
  42. package/dist/cjs/i18n/it.js +35 -34
  43. package/dist/cjs/i18n/ja.js +35 -34
  44. package/dist/cjs/i18n/ko.js +35 -34
  45. package/dist/cjs/i18n/nb.js +35 -34
  46. package/dist/cjs/i18n/nl.js +35 -34
  47. package/dist/cjs/i18n/pl.js +35 -34
  48. package/dist/cjs/i18n/pt_BR.js +35 -34
  49. package/dist/cjs/i18n/ru.js +35 -34
  50. package/dist/cjs/i18n/sv.js +35 -34
  51. package/dist/cjs/i18n/th.js +35 -34
  52. package/dist/cjs/i18n/tr.js +35 -34
  53. package/dist/cjs/i18n/uk.js +35 -34
  54. package/dist/cjs/i18n/vi.js +35 -34
  55. package/dist/cjs/i18n/zh.js +35 -34
  56. package/dist/cjs/i18n/zh_TW.js +35 -34
  57. package/dist/cjs/types.js +7 -1
  58. package/dist/cjs/util/constants.js +43 -2
  59. package/dist/cjs/util/shared-styles.js +3 -4
  60. package/dist/cjs/version.json +1 -1
  61. package/dist/es2019/api/EmojiResource.js +42 -26
  62. package/dist/es2019/api/media/TokenManager.js +4 -4
  63. package/dist/es2019/components/common/CachingEmoji.js +10 -3
  64. package/dist/es2019/components/common/Emoji.js +44 -11
  65. package/dist/es2019/components/common/EmojiActions.js +55 -24
  66. package/dist/es2019/components/common/EmojiErrorMessage.js +7 -3
  67. package/dist/es2019/components/common/EmojiPlaceholder.js +1 -0
  68. package/dist/es2019/components/common/EmojiRadioButton.js +54 -0
  69. package/dist/es2019/components/common/EmojiUploadPicker.js +75 -36
  70. package/dist/es2019/components/common/EmojiUploadPreview.js +11 -2
  71. package/dist/es2019/components/common/FileChooser.js +1 -1
  72. package/dist/es2019/components/common/ResourcedEmojiComponent.js +4 -0
  73. package/dist/es2019/components/common/RetryableButton.js +7 -3
  74. package/dist/es2019/components/common/TonePreviewButton.js +34 -0
  75. package/dist/es2019/components/common/ToneSelector.js +55 -21
  76. package/dist/es2019/components/common/styles.js +41 -10
  77. package/dist/es2019/components/i18n.js +44 -4
  78. package/dist/es2019/components/picker/CategorySelector.js +114 -89
  79. package/dist/es2019/components/picker/CategoryTracker.js +0 -24
  80. package/dist/es2019/components/picker/EmojiPickerCategoryHeading.js +2 -2
  81. package/dist/es2019/components/picker/EmojiPickerComponent.js +36 -46
  82. package/dist/es2019/components/picker/EmojiPickerEmojiRow.js +51 -21
  83. package/dist/es2019/components/picker/EmojiPickerList.js +113 -55
  84. package/dist/es2019/components/picker/EmojiPickerListSearch.js +61 -98
  85. package/dist/es2019/components/picker/EmojiPickerVirtualItems.js +4 -1
  86. package/dist/es2019/components/picker/VirtualList.js +247 -108
  87. package/dist/es2019/components/picker/styles.js +20 -28
  88. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +0 -10
  89. package/dist/es2019/context/EmojiPickerListContext.js +17 -0
  90. package/dist/es2019/hooks/useEmojiPickerListContext.js +3 -0
  91. package/dist/es2019/hooks/useIsMounted.js +11 -0
  92. package/dist/es2019/i18n/cs.js +35 -34
  93. package/dist/es2019/i18n/da.js +35 -34
  94. package/dist/es2019/i18n/de.js +35 -34
  95. package/dist/es2019/i18n/en.js +35 -34
  96. package/dist/es2019/i18n/en_GB.js +35 -34
  97. package/dist/es2019/i18n/es.js +35 -34
  98. package/dist/es2019/i18n/fi.js +35 -34
  99. package/dist/es2019/i18n/fr.js +35 -34
  100. package/dist/es2019/i18n/hu.js +35 -34
  101. package/dist/es2019/i18n/it.js +35 -34
  102. package/dist/es2019/i18n/ja.js +35 -34
  103. package/dist/es2019/i18n/ko.js +35 -34
  104. package/dist/es2019/i18n/nb.js +35 -34
  105. package/dist/es2019/i18n/nl.js +35 -34
  106. package/dist/es2019/i18n/pl.js +35 -34
  107. package/dist/es2019/i18n/pt_BR.js +35 -34
  108. package/dist/es2019/i18n/ru.js +35 -34
  109. package/dist/es2019/i18n/sv.js +35 -34
  110. package/dist/es2019/i18n/th.js +35 -34
  111. package/dist/es2019/i18n/tr.js +35 -34
  112. package/dist/es2019/i18n/uk.js +35 -34
  113. package/dist/es2019/i18n/vi.js +35 -34
  114. package/dist/es2019/i18n/zh.js +35 -34
  115. package/dist/es2019/i18n/zh_TW.js +35 -34
  116. package/dist/es2019/types.js +5 -0
  117. package/dist/es2019/util/constants.js +32 -0
  118. package/dist/es2019/util/shared-styles.js +1 -2
  119. package/dist/es2019/version.json +1 -1
  120. package/dist/esm/api/EmojiResource.js +42 -26
  121. package/dist/esm/api/media/TokenManager.js +4 -4
  122. package/dist/esm/components/common/CachingEmoji.js +14 -6
  123. package/dist/esm/components/common/Emoji.js +48 -12
  124. package/dist/esm/components/common/EmojiActions.js +62 -26
  125. package/dist/esm/components/common/EmojiErrorMessage.js +7 -3
  126. package/dist/esm/components/common/EmojiPlaceholder.js +1 -0
  127. package/dist/esm/components/common/EmojiRadioButton.js +52 -0
  128. package/dist/esm/components/common/EmojiUploadPicker.js +77 -36
  129. package/dist/esm/components/common/EmojiUploadPreview.js +11 -2
  130. package/dist/esm/components/common/FileChooser.js +1 -1
  131. package/dist/esm/components/common/ResourcedEmojiComponent.js +4 -0
  132. package/dist/esm/components/common/RetryableButton.js +7 -3
  133. package/dist/esm/components/common/TonePreviewButton.js +33 -0
  134. package/dist/esm/components/common/ToneSelector.js +49 -18
  135. package/dist/esm/components/common/styles.js +40 -12
  136. package/dist/esm/components/i18n.js +44 -4
  137. package/dist/esm/components/picker/CategorySelector.js +114 -95
  138. package/dist/esm/components/picker/CategoryTracker.js +0 -28
  139. package/dist/esm/components/picker/EmojiPickerCategoryHeading.js +2 -2
  140. package/dist/esm/components/picker/EmojiPickerComponent.js +35 -46
  141. package/dist/esm/components/picker/EmojiPickerEmojiRow.js +32 -4
  142. package/dist/esm/components/picker/EmojiPickerList.js +156 -86
  143. package/dist/esm/components/picker/EmojiPickerListSearch.js +64 -117
  144. package/dist/esm/components/picker/EmojiPickerVirtualItems.js +5 -2
  145. package/dist/esm/components/picker/VirtualList.js +274 -172
  146. package/dist/esm/components/picker/styles.js +37 -45
  147. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +0 -10
  148. package/dist/esm/context/EmojiPickerListContext.js +21 -0
  149. package/dist/esm/hooks/useEmojiPickerListContext.js +5 -0
  150. package/dist/esm/hooks/useIsMounted.js +11 -0
  151. package/dist/esm/i18n/cs.js +35 -34
  152. package/dist/esm/i18n/da.js +35 -34
  153. package/dist/esm/i18n/de.js +35 -34
  154. package/dist/esm/i18n/en.js +35 -34
  155. package/dist/esm/i18n/en_GB.js +35 -34
  156. package/dist/esm/i18n/es.js +35 -34
  157. package/dist/esm/i18n/fi.js +35 -34
  158. package/dist/esm/i18n/fr.js +35 -34
  159. package/dist/esm/i18n/hu.js +35 -34
  160. package/dist/esm/i18n/it.js +35 -34
  161. package/dist/esm/i18n/ja.js +35 -34
  162. package/dist/esm/i18n/ko.js +35 -34
  163. package/dist/esm/i18n/nb.js +35 -34
  164. package/dist/esm/i18n/nl.js +35 -34
  165. package/dist/esm/i18n/pl.js +35 -34
  166. package/dist/esm/i18n/pt_BR.js +35 -34
  167. package/dist/esm/i18n/ru.js +35 -34
  168. package/dist/esm/i18n/sv.js +35 -34
  169. package/dist/esm/i18n/th.js +35 -34
  170. package/dist/esm/i18n/tr.js +35 -34
  171. package/dist/esm/i18n/uk.js +35 -34
  172. package/dist/esm/i18n/vi.js +35 -34
  173. package/dist/esm/i18n/zh.js +35 -34
  174. package/dist/esm/i18n/zh_TW.js +35 -34
  175. package/dist/esm/types.js +5 -0
  176. package/dist/esm/util/constants.js +32 -0
  177. package/dist/esm/util/shared-styles.js +1 -2
  178. package/dist/esm/version.json +1 -1
  179. package/dist/types/api/EmojiResource.d.ts +2 -0
  180. package/dist/types/components/common/Emoji.d.ts +7 -1
  181. package/dist/types/components/common/EmojiActions.d.ts +4 -3
  182. package/dist/types/components/common/{EmojiButton.d.ts → EmojiRadioButton.d.ts} +3 -4
  183. package/dist/types/components/common/EmojiUploadPicker.d.ts +6 -4
  184. package/dist/types/components/common/RetryableButton.d.ts +1 -0
  185. package/dist/types/components/common/TonePreviewButton.d.ts +14 -0
  186. package/dist/types/components/common/ToneSelector.d.ts +8 -5
  187. package/dist/types/components/common/internal-types.d.ts +9 -0
  188. package/dist/types/components/common/styles.d.ts +2 -1
  189. package/dist/types/components/i18n.d.ts +40 -0
  190. package/dist/types/components/picker/CategorySelector.d.ts +3 -10
  191. package/dist/types/components/picker/CategoryTracker.d.ts +0 -2
  192. package/dist/types/components/picker/EmojiPickerCategoryHeading.d.ts +2 -1
  193. package/dist/types/components/picker/EmojiPickerEmojiRow.d.ts +5 -0
  194. package/dist/types/components/picker/EmojiPickerList.d.ts +14 -7
  195. package/dist/types/components/picker/EmojiPickerListSearch.d.ts +4 -8
  196. package/dist/types/components/picker/EmojiPickerVirtualItems.d.ts +1 -1
  197. package/dist/types/components/picker/VirtualList.d.ts +7 -24
  198. package/dist/types/components/picker/styles.d.ts +1 -1
  199. package/dist/types/context/EmojiPickerListContext.d.ts +10 -0
  200. package/dist/types/hooks/useEmojiPickerListContext.d.ts +1 -0
  201. package/dist/types/hooks/useIsMounted.d.ts +1 -0
  202. package/dist/types/i18n/cs.d.ts +34 -34
  203. package/dist/types/i18n/da.d.ts +34 -34
  204. package/dist/types/i18n/de.d.ts +34 -34
  205. package/dist/types/i18n/en.d.ts +34 -34
  206. package/dist/types/i18n/en_GB.d.ts +34 -34
  207. package/dist/types/i18n/es.d.ts +34 -34
  208. package/dist/types/i18n/fi.d.ts +34 -34
  209. package/dist/types/i18n/fr.d.ts +34 -34
  210. package/dist/types/i18n/hu.d.ts +34 -34
  211. package/dist/types/i18n/it.d.ts +34 -34
  212. package/dist/types/i18n/ja.d.ts +34 -34
  213. package/dist/types/i18n/ko.d.ts +34 -34
  214. package/dist/types/i18n/nb.d.ts +34 -34
  215. package/dist/types/i18n/nl.d.ts +34 -34
  216. package/dist/types/i18n/pl.d.ts +34 -34
  217. package/dist/types/i18n/pt_BR.d.ts +34 -34
  218. package/dist/types/i18n/ru.d.ts +34 -34
  219. package/dist/types/i18n/sv.d.ts +34 -34
  220. package/dist/types/i18n/th.d.ts +34 -34
  221. package/dist/types/i18n/tr.d.ts +34 -34
  222. package/dist/types/i18n/uk.d.ts +34 -34
  223. package/dist/types/i18n/vi.d.ts +34 -34
  224. package/dist/types/i18n/zh.d.ts +34 -34
  225. package/dist/types/i18n/zh_TW.d.ts +34 -34
  226. package/dist/types/types.d.ts +5 -0
  227. package/dist/types/util/constants.d.ts +28 -0
  228. package/dist/types/util/shared-styles.d.ts +1 -1
  229. package/dist/types/util/type-helpers.d.ts +1 -1
  230. package/package.json +12 -8
  231. package/report.api.md +62 -1
  232. package/README.md +0 -3
  233. package/dist/cjs/components/hooks.js +0 -14
  234. package/dist/es2019/components/common/EmojiButton.js +0 -49
  235. package/dist/es2019/components/hooks.js +0 -8
  236. package/dist/esm/components/common/EmojiButton.js +0 -43
  237. package/dist/esm/components/hooks.js +0 -8
  238. package/dist/types/components/hooks.d.ts +0 -1
@@ -25,8 +25,9 @@ var _EmojiPickerFooter = _interopRequireDefault(require("./EmojiPickerFooter"));
25
25
  var _EmojiPickerList = _interopRequireDefault(require("./EmojiPickerList"));
26
26
  var _analytics = require("../../util/analytics");
27
27
  var _styles = require("./styles");
28
- var _hooks = require("../hooks");
29
28
  var _useEmoji2 = require("../../hooks/useEmoji");
29
+ var _useIsMounted = require("../../hooks/useIsMounted");
30
+ var _i18n = require("../i18n");
30
31
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
31
32
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
32
33
  var FREQUENTLY_USED_MAX = 16;
@@ -37,6 +38,8 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
37
38
  createAnalyticsEvent = _ref.createAnalyticsEvent,
38
39
  _ref$size = _ref.size,
39
40
  size = _ref$size === void 0 ? _constants.defaultEmojiPickerSize : _ref$size;
41
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
42
+ formatMessage = _useIntl.formatMessage;
40
43
  var _useEmoji = (0, _useEmoji2.useEmoji)(),
41
44
  emojiProvider = _useEmoji.emojiProvider,
42
45
  isUploadSupported = _useEmoji.isUploadSupported;
@@ -101,12 +104,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
101
104
  }, []);
102
105
  var openTime = (0, _react.useRef)(0);
103
106
  var isMounting = (0, _react.useRef)(true);
104
- var didMount = (0, _hooks.useDidMount)();
105
- var updateAfterDidMount = (0, _react.useRef)(true);
106
107
  var previousEmojiProvider = (0, _react.useRef)(emojiProvider);
107
108
  var currentUser = (0, _react.useMemo)(function () {
108
109
  return emojiProvider.getCurrentUser();
109
110
  }, [emojiProvider]);
111
+ var isMounted = (0, _useIsMounted.useIsMounted)();
110
112
  var fireAnalytics = (0, _react.useCallback)(function (analyticsEvent) {
111
113
  if (createAnalyticsEvent) {
112
114
  (0, _analytics.createAndFireEventInElementsChannel)(analyticsEvent)(createAnalyticsEvent);
@@ -210,7 +212,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
210
212
  emojiToRender: emojiToRender,
211
213
  searchEmoji: searchResults.emojis
212
214
  });
213
- }, [frequentlyUsedEmojis, query, setStateAfterEmojiChange]);
215
+ fireAnalytics((0, _analytics.pickerSearchedEvent)({
216
+ queryLength: searchQuery.length,
217
+ numMatches: searchResults.emojis.length
218
+ }));
219
+ }, [frequentlyUsedEmojis, query, setStateAfterEmojiChange, fireAnalytics]);
214
220
  var onProviderChange = (0, _react.useMemo)(function () {
215
221
  return {
216
222
  result: onSearchResult
@@ -300,22 +306,22 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
300
306
  var onFileChooserClicked = (0, _react.useCallback)(function () {
301
307
  fireAnalytics((0, _analytics.selectedFileEvent)());
302
308
  }, [fireAnalytics]);
309
+ var scrollToTopOfList = (0, _react.useCallback)(function () {
310
+ var _emojiPickerList$curr;
311
+ (_emojiPickerList$curr = emojiPickerList.current) === null || _emojiPickerList$curr === void 0 ? void 0 : _emojiPickerList$curr.scrollToTop();
312
+ }, [emojiPickerList]);
303
313
  var onSearch = (0, _react.useCallback)(function (searchQuery) {
304
314
  var options = {
305
- skinTone: selectedTone
315
+ skinTone: selectedTone,
316
+ source: _types.SearchSourceTypes.PICKER
306
317
  };
307
- if (query) {
308
- _analytics.ufoExperiences['emoji-searched'].start();
309
- _analytics.ufoExperiences['emoji-searched'].addMetadata({
310
- queryLength: query.length,
311
- source: 'EmojiPickerComponent'
312
- });
313
- }
314
318
  if (searchQuery !== query) {
315
319
  setQuery(searchQuery);
320
+ // scroll to top when search, which is search results section
321
+ scrollToTopOfList();
316
322
  }
317
- updateEmojis(query, options);
318
- }, [query, selectedTone, updateEmojis]);
323
+ updateEmojis(searchQuery, options);
324
+ }, [query, selectedTone, updateEmojis, scrollToTopOfList]);
319
325
  var onOpenUpload = (0, _react.useCallback)(function () {
320
326
  // Prime upload token so it's ready when the user adds
321
327
  if ((0, _EmojiResource.supportsUploadFeature)(emojiProvider)) {
@@ -327,12 +333,12 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
327
333
  });
328
334
  fireAnalytics((0, _analytics.uploadBeginButton)());
329
335
  }, [emojiProvider, fireAnalytics]);
330
- var scrollToEndOfList = (0, _react.useCallback)(function () {
336
+ var scrollToUploadedEmoji = (0, _react.useCallback)(function () {
331
337
  if (emojiPickerList.current) {
332
338
  // Wait a tick to ensure repaint and updated height for picker list
333
339
  window.setTimeout(function () {
334
- var _emojiPickerList$curr;
335
- (_emojiPickerList$curr = emojiPickerList.current) === null || _emojiPickerList$curr === void 0 ? void 0 : _emojiPickerList$curr.scrollToBottom();
340
+ var _emojiPickerList$curr2;
341
+ (_emojiPickerList$curr2 = emojiPickerList.current) === null || _emojiPickerList$curr2 === void 0 ? void 0 : _emojiPickerList$curr2.scrollToRecentlyUploaded();
336
342
  }, 0);
337
343
  }
338
344
  }, [emojiPickerList]);
@@ -349,10 +355,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
349
355
  setSelectedEmoji(emojiDescription);
350
356
  setUploading(false);
351
357
  });
352
- scrollToEndOfList();
358
+ scrollToUploadedEmoji();
353
359
  };
354
360
  (0, _UploadEmoji.uploadEmoji)(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry);
355
- }, [emojiProvider, fireAnalytics, scrollToEndOfList]);
361
+ }, [emojiProvider, fireAnalytics, scrollToUploadedEmoji]);
356
362
  var onTriggerDelete = (0, _react.useCallback)(function (_emojiId, emoji) {
357
363
  if (_emojiId) {
358
364
  fireAnalytics((0, _analytics.deleteBeginEvent)({
@@ -403,11 +409,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
403
409
  }
404
410
  (0, _react.useEffect)(function () {
405
411
  // componentDidMount logic
406
- if (didMount && updateAfterDidMount.current) {
412
+ if (!isMounted) {
407
413
  onComponentDidMount();
408
- updateAfterDidMount.current = false;
409
414
  }
410
- }, [didMount, onComponentDidMount]);
415
+ }, [onComponentDidMount, isMounted]);
411
416
  (0, _react.useEffect)(function () {
412
417
  previousEmojiProvider.current.unsubscribe(onProviderChange);
413
418
  previousEmojiProvider.current = emojiProvider;
@@ -416,26 +421,6 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
416
421
  emojiProvider.unsubscribe(onProviderChange);
417
422
  };
418
423
  }, [emojiProvider, onProviderChange]);
419
- (0, _react.useEffect)(function () {
420
- // We changed provider which means we subscribed to filter results for a new subscriber.
421
- // So we refresh the emoji display with onSearch and we do it here, after the new props have
422
- // been set since onSearch leads to filter being called on the current emojiProvider.
423
- // (Calling onSearch in a '...Will...' lifecycle method would lead to filter being called on
424
- // an emojiProvider we have already unsubscribed from)
425
- onSearch(query);
426
- }, [emojiProvider, onSearch, query]);
427
- (0, _react.useEffect)(function () {
428
- // Fire analytics event whenever query changes
429
- fireAnalytics((0, _analytics.pickerSearchedEvent)({
430
- queryLength: query.length,
431
- numMatches: filteredEmojis.length
432
- }));
433
- _analytics.ufoExperiences['emoji-searched'].success({
434
- metadata: {
435
- emojisLength: filteredEmojis.length
436
- }
437
- });
438
- }, [filteredEmojis.length, fireAnalytics, query]);
439
424
  (0, _react.useEffect)(function () {
440
425
  if (!frequentlyUsedEmojis.length || query) {
441
426
  setFilteredEmojis(searchEmojis);
@@ -473,7 +458,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
473
458
  return (0, _react2.jsx)("div", {
474
459
  css: (0, _styles.emojiPicker)(showPreview, size),
475
460
  ref: onPickerRef,
476
- "data-emoji-picker-container": true
461
+ "data-emoji-picker-container": true,
462
+ role: "dialog",
463
+ "aria-label": formatMessage(_i18n.messages.emojiPickerTitle),
464
+ "aria-modal": true
477
465
  }, (0, _react2.jsx)(_CategorySelector.default, {
478
466
  activeCategoryId: activeCategory,
479
467
  dynamicCategories: dynamicCategories,
@@ -505,7 +493,8 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
505
493
  onCloseDelete: onCloseDelete,
506
494
  onFileChooserClicked: onFileChooserClicked,
507
495
  onOpenUpload: onOpenUpload,
508
- size: size
496
+ size: size,
497
+ activeCategoryId: activeCategory
509
498
  }), showPreview && (0, _react2.jsx)(_EmojiPickerFooter.default, {
510
499
  selectedEmoji: selectedEmoji
511
500
  }));
@@ -7,34 +7,62 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _react = require("react");
9
9
  var _react2 = require("@emotion/react");
10
+ var _reactIntlNext = require("react-intl-next");
10
11
  var _CachingEmoji = _interopRequireDefault(require("../common/CachingEmoji"));
11
12
  var _styles = require("./styles");
13
+ var _useEmojiPickerListContext = require("../../hooks/useEmojiPickerListContext");
14
+ var _i18n = require("../i18n");
12
15
  /** @jsx jsx */
13
16
 
14
17
  var EmojiPickerEmojiRow = function EmojiPickerEmojiRow(_ref) {
15
18
  var emojis = _ref.emojis,
16
19
  onSelected = _ref.onSelected,
17
20
  onMouseMove = _ref.onMouseMove,
21
+ onFocus = _ref.onFocus,
18
22
  title = _ref.title,
19
23
  showDelete = _ref.showDelete,
20
- onDelete = _ref.onDelete;
24
+ onDelete = _ref.onDelete,
25
+ virtualItemContext = _ref.virtualItemContext;
26
+ var _useEmojiPickerListCo = (0, _useEmojiPickerListContext.useEmojiPickerListContext)(),
27
+ currentEmojisFocus = _useEmojiPickerListCo.currentEmojisFocus,
28
+ setEmojisFocus = _useEmojiPickerListCo.setEmojisFocus;
29
+ var rowIndex = (virtualItemContext === null || virtualItemContext === void 0 ? void 0 : virtualItemContext.index) || 0;
30
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
31
+ formatMessage = _useIntl.formatMessage;
32
+ var handleFocus = function handleFocus(index) {
33
+ return function (emojiId, emoji, event) {
34
+ setEmojisFocus({
35
+ rowIndex: rowIndex,
36
+ columnIndex: index
37
+ });
38
+ onFocus && onFocus(emojiId, emoji, event);
39
+ };
40
+ };
21
41
  return (0, _react2.jsx)("div", {
22
- css: _styles.emojiPickerRow
23
- }, emojis.map(function (emoji) {
42
+ css: _styles.emojiPickerRow,
43
+ role: "presentation"
44
+ }, emojis.map(function (emoji, index) {
24
45
  var shortName = emoji.shortName,
25
46
  id = emoji.id;
26
47
  var key = id ? "".concat(id, "-").concat(title) : "".concat(shortName, "-").concat(title);
48
+ var focus = currentEmojisFocus.rowIndex === rowIndex && currentEmojisFocus.columnIndex === index;
27
49
  return (0, _react2.jsx)("span", {
28
50
  css: _styles.emojiItem,
29
- key: key
51
+ key: key,
52
+ role: "gridcell",
53
+ "aria-colindex": index + 1 // aria-colindex is 1 based
30
54
  }, (0, _react2.jsx)(_CachingEmoji.default, {
31
55
  emoji: emoji,
32
56
  selectOnHover: true,
33
57
  onSelected: onSelected,
34
58
  onMouseMove: onMouseMove,
59
+ onFocus: handleFocus(index),
35
60
  showDelete: showDelete,
36
61
  onDelete: onDelete,
37
62
  placeholderSize: 24,
63
+ "data-focus-index": "".concat(rowIndex, "-").concat(index),
64
+ tabIndex: focus ? 0 : -1,
65
+ "aria-roledescription": formatMessage(_i18n.messages.emojiButtonRoleDescription),
38
66
  shouldBeInteractive: true
39
67
  }));
40
68
  }));
@@ -1,21 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = exports.RENDER_EMOJI_PICKER_LIST_TESTID = void 0;
9
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
13
13
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
14
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
15
15
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
16
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
- var _react = _interopRequireWildcard(require("react"));
16
+ var _react = require("react");
18
17
  var _react2 = require("@emotion/react");
18
+ var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
19
19
  var _constants = require("../../util/constants");
20
20
  var _categories = require("./categories");
21
21
  var _CategoryTracker = _interopRequireDefault(require("./CategoryTracker"));
@@ -25,8 +25,9 @@ var _EmojiActions = _interopRequireDefault(require("../common/EmojiActions"));
25
25
  var _styles = require("./styles");
26
26
  var _utils = require("./utils");
27
27
  var _VirtualList = require("./VirtualList");
28
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
28
+ var _reactIntlNext = require("react-intl-next");
29
+ var _i18n = require("../i18n");
30
+ var _EmojiPickerListContext = require("../../context/EmojiPickerListContext");
30
31
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
31
32
  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; } }
32
33
  /**
@@ -38,29 +39,66 @@ var categoryClassname = 'emoji-category';
38
39
  var byOrder = function byOrder(orderableA, orderableB) {
39
40
  return (orderableA.order || 0) - (orderableB.order || 0);
40
41
  };
41
- var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
42
- (0, _inherits2.default)(EmojiPickerVirtualList, _PureComponent);
43
- var _super = _createSuper(EmojiPickerVirtualList);
44
- function EmojiPickerVirtualList(_props) {
42
+
43
+ /**
44
+ * TODO: have to use class component here as unit test is relying on ref.root. Will refactor this whole file to functional component in future
45
+ * ticket: COLLAB-2317
46
+ */
47
+ var EmojiPickerTabPanelInternal = /*#__PURE__*/function (_PureComponent) {
48
+ (0, _inherits2.default)(EmojiPickerTabPanelInternal, _PureComponent);
49
+ var _super = _createSuper(EmojiPickerTabPanelInternal);
50
+ function EmojiPickerTabPanelInternal() {
51
+ (0, _classCallCheck2.default)(this, EmojiPickerTabPanelInternal);
52
+ return _super.apply(this, arguments);
53
+ }
54
+ (0, _createClass2.default)(EmojiPickerTabPanelInternal, [{
55
+ key: "render",
56
+ value: function render() {
57
+ var _this$props = this.props,
58
+ formatMessage = _this$props.intl.formatMessage,
59
+ children = _this$props.children,
60
+ showSearchResults = _this$props.showSearchResults;
61
+ return (0, _react2.jsx)("div", {
62
+ ref: "root",
63
+ css: _styles.emojiPickerList,
64
+ "data-testid": RENDER_EMOJI_PICKER_LIST_TESTID,
65
+ id: RENDER_EMOJI_PICKER_LIST_TESTID,
66
+ role: "tabpanel",
67
+ "aria-label": formatMessage(_i18n.messages.emojiPickerListPanel)
68
+ }, (0, _react2.jsx)(_visuallyHidden.default, {
69
+ id: "emoji-picker-table-description"
70
+ }, formatMessage(_i18n.messages.emojiPickerGrid, {
71
+ showSearchResults: showSearchResults
72
+ })), children);
73
+ }
74
+ }]);
75
+ return EmojiPickerTabPanelInternal;
76
+ }(_react.PureComponent);
77
+ var EmojiPickerTabPanel = (0, _reactIntlNext.injectIntl)(EmojiPickerTabPanelInternal);
78
+ var EmojiPickerVirtualListInternal = /*#__PURE__*/function (_PureComponent2) {
79
+ (0, _inherits2.default)(EmojiPickerVirtualListInternal, _PureComponent2);
80
+ var _super2 = _createSuper(EmojiPickerVirtualListInternal);
81
+ function EmojiPickerVirtualListInternal(_props) {
45
82
  var _this;
46
- (0, _classCallCheck2.default)(this, EmojiPickerVirtualList);
47
- _this = _super.call(this, _props);
83
+ (0, _classCallCheck2.default)(this, EmojiPickerVirtualListInternal);
84
+ _this = _super2.call(this, _props);
48
85
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "virtualItems", []);
49
86
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "categoryTracker", new _CategoryTracker.default());
50
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onEmojiMouseEnter", function (emojiId, emoji) {
87
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "listRef", /*#__PURE__*/(0, _react.createRef)());
88
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onEmojiActive", function (emojiId, emoji) {
51
89
  if (_this.props.onEmojiActive) {
52
90
  _this.props.onEmojiActive(emojiId, emoji);
53
91
  }
54
92
  });
55
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSearch", function (e) {
93
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSearch", function (value) {
56
94
  if (_this.props.onSearch) {
57
- _this.props.onSearch(e.target.value);
95
+ _this.props.onSearch(value);
58
96
  }
59
97
  });
60
98
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "buildVirtualItemFromGroup", function (group) {
61
- var _this$props = _this.props,
62
- onEmojiSelected = _this$props.onEmojiSelected,
63
- onEmojiDelete = _this$props.onEmojiDelete;
99
+ var _this$props2 = _this.props,
100
+ onEmojiSelected = _this$props2.onEmojiSelected,
101
+ onEmojiDelete = _this$props2.onEmojiDelete;
64
102
  var items = [];
65
103
  items.push(new _EmojiPickerVirtualItems.CategoryHeadingItem({
66
104
  id: group.category,
@@ -72,12 +110,14 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
72
110
  var rowEmojis = remainingEmojis.slice(0, _EmojiPickerSizes.sizes.emojiPerRow);
73
111
  remainingEmojis = remainingEmojis.slice(_EmojiPickerSizes.sizes.emojiPerRow);
74
112
  items.push(new _EmojiPickerVirtualItems.EmojisRowItem({
113
+ category: group.category,
75
114
  emojis: rowEmojis,
76
115
  title: group.title,
77
116
  showDelete: group.title === _constants.userCustomTitle,
78
117
  onSelected: onEmojiSelected,
79
118
  onDelete: onEmojiDelete,
80
- onMouseMove: _this.onEmojiMouseEnter
119
+ onMouseMove: _this.onEmojiActive,
120
+ onFocus: _this.onEmojiActive
81
121
  }));
82
122
  }
83
123
  return items;
@@ -95,7 +135,7 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
95
135
  var search = _categories.CategoryDescriptionMap.SEARCH;
96
136
  // Only a single "result" category
97
137
  items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(_this.buildVirtualItemFromGroup({
98
- category: 'SEARCH',
138
+ category: _constants.searchCategory,
99
139
  title: search.name,
100
140
  emojis: emojis,
101
141
  order: search.order
@@ -109,22 +149,16 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
109
149
  // by not passing it to irrelevant groups
110
150
  _this.categoryTracker.add(group.emojis[0].category, items.length);
111
151
  items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(_this.buildVirtualItemFromGroup(group)));
152
+ if (group.category === _constants.yourUploadsCategory) {
153
+ _this.lastYourUploadsRow = items.length - 1;
154
+ }
155
+ });
156
+ _this.onRowsRendered({
157
+ startIndex: 0
112
158
  });
113
159
  }
114
160
  }
115
- var rowCountChanged = _this.virtualItems.length !== items.length;
116
161
  _this.virtualItems = items;
117
- var list = _this.refs.list;
118
- if (!rowCountChanged && list) {
119
- // Row count has not changed, so need to tell list to rerender.
120
- list.forceUpdateGrid();
121
- }
122
- if (!query && list) {
123
- // VirtualList can apply stale heights since it performs a shallow
124
- // compare to check if the list has changed. Should manually recompute
125
- // row heights for the case when frequent category come in later
126
- list.recomputeRowHeights();
127
- }
128
162
  });
129
163
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "addToCategoryMap", function (categoryToGroupMap, emoji, category) {
130
164
  if (!categoryToGroupMap[category]) {
@@ -144,7 +178,7 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
144
178
  _this.addToCategoryMap(categoryToGroupMap, emoji, emoji.category);
145
179
  // separate user emojis
146
180
  if (emoji.category === _constants.customCategory && currentUser && emoji.creatorUserId === currentUser.id) {
147
- _this.addToCategoryMap(categoryToGroupMap, emoji, 'USER_CUSTOM');
181
+ _this.addToCategoryMap(categoryToGroupMap, emoji, _constants.yourUploadsCategory);
148
182
  }
149
183
  return categoryToGroupMap;
150
184
  };
@@ -154,37 +188,45 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
154
188
  _this.allEmojiGroups = Object.keys(categoryToGroupMap).map(function (key) {
155
189
  return categoryToGroupMap[key];
156
190
  }).map(function (group) {
157
- if (group.category !== 'FREQUENT') {
191
+ if (group.category !== _constants.frequentCategory) {
158
192
  group.emojis.sort(byOrder);
159
193
  }
160
194
  return group;
161
195
  }).sort(byOrder);
162
196
  });
163
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "repaintList", function () {
164
- if (_this.refs.root) {
165
- var root = _this.refs.root;
166
- var display = root.style.display;
167
- root.style.display = 'none';
168
-
169
- // we need to access offset to force repaint
170
- // eslint-disable-next-line no-unused-expressions
171
- root.offsetHeight;
172
- root.style.display = display;
197
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "findCategoryToActivate", function (row) {
198
+ var category = null;
199
+ if (row instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
200
+ category = row.props.id;
201
+ } else if (row instanceof _EmojiPickerVirtualItems.EmojisRowItem) {
202
+ category = row.props.category;
203
+ }
204
+ // your uploads is rendered, take it as upload category, so could be highlighted in category selector
205
+ if (category === _constants.yourUploadsCategory) {
206
+ return _constants.customCategory;
207
+ // search results is rendered, return null so won't be highlighted for category selector
208
+ } else if (category === _constants.searchCategory) {
209
+ return null;
173
210
  }
211
+ return category;
174
212
  });
175
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "checkCategoryIdChange", function (indexes) {
213
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onRowsRendered", function (indexes) {
176
214
  var startIndex = indexes.startIndex;
215
+ var rowItem = _this.virtualItems[startIndex];
216
+ var list = _this.listRef.current;
177
217
 
178
- // FS-1844 Fix a rendering problem when scrolling to the top
179
- if (startIndex === 0) {
180
- _this.repaintList();
218
+ // update tabIndex manually, startIndex is not 0 based here
219
+ if (rowItem instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
220
+ // if top of row rendered is category heading, update tabIndex for the next emoji row
221
+ list === null || list === void 0 ? void 0 : list.updateFocusIndex(startIndex + 1);
222
+ } else if (rowItem instanceof _EmojiPickerVirtualItems.EmojisRowItem) {
223
+ // if top of row rendered is emoji row, update it's tabIndex.
224
+ list === null || list === void 0 ? void 0 : list.updateFocusIndex(startIndex);
181
225
  }
182
226
  if (!_this.props.query) {
183
227
  // Calculate category in view - only relevant if categories shown, i.e. no query
184
- var list = _this.refs.list;
185
- var currentCategory = _this.categoryTracker.findNearestCategoryAbove(startIndex, list);
186
- if (currentCategory && _this.activeCategoryId !== currentCategory) {
187
- _this.activeCategoryId = currentCategory;
228
+ var currentCategory = _this.findCategoryToActivate(rowItem);
229
+ if (currentCategory !== null && _this.props.activeCategoryId !== currentCategory) {
188
230
  if (_this.props.onCategoryActivated) {
189
231
  _this.props.onCategoryActivated(currentCategory);
190
232
  }
@@ -198,11 +240,12 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
198
240
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderRow", function (context) {
199
241
  return (0, _EmojiPickerVirtualItems.virtualItemRenderer)(_this.virtualItems, context);
200
242
  });
243
+ _this.lastYourUploadsRow = 0;
201
244
  _this.buildEmojiGroupedByCategory(_props.emojis, _props.currentUser);
202
245
  _this.buildVirtualItems(_props, _this.state);
203
246
  return _this;
204
247
  }
205
- (0, _createClass2.default)(EmojiPickerVirtualList, [{
248
+ (0, _createClass2.default)(EmojiPickerVirtualListInternal, [{
206
249
  key: "UNSAFE_componentWillUpdate",
207
250
  value: function UNSAFE_componentWillUpdate(nextProps, nextState) {
208
251
  if (this.props.emojis !== nextProps.emojis || this.props.selectedTone !== nextProps.selectedTone || this.props.loading !== nextProps.loading || this.props.query !== nextProps.query) {
@@ -221,42 +264,59 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
221
264
  */
222
265
  function reveal(category) {
223
266
  var row = this.categoryTracker.getRow(category);
224
- var list = this.refs.list;
225
- list.scrollToRow(row);
267
+ this.scrollToRow(row);
226
268
  }
227
269
  }, {
228
270
  key: "scrollToBottom",
229
271
  value: function scrollToBottom() {
230
- var list = this.refs.list;
231
- list.scrollToRow(this.virtualItems.length);
272
+ this.scrollToRow(this.virtualItems.length);
273
+ }
274
+ }, {
275
+ key: "scrollToTop",
276
+ value: function scrollToTop() {
277
+ this.scrollToRow(0);
278
+ }
279
+ }, {
280
+ key: "scrollToRow",
281
+ value: function scrollToRow(index) {
282
+ var _this$listRef$current;
283
+ (_this$listRef$current = this.listRef.current) === null || _this$listRef$current === void 0 ? void 0 : _this$listRef$current.scrollToRow(index);
284
+ }
285
+ }, {
286
+ key: "scrollToRecentlyUploaded",
287
+ value: function scrollToRecentlyUploaded() {
288
+ var row = this.lastYourUploadsRow;
289
+ if (row > 0) {
290
+ var _this$listRef$current2;
291
+ (_this$listRef$current2 = this.listRef.current) === null || _this$listRef$current2 === void 0 ? void 0 : _this$listRef$current2.scrollToRowAndFocusLastEmoji(this.lastYourUploadsRow);
292
+ }
232
293
  }
233
294
  }, {
234
295
  key: "render",
235
296
  value: function render() {
236
- var _this$props2 = this.props,
237
- query = _this$props2.query,
238
- selectedTone = _this$props2.selectedTone,
239
- onToneSelected = _this$props2.onToneSelected,
240
- onToneSelectorCancelled = _this$props2.onToneSelectorCancelled,
241
- toneEmoji = _this$props2.toneEmoji,
242
- uploading = _this$props2.uploading,
243
- uploadEnabled = _this$props2.uploadEnabled,
244
- emojiToDelete = _this$props2.emojiToDelete,
245
- initialUploadName = _this$props2.initialUploadName,
246
- uploadErrorMessage = _this$props2.uploadErrorMessage,
247
- onUploadCancelled = _this$props2.onUploadCancelled,
248
- onUploadEmoji = _this$props2.onUploadEmoji,
249
- onCloseDelete = _this$props2.onCloseDelete,
250
- onDeleteEmoji = _this$props2.onDeleteEmoji,
251
- onFileChooserClicked = _this$props2.onFileChooserClicked,
252
- onOpenUpload = _this$props2.onOpenUpload,
253
- _this$props2$size = _this$props2.size,
254
- size = _this$props2$size === void 0 ? _constants.defaultEmojiPickerSize : _this$props2$size;
297
+ var _this$props3 = this.props,
298
+ query = _this$props3.query,
299
+ selectedTone = _this$props3.selectedTone,
300
+ onToneSelected = _this$props3.onToneSelected,
301
+ onToneSelectorCancelled = _this$props3.onToneSelectorCancelled,
302
+ toneEmoji = _this$props3.toneEmoji,
303
+ uploading = _this$props3.uploading,
304
+ uploadEnabled = _this$props3.uploadEnabled,
305
+ emojiToDelete = _this$props3.emojiToDelete,
306
+ initialUploadName = _this$props3.initialUploadName,
307
+ uploadErrorMessage = _this$props3.uploadErrorMessage,
308
+ onUploadCancelled = _this$props3.onUploadCancelled,
309
+ onUploadEmoji = _this$props3.onUploadEmoji,
310
+ onCloseDelete = _this$props3.onCloseDelete,
311
+ onDeleteEmoji = _this$props3.onDeleteEmoji,
312
+ onFileChooserClicked = _this$props3.onFileChooserClicked,
313
+ onOpenUpload = _this$props3.onOpenUpload,
314
+ _this$props3$size = _this$props3.size,
315
+ size = _this$props3$size === void 0 ? _constants.defaultEmojiPickerSize : _this$props3$size,
316
+ emojis = _this$props3.emojis;
255
317
  var virtualListHeight = _EmojiPickerSizes.sizes.listHeight + (0, _utils.emojiPickerHeightOffset)(size);
256
- return (0, _react2.jsx)("div", {
257
- ref: "root",
258
- css: _styles.emojiPickerList,
259
- "data-testid": RENDER_EMOJI_PICKER_LIST_TESTID
318
+ return (0, _react2.jsx)(EmojiPickerTabPanel, {
319
+ showSearchResults: !!query
260
320
  }, (0, _react2.jsx)(_EmojiActions.default, {
261
321
  selectedTone: selectedTone,
262
322
  onToneSelected: onToneSelected,
@@ -274,9 +334,15 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
274
334
  onFileChooserClicked: onFileChooserClicked,
275
335
  onOpenUpload: onOpenUpload,
276
336
  query: query,
277
- onChange: this.onSearch
278
- }), (0, _react2.jsx)(_VirtualList.VirtualList, {
279
- ref: "list",
337
+ onChange: this.onSearch,
338
+ resultsCount: emojis.length
339
+ }), (0, _react2.jsx)(_EmojiPickerListContext.EmojiPickerListContextProvider, {
340
+ initialEmojisFocus: {
341
+ rowIndex: 1,
342
+ columnIndex: 0
343
+ }
344
+ }, (0, _react2.jsx)(_VirtualList.VirtualList, {
345
+ ref: this.listRef,
280
346
  height: virtualListHeight,
281
347
  overscanRowCount: 10,
282
348
  rowCount: this.virtualItems.length,
@@ -284,14 +350,14 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
284
350
  rowRenderer: this.renderRow,
285
351
  scrollToAlignment: "start",
286
352
  width: _EmojiPickerSizes.sizes.listWidth,
287
- onRowsRendered: this.checkCategoryIdChange
288
- }));
353
+ onRowsRendered: this.onRowsRendered
354
+ })));
289
355
  }
290
356
  }]);
291
- return EmojiPickerVirtualList;
357
+ return EmojiPickerVirtualListInternal;
292
358
  }(_react.PureComponent);
293
- exports.default = EmojiPickerVirtualList;
294
- (0, _defineProperty2.default)(EmojiPickerVirtualList, "defaultProps", {
359
+ exports.default = EmojiPickerVirtualListInternal;
360
+ (0, _defineProperty2.default)(EmojiPickerVirtualListInternal, "defaultProps", {
295
361
  onEmojiSelected: function onEmojiSelected() {},
296
362
  onEmojiActive: function onEmojiActive() {},
297
363
  onEmojiDelete: function onEmojiDelete() {},