@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
@@ -21,7 +21,7 @@ import { ProviderTypes } from '../types';
21
21
  import EmojiLoader from './EmojiLoader';
22
22
  import EmojiRepository from './EmojiRepository';
23
23
  import SiteEmojiResource from './media/SiteEmojiResource';
24
- import { sampledUfoEmojiResourceFetched } from '../util/analytics/ufoExperiences';
24
+ import { sampledUfoEmojiResourceFetched, ufoExperiences } from '../util/analytics/ufoExperiences';
25
25
  /**
26
26
  * Checks if the emojiProvider can support uploading at a feature level.
27
27
  *
@@ -41,6 +41,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
41
41
  _classCallCheck(this, EmojiResource);
42
42
  _this = _super.call(this);
43
43
  _defineProperty(_assertThisInitialized(_this), "activeLoaders", 0);
44
+ _defineProperty(_assertThisInitialized(_this), "initialLoaders", 0);
44
45
  _defineProperty(_assertThisInitialized(_this), "retries", new Map());
45
46
  _defineProperty(_assertThisInitialized(_this), "isInitialised", false);
46
47
  _defineProperty(_assertThisInitialized(_this), "getOptimisticImageURL", function (emojiId) {
@@ -49,8 +50,11 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
49
50
  }
50
51
  return;
51
52
  });
53
+ _defineProperty(_assertThisInitialized(_this), "isRepositoryAvailable", function (repository) {
54
+ return !!repository;
55
+ });
52
56
  _defineProperty(_assertThisInitialized(_this), "isLoaded", function () {
53
- return _this.activeLoaders === 0 && !!_this.emojiRepository;
57
+ return _this.initialLoaders !== 0 && _this.activeLoaders === 0;
54
58
  });
55
59
  _this.emojiProviderConfig = config;
56
60
  _this.recordConfig = config.recordConfig;
@@ -61,6 +65,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
61
65
  if (config.providers.length === 0) {
62
66
  throw new Error('No providers specified');
63
67
  }
68
+ _this.initialLoaders = _this.emojiProviderConfig.providers.length;
64
69
  _this.activeLoaders = _this.emojiProviderConfig.providers.length;
65
70
  _this.emojiResponses = [];
66
71
  return _this;
@@ -184,7 +189,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
184
189
  switch (_context3.prev = _context3.next) {
185
190
  case 0:
186
191
  force = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : false;
187
- if (!(force || !this.emojiRepository && !this.isInitialised)) {
192
+ if (!(force || !this.isRepositoryAvailable(this.emojiRepository) && !this.isInitialised)) {
188
193
  _context3.next = 6;
189
194
  break;
190
195
  }
@@ -218,7 +223,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
218
223
  while (1) {
219
224
  switch (_context4.prev = _context4.next) {
220
225
  case 0:
221
- if (!(this.emojiRepository && this.isLoaded())) {
226
+ if (!(this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository))) {
222
227
  _context4.next = 8;
223
228
  break;
224
229
  }
@@ -256,7 +261,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
256
261
  }
257
262
  return _context4.abrupt("return");
258
263
  case 17:
259
- if (this.siteEmojiResource) {
264
+ if (this.isRepositoryAvailable(this.siteEmojiResource)) {
260
265
  _context4.next = 20;
261
266
  break;
262
267
  }
@@ -326,7 +331,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
326
331
  }, {
327
332
  key: "initSiteEmojiResource",
328
333
  value: function initSiteEmojiResource(emojiResponse, provider) {
329
- if (!this.siteEmojiResource && emojiResponse.mediaApiToken) {
334
+ if (!this.isRepositoryAvailable(this.siteEmojiResource) && emojiResponse.mediaApiToken) {
330
335
  this.siteEmojiResource = new SiteEmojiResource(provider, emojiResponse.mediaApiToken);
331
336
 
332
337
  // Prime cache type + optimistic rendering by checking first Emoji.
@@ -424,7 +429,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
424
429
  while (1) {
425
430
  switch (_context5.prev = _context5.next) {
426
431
  case 0:
427
- if (!(this.siteEmojiResource && isMediaRepresentation(emoji.representation))) {
432
+ if (!(this.isRepositoryAvailable(this.siteEmojiResource) && isMediaRepresentation(emoji.representation))) {
428
433
  _context5.next = 5;
429
434
  break;
430
435
  }
@@ -454,7 +459,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
454
459
  }, {
455
460
  key: "loadMediaEmoji",
456
461
  value: function loadMediaEmoji(emoji, useAlt) {
457
- if (!this.siteEmojiResource || !isMediaEmoji(emoji)) {
462
+ if (!this.isRepositoryAvailable(this.siteEmojiResource) || !isMediaEmoji(emoji)) {
458
463
  return emoji;
459
464
  }
460
465
  return this.siteEmojiResource.loadMediaEmoji(emoji, useAlt);
@@ -465,7 +470,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
465
470
  if (!isMediaEmoji(emoji)) {
466
471
  return true;
467
472
  }
468
- if (!this.siteEmojiResource) {
473
+ if (!this.isRepositoryAvailable(this.siteEmojiResource)) {
469
474
  // Shouldn't have a media emoji without a siteEmojiResouce, but anyway ;)
470
475
  return false;
471
476
  }
@@ -479,12 +484,23 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
479
484
  }, {
480
485
  key: "filter",
481
486
  value: function filter(query, options) {
487
+ ufoExperiences['emoji-searched'].start();
488
+ ufoExperiences['emoji-searched'].addMetadata({
489
+ queryLength: (query === null || query === void 0 ? void 0 : query.length) || 0
490
+ });
482
491
  this.lastQuery = {
483
492
  query: query,
484
493
  options: options
485
494
  };
486
- if (this.emojiRepository) {
487
- this.notifyResult(this.emojiRepository.search(query, options));
495
+ if (this.isRepositoryAvailable(this.emojiRepository)) {
496
+ var searchResults = this.emojiRepository.search(query, options);
497
+ this.notifyResult(searchResults);
498
+ ufoExperiences['emoji-searched'].success({
499
+ metadata: {
500
+ emojisLength: searchResults.emojis.length,
501
+ source: (options === null || options === void 0 ? void 0 : options.source) || 'typeahead'
502
+ }
503
+ });
488
504
  } else {
489
505
  // not ready
490
506
  this.notifyNotReady();
@@ -494,7 +510,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
494
510
  key: "findByShortName",
495
511
  value: function findByShortName(shortName) {
496
512
  var _this4 = this;
497
- if (this.isLoaded()) {
513
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
498
514
  // Wait for all emoji to load before looking by shortName (to ensure correct priority)
499
515
  return this.emojiRepository.findByShortName(shortName);
500
516
  }
@@ -508,7 +524,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
508
524
  var _this5 = this;
509
525
  var id = emojiId.id,
510
526
  shortName = emojiId.shortName;
511
- if (this.emojiRepository) {
527
+ if (this.isRepositoryAvailable(this.emojiRepository)) {
512
528
  if (id) {
513
529
  var emoji = this.emojiRepository.findById(id);
514
530
  if (emoji) {
@@ -517,7 +533,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
517
533
  if (this.isLoaded()) {
518
534
  // all loaded but not found by id, try server to see if
519
535
  // this is a newly uploaded emoji
520
- if (this.siteEmojiResource) {
536
+ if (this.isRepositoryAvailable(this.siteEmojiResource)) {
521
537
  return this.siteEmojiResource.findEmoji(emojiId).then(function (emoji) {
522
538
  if (!emoji) {
523
539
  // if not, fallback to searching by shortName to
@@ -546,7 +562,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
546
562
  key: "findById",
547
563
  value: function findById(id) {
548
564
  var _this6 = this;
549
- if (this.isLoaded()) {
565
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
550
566
  return this.emojiRepository.findById(id);
551
567
  }
552
568
  return this.retryIfLoading(function () {
@@ -557,7 +573,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
557
573
  key: "findInCategory",
558
574
  value: function findInCategory(categoryId) {
559
575
  var _this7 = this;
560
- if (this.isLoaded()) {
576
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
561
577
  return Promise.resolve(this.emojiRepository.findInCategory(categoryId));
562
578
  }
563
579
  return this.retryIfLoading(function () {
@@ -568,7 +584,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
568
584
  key: "getAsciiMap",
569
585
  value: function getAsciiMap() {
570
586
  var _this8 = this;
571
- if (this.isLoaded()) {
587
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
572
588
  return Promise.resolve(this.emojiRepository.getAsciiMap());
573
589
  }
574
590
  return this.retryIfLoading(function () {
@@ -579,7 +595,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
579
595
  key: "getFrequentlyUsed",
580
596
  value: function getFrequentlyUsed(options) {
581
597
  var _this9 = this;
582
- if (this.isLoaded()) {
598
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
583
599
  return Promise.resolve(this.emojiRepository.getFrequentlyUsed(options));
584
600
  }
585
601
  return this.retryIfLoading(function () {
@@ -598,7 +614,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
598
614
  key: "recordSelection",
599
615
  value: function recordSelection(emoji) {
600
616
  var recordConfig = this.recordConfig;
601
- if (this.emojiRepository) {
617
+ if (this.isRepositoryAvailable(this.emojiRepository)) {
602
618
  this.emojiRepository.used(emoji);
603
619
  }
604
620
  if (recordConfig) {
@@ -619,9 +635,9 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
619
635
  key: "deleteSiteEmoji",
620
636
  value: function deleteSiteEmoji(emoji) {
621
637
  var _this10 = this;
622
- if (this.siteEmojiResource && emoji.id) {
638
+ if (this.isRepositoryAvailable(this.siteEmojiResource) && emoji.id) {
623
639
  return this.siteEmojiResource.deleteEmoji(emoji).then(function (success) {
624
- if (success && _this10.emojiRepository) {
640
+ if (success && _this10.isRepositoryAvailable(_this10.emojiRepository)) {
625
641
  _this10.emojiRepository.delete(emoji);
626
642
  return true;
627
643
  }
@@ -661,7 +677,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
661
677
  key: "calculateDynamicCategories",
662
678
  value: function calculateDynamicCategories() {
663
679
  var _this11 = this;
664
- if (this.isLoaded()) {
680
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
665
681
  return Promise.resolve(this.emojiRepository.getDynamicCategoryList());
666
682
  }
667
683
  return this.retryIfLoading(function () {
@@ -676,7 +692,7 @@ export var EmojiResource = /*#__PURE__*/function (_ref) {
676
692
  }, {
677
693
  key: "addUnknownEmoji",
678
694
  value: function addUnknownEmoji(emoji) {
679
- if (this.emojiRepository) {
695
+ if (this.isRepositoryAvailable(this.emojiRepository)) {
680
696
  this.emojiRepository.addUnknownEmoji(emoji);
681
697
  }
682
698
  }
@@ -700,7 +716,7 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
700
716
  if (!this.allowUpload) {
701
717
  return Promise.resolve(false);
702
718
  }
703
- if (this.siteEmojiResource) {
719
+ if (this.isRepositoryAvailable(this.siteEmojiResource)) {
704
720
  return this.siteEmojiResource.hasUploadToken();
705
721
  }
706
722
  return this.retryIfLoading(function () {
@@ -713,7 +729,7 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
713
729
  var _this14 = this;
714
730
  var retry = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
715
731
  return this.isUploadSupported().then(function (supported) {
716
- if (!supported || !_this14.siteEmojiResource) {
732
+ if (!supported || !_this14.isRepositoryAvailable(_this14.siteEmojiResource)) {
717
733
  return Promise.reject('No media api support is configured');
718
734
  }
719
735
  return _this14.siteEmojiResource.uploadEmoji(upload, retry).then(function (emoji) {
@@ -727,7 +743,7 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
727
743
  key: "prepareForUpload",
728
744
  value: function prepareForUpload() {
729
745
  var _this15 = this;
730
- if (this.siteEmojiResource) {
746
+ if (this.isRepositoryAvailable(this.siteEmojiResource)) {
731
747
  this.siteEmojiResource.prepareForUpload();
732
748
  }
733
749
  return this.retryIfLoading(function () {
@@ -50,10 +50,10 @@ var TokenManager = /*#__PURE__*/function () {
50
50
  // still valid
51
51
  return Promise.resolve(mediaApiToken);
52
52
  }
53
- if (activeTokenRefresh) {
54
- // refresh token promise already active, return that
55
- return activeTokenRefresh;
56
- }
53
+ }
54
+ if (activeTokenRefresh) {
55
+ // refresh token promise already active, return that
56
+ return activeTokenRefresh;
57
57
  }
58
58
 
59
59
  // request a new token and track the promise for future requests until completed
@@ -1,7 +1,8 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _extends from "@babel/runtime/helpers/extends";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
- var _excluded = ["emoji", "placeholderSize", "showTooltip", "fitToHeight", "children"];
4
+ var _excluded = ["emoji", "placeholderSize"],
5
+ _excluded2 = ["emoji", "placeholderSize", "showTooltip", "fitToHeight", "children"];
5
6
  import React, { memo, useEffect, useState } from 'react';
6
7
  import { isMediaEmoji } from '../../util/type-helpers';
7
8
  import { UfoEmojiTimings } from '../../types';
@@ -21,7 +22,9 @@ import { extractErrorInfo } from '../../util/analytics/analytics';
21
22
  export var CachingEmoji = function CachingEmoji(props) {
22
23
  // Optimisation to only render CachingMediaEmoji if necessary
23
24
  // slight performance hit, which accumulates for a large number of emoji.
24
- var emoji = props.emoji;
25
+ var emoji = props.emoji,
26
+ placeholderSize = props.placeholderSize,
27
+ restProps = _objectWithoutProperties(props, _excluded);
25
28
  // start emoji rendered experience, it may have already started earlier in `ResourcedEmoji`.
26
29
  useSampledUFOComponentExperience(ufoExperiences['emoji-rendered'].getInstance(emoji.id || emoji.shortName), SAMPLING_RATE_EMOJI_RENDERED_EXP, {
27
30
  source: 'CachingEmoji',
@@ -35,9 +38,14 @@ export var CachingEmoji = function CachingEmoji(props) {
35
38
  }, []);
36
39
  var emojiNode = function emojiNode() {
37
40
  if (isMediaEmoji(emoji)) {
38
- return /*#__PURE__*/React.createElement(CachingMediaEmoji, props);
41
+ return /*#__PURE__*/React.createElement(CachingMediaEmoji, _extends({
42
+ emoji: emoji,
43
+ placeholderSize: placeholderSize
44
+ }, restProps));
39
45
  }
40
- return /*#__PURE__*/React.createElement(Emoji, props);
46
+ return /*#__PURE__*/React.createElement(Emoji, _extends({
47
+ emoji: emoji
48
+ }, restProps));
41
49
  };
42
50
  return /*#__PURE__*/React.createElement(UfoErrorBoundary, {
43
51
  experiences: [ufoExperiences['emoji-rendered'].getInstance(props.emoji.id || props.emoji.shortName)]
@@ -54,7 +62,7 @@ export var CachingMediaEmoji = function CachingMediaEmoji(props) {
54
62
  showTooltip = props.showTooltip,
55
63
  fitToHeight = props.fitToHeight,
56
64
  children = props.children,
57
- restProps = _objectWithoutProperties(props, _excluded);
65
+ restProps = _objectWithoutProperties(props, _excluded2);
58
66
  var shortName = emoji.shortName,
59
67
  representation = emoji.representation;
60
68
  var _useState = useState(),
@@ -1,6 +1,9 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _extends from "@babel/runtime/helpers/extends";
3
3
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
5
+ var _excluded = ["emoji", "fitToHeight", "selected", "selectOnHover", "className", "showTooltip", "shouldBeInteractive", "tabIndex", "onSelected", "onMouseMove", "onFocus", "onDelete", "onLoadError", "onLoadSuccess", "showDelete", "disableLazyLoad", "autoWidth"],
6
+ _excluded2 = ["emoji", "fitToHeight", "selected", "selectOnHover", "className", "showTooltip", "showDelete", "shouldBeInteractive", "tabIndex", "onSelected", "onMouseMove", "onFocus", "onDelete", "onLoadError", "onLoadSuccess", "disableLazyLoad", "autoWidth"];
4
7
  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; }
5
8
  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) { _defineProperty(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; }
6
9
  /** @jsx jsx */
@@ -48,6 +51,13 @@ var handleMouseMove = function handleMouseMove(props, event) {
48
51
  onMouseMove(toEmojiId(emoji), emoji, event);
49
52
  }
50
53
  };
54
+ var handleFocus = function handleFocus(props, event) {
55
+ var emoji = props.emoji,
56
+ onFocus = props.onFocus;
57
+ if (onFocus) {
58
+ onFocus(toEmojiId(emoji), emoji, event);
59
+ }
60
+ };
51
61
  var handleDelete = function handleDelete(props, event) {
52
62
  var emoji = props.emoji,
53
63
  onDelete = props.onDelete;
@@ -79,7 +89,19 @@ export var SpriteEmoji = function SpriteEmoji(props) {
79
89
  selectOnHover = props.selectOnHover,
80
90
  className = props.className,
81
91
  showTooltip = props.showTooltip,
82
- shouldBeInteractive = props.shouldBeInteractive;
92
+ _props$shouldBeIntera = props.shouldBeInteractive,
93
+ shouldBeInteractive = _props$shouldBeIntera === void 0 ? false : _props$shouldBeIntera,
94
+ tabIndex = props.tabIndex,
95
+ onSelected = props.onSelected,
96
+ onMouseMove = props.onMouseMove,
97
+ onFocus = props.onFocus,
98
+ onDelete = props.onDelete,
99
+ onLoadError = props.onLoadError,
100
+ onLoadSuccess = props.onLoadSuccess,
101
+ showDelete = props.showDelete,
102
+ disableLazyLoad = props.disableLazyLoad,
103
+ autoWidth = props.autoWidth,
104
+ other = _objectWithoutProperties(props, _excluded);
83
105
  var representation = emoji.representation;
84
106
  var sprite = representation.sprite;
85
107
  var classes = "".concat(emojiNodeStyles, " ").concat(selected ? commonSelectedStyles : '', " ").concat(selectOnHover ? selectOnHoverStyles : '', " ").concat(className ? className : '');
@@ -99,11 +121,11 @@ export var SpriteEmoji = function SpriteEmoji(props) {
99
121
  backgroundPosition: "".concat(xPositionInPercent, "% ").concat(yPositionInPercent, "%"),
100
122
  backgroundSize: "".concat(sprite.column * 100, "% ").concat(sprite.row * 100, "%")
101
123
  }, sizing);
102
- return jsx("span", {
124
+ return jsx("span", _extends({
103
125
  "data-testid": "sprite-emoji-".concat(emoji.shortName),
104
126
  "data-emoji-type": "sprite",
105
- tabIndex: shouldBeInteractive ? 0 : undefined,
106
- role: shouldBeInteractive ? 'button' : undefined,
127
+ tabIndex: shouldBeInteractive ? tabIndex || 0 : undefined,
128
+ role: shouldBeInteractive ? 'button' : 'img',
107
129
  css: emojiContainer,
108
130
  className: classes,
109
131
  onKeyPress: function onKeyPress(event) {
@@ -115,9 +137,12 @@ export var SpriteEmoji = function SpriteEmoji(props) {
115
137
  onMouseEnter: function onMouseEnter(event) {
116
138
  handleMouseMove(props, event);
117
139
  },
140
+ onFocus: function onFocus(event) {
141
+ handleFocus(props, event);
142
+ },
118
143
  "aria-label": emoji.shortName,
119
144
  title: showTooltip ? emoji.shortName : ''
120
- }, jsx("span", {
145
+ }, other), jsx("span", {
121
146
  className: emojiSprite,
122
147
  style: style
123
148
  }, "\xA0"));
@@ -132,10 +157,18 @@ export var ImageEmoji = function ImageEmoji(props) {
132
157
  className = props.className,
133
158
  showTooltip = props.showTooltip,
134
159
  showDelete = props.showDelete,
135
- shouldBeInteractive = props.shouldBeInteractive,
160
+ _props$shouldBeIntera2 = props.shouldBeInteractive,
161
+ shouldBeInteractive = _props$shouldBeIntera2 === void 0 ? false : _props$shouldBeIntera2,
162
+ tabIndex = props.tabIndex,
163
+ onSelected = props.onSelected,
164
+ onMouseMove = props.onMouseMove,
165
+ onFocus = props.onFocus,
166
+ onDelete = props.onDelete,
167
+ onLoadError = props.onLoadError,
136
168
  onLoadSuccess = props.onLoadSuccess,
137
169
  disableLazyLoad = props.disableLazyLoad,
138
- autoWidth = props.autoWidth;
170
+ autoWidth = props.autoWidth,
171
+ other = _objectWithoutProperties(props, _excluded2);
139
172
  var _useInView = useInView({
140
173
  triggerOnce: true
141
174
  }),
@@ -233,12 +266,12 @@ export var ImageEmoji = function ImageEmoji(props) {
233
266
  onError: onError,
234
267
  onLoad: onLoad
235
268
  }, sizing));
236
- return jsx("span", {
269
+ return jsx("span", _extends({
237
270
  "data-testid": "image-emoji-".concat(emoji.shortName),
238
271
  "data-emoji-type": "image",
239
272
  css: emojiStyles,
240
- tabIndex: shouldBeInteractive ? 0 : undefined,
241
- role: shouldBeInteractive ? 'button' : undefined,
273
+ tabIndex: shouldBeInteractive ? tabIndex || 0 : undefined,
274
+ role: shouldBeInteractive ? 'button' : 'img',
242
275
  className: classes,
243
276
  onKeyPress: function onKeyPress(event) {
244
277
  return handleKeyPress(props, event);
@@ -249,10 +282,13 @@ export var ImageEmoji = function ImageEmoji(props) {
249
282
  onMouseEnter: function onMouseEnter(event) {
250
283
  handleMouseMove(props, event);
251
284
  },
285
+ onFocus: function onFocus(event) {
286
+ handleFocus(props, event);
287
+ },
252
288
  "aria-label": emoji.shortName,
253
289
  title: showTooltip ? emoji.shortName : '',
254
290
  ref: ref
255
- }, deleteButton, emojiNode);
291
+ }, other), deleteButton, emojiNode);
256
292
  };
257
293
  export var Emoji = function Emoji(props) {
258
294
  var emoji = props.emoji;
@@ -1,20 +1,21 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
3
  /** @jsx jsx */
4
- import { Fragment, useState } from 'react';
4
+ import { Fragment, useState, useRef, useEffect, memo } from 'react';
5
5
  import { jsx } from '@emotion/react';
6
6
  import { FormattedMessage, injectIntl } from 'react-intl-next';
7
7
  import EmojiDeletePreview from '../common/EmojiDeletePreview';
8
8
  import EmojiUploadPicker from '../common/EmojiUploadPicker';
9
- import EmojiPickerListSearch from '../picker/EmojiPickerListSearch';
9
+ import { EmojiPickerListSearch } from '../picker/EmojiPickerListSearch';
10
10
  import ToneSelector from './ToneSelector';
11
- import EmojiButton from './EmojiButton';
11
+ import TonePreviewButton from './TonePreviewButton';
12
12
  import { messages } from '../i18n';
13
13
  import AkButton from '@atlaskit/button/standard-button';
14
14
  import AddIcon from '@atlaskit/icon/glyph/add';
15
15
  import { setSkinToneAriaLabelText } from './setSkinToneAriaLabelText';
16
16
  import { addCustomEmoji, addCustomEmojiButton, emojiActionsWrapper, emojiPickerAddEmoji, emojiToneSelectorContainer } from './styles';
17
17
  import { emojiActionsContainerWithBottomShadow, emojiPickerFooter } from '../picker/styles';
18
+ import { DEFAULT_TONE } from '../../util/constants';
18
19
  export var emojiActionsTestId = 'emoji-actions';
19
20
  export var uploadEmojiTestId = 'upload-emoji';
20
21
 
@@ -22,8 +23,7 @@ export var uploadEmojiTestId = 'upload-emoji';
22
23
 
23
24
  var AddOwnEmoji = function AddOwnEmoji(props) {
24
25
  var onOpenUpload = props.onOpenUpload,
25
- uploadEnabled = props.uploadEnabled,
26
- formatMessage = props.intl.formatMessage;
26
+ uploadEnabled = props.uploadEnabled;
27
27
  return jsx(Fragment, null, uploadEnabled && jsx("div", {
28
28
  css: addCustomEmoji,
29
29
  "data-testid": uploadEmojiTestId
@@ -31,44 +31,73 @@ var AddOwnEmoji = function AddOwnEmoji(props) {
31
31
  return jsx(AkButton, {
32
32
  onClick: onOpenUpload,
33
33
  iconBefore: jsx(AddIcon, {
34
- label: formatMessage(messages.addCustomEmojiLabel),
34
+ label: "",
35
35
  size: "small"
36
36
  }),
37
37
  appearance: "subtle",
38
38
  css: addCustomEmojiButton,
39
- className: emojiPickerAddEmoji
39
+ className: emojiPickerAddEmoji,
40
+ tabIndex: 0,
41
+ id: "add-custom-emoji"
40
42
  }, label);
41
43
  })));
42
44
  };
43
45
  var TonesWrapper = function TonesWrapper(props) {
44
46
  var toneEmoji = props.toneEmoji,
45
- selectedTone = props.selectedTone,
47
+ _props$selectedTone = props.selectedTone,
48
+ selectedTone = _props$selectedTone === void 0 ? DEFAULT_TONE : _props$selectedTone,
46
49
  intl = props.intl,
47
- onToneSelected = props.onToneSelected,
48
50
  onToneOpen = props.onToneOpen,
49
51
  showToneSelector = props.showToneSelector;
50
52
  var formatMessage = intl.formatMessage;
53
+ var tonePreviewButtonRef = useRef(null);
54
+ var _useState = useState(false),
55
+ _useState2 = _slicedToArray(_useState, 2),
56
+ focusTonePreviewButton = _useState2[0],
57
+ setFocusTonePreviewButton = _useState2[1];
58
+ useEffect(function () {
59
+ if (focusTonePreviewButton && tonePreviewButtonRef.current) {
60
+ tonePreviewButtonRef.current.focus();
61
+ }
62
+ return function () {
63
+ setFocusTonePreviewButton(false);
64
+ };
65
+ });
66
+ var onToneCloseHandler = function onToneCloseHandler() {
67
+ var onToneClose = props.onToneClose;
68
+ onToneClose();
69
+ setFocusTonePreviewButton(true);
70
+ };
71
+ var onToneSelectedHandler = function onToneSelectedHandler(toneValue) {
72
+ var onToneSelected = props.onToneSelected;
73
+ onToneSelected(toneValue);
74
+ setFocusTonePreviewButton(true);
75
+ };
51
76
  if (!toneEmoji) {
52
77
  return null;
53
78
  }
54
- var previewEmoji = toneEmoji;
55
- if (selectedTone && previewEmoji.skinVariations) {
56
- previewEmoji = previewEmoji.skinVariations[(selectedTone || 1) - 1];
79
+ var previewToneEmoji = toneEmoji;
80
+ if (selectedTone !== DEFAULT_TONE && previewToneEmoji.skinVariations) {
81
+ previewToneEmoji = previewToneEmoji.skinVariations[selectedTone - 1];
57
82
  }
58
83
  return jsx("div", {
59
84
  css: emojiToneSelectorContainer
60
- }, showToneSelector && jsx(ToneSelector, {
85
+ }, jsx(ToneSelector, {
61
86
  emoji: toneEmoji,
62
- onToneSelected: onToneSelected,
63
- previewEmojiId: previewEmoji.id
64
- }), jsx(EmojiButton, {
87
+ onToneSelected: onToneSelectedHandler,
88
+ onToneClose: onToneCloseHandler,
89
+ selectedTone: selectedTone,
90
+ isVisible: showToneSelector
91
+ }), jsx(TonePreviewButton, {
92
+ ref: tonePreviewButtonRef,
65
93
  ariaExpanded: showToneSelector,
66
- emoji: previewEmoji,
94
+ emoji: previewToneEmoji,
67
95
  selectOnHover: true,
68
96
  onSelected: onToneOpen,
69
97
  ariaLabelText: formatMessage(messages.emojiSelectSkinToneButtonAriaLabelText, {
70
- selectedTone: "".concat(setSkinToneAriaLabelText(previewEmoji.name), " selected")
71
- })
98
+ selectedTone: "".concat(setSkinToneAriaLabelText(previewToneEmoji.name))
99
+ }),
100
+ isVisible: !showToneSelector
72
101
  }));
73
102
  };
74
103
  export var EmojiActions = function EmojiActions(props) {
@@ -84,15 +113,20 @@ export var EmojiActions = function EmojiActions(props) {
84
113
  onFileChooserClicked = props.onFileChooserClicked,
85
114
  emojiToDelete = props.emojiToDelete,
86
115
  onChange = props.onChange,
87
- query = props.query;
88
- var _useState = useState(false),
89
- _useState2 = _slicedToArray(_useState, 2),
90
- showToneSelector = _useState2[0],
91
- setShowToneSelector = _useState2[1];
116
+ query = props.query,
117
+ _props$resultsCount = props.resultsCount,
118
+ resultsCount = _props$resultsCount === void 0 ? 0 : _props$resultsCount;
119
+ var _useState3 = useState(false),
120
+ _useState4 = _slicedToArray(_useState3, 2),
121
+ showToneSelector = _useState4[0],
122
+ setShowToneSelector = _useState4[1];
92
123
  var previewFooterClassnames = [emojiPickerFooter, emojiActionsContainerWithBottomShadow];
93
124
  var onToneOpenHandler = function onToneOpenHandler() {
94
125
  return setShowToneSelector(true);
95
126
  };
127
+ var onToneCloseHandler = function onToneCloseHandler() {
128
+ return setShowToneSelector(false);
129
+ };
96
130
  var onToneSelectedHandler = function onToneSelectedHandler(toneValue) {
97
131
  setShowToneSelector(false);
98
132
  if (onToneSelected) {
@@ -133,11 +167,13 @@ export var EmojiActions = function EmojiActions(props) {
133
167
  css: emojiActionsWrapper
134
168
  }, !showToneSelector && jsx(EmojiPickerListSearch, {
135
169
  onChange: onChange,
136
- query: query
170
+ query: query,
171
+ resultsCount: resultsCount
137
172
  }), jsx(TonesWrapper, _extends({}, props, {
138
173
  onToneOpen: onToneOpenHandler,
174
+ onToneClose: onToneCloseHandler,
139
175
  onToneSelected: onToneSelectedHandler,
140
176
  showToneSelector: showToneSelector
141
177
  }))), jsx(AddOwnEmoji, props));
142
178
  };
143
- export default injectIntl(EmojiActions);
179
+ export default injectIntl( /*#__PURE__*/memo(EmojiActions));
@@ -1,8 +1,9 @@
1
1
  /** @jsx jsx */
2
-
2
+ import { Fragment } from 'react';
3
3
  import { jsx } from '@emotion/react';
4
4
  import Tooltip from '@atlaskit/tooltip';
5
5
  import ErrorIcon from '@atlaskit/icon/glyph/error';
6
+ import VisuallyHidden from '@atlaskit/visually-hidden';
6
7
  export var emojiErrorMessageTestId = 'emoji-error-message';
7
8
  export var emojiErrorMessageTooltipTestId = 'emoji-error-message-tooltip';
8
9
  export var emojiErrorIconTestId = 'emoji-error-icon';
@@ -10,7 +11,7 @@ var EmojiErrorMessage = function EmojiErrorMessage(props) {
10
11
  var messageStyles = props.messageStyles,
11
12
  message = props.message,
12
13
  tooltip = props.tooltip;
13
- return tooltip ? jsx("div", {
14
+ var visualContent = tooltip ? jsx("div", {
14
15
  css: messageStyles,
15
16
  "data-testid": emojiErrorMessageTestId
16
17
  }, jsx(Tooltip, {
@@ -27,6 +28,9 @@ var EmojiErrorMessage = function EmojiErrorMessage(props) {
27
28
  }, jsx(ErrorIcon, {
28
29
  label: "Error",
29
30
  size: "small"
30
- }), " ", message);
31
+ }), message);
32
+ return jsx(Fragment, null, jsx(VisuallyHidden, {
33
+ role: "alert"
34
+ }, message), visualContent);
31
35
  };
32
36
  export default EmojiErrorMessage;
@@ -34,6 +34,7 @@ var EmojiPlaceholder = function EmojiPlaceholder(props) {
34
34
  return jsx("span", {
35
35
  "data-testid": emojiPlaceholderTestId(shortName),
36
36
  "aria-busy": loading,
37
+ role: "status",
37
38
  "aria-label": shortName,
38
39
  className: placeholder,
39
40
  css: loading ? [placeholderContainer, placeholderContainerAnimated] : placeholderContainer,