@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 67.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`2b2aa109521`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2b2aa109521) - [ux] improve keyboard navigation in emoji picker list, improve category highlight logic in emoji picker
8
+ - [`7e3c38a86ef`](https://bitbucket.org/atlassian/atlassian-frontend/commits/7e3c38a86ef) - [ux] [COLLAB-2264] add arrow keys support for navigating categories selctor in emoji picker, used tabs structure for emoji picker with category selctor for better accessibility, added more aria-labels for category selector and picker list panel for accessibility, highlight first category in emoji picker at start
9
+
10
+ ### Patch Changes
11
+
12
+ - [`d06e5f9c381`](https://bitbucket.org/atlassian/atlassian-frontend/commits/d06e5f9c381) - Fixed accessibility issues in upload emoji journey flagged by axe and added accessibility tests
13
+ - [`2c650251e9a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2c650251e9a) - Improve uploading custom emoji experience for screen reader user
14
+ - [`ef218ded5ca`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ef218ded5ca) - ResourcedEmoji component will fallback when provider fails to fetch
15
+ - [`37192cbc921`](https://bitbucket.org/atlassian/atlassian-frontend/commits/37192cbc921) - Scroll and focus on newly uploaded emoji in the picker list after uploading
16
+ - [`36f471471e3`](https://bitbucket.org/atlassian/atlassian-frontend/commits/36f471471e3) - fix scroll to category when click category in category toolbar
17
+ - [`ed20cc3d0d9`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ed20cc3d0d9) - Changed 'Choose File' button in Emoji Picker to a standard button
18
+ - [`47c411e6564`](https://bitbucket.org/atlassian/atlassian-frontend/commits/47c411e6564) - [ux] [COLLAB-2281] Improve keyboard experience with tone selector, changes include allow arrow key nagivation, allow Tab key to close tone selector, focus on the selected/default tone when tone selector is expanded, focus on tone selector trigger button after closing tone selector
19
+ - [`2896c02e6cb`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2896c02e6cb) - update aria attributes across emoji components to improve accessibility
20
+ - [`d4234822fb6`](https://bitbucket.org/atlassian/atlassian-frontend/commits/d4234822fb6) - [ux] Updated focus styling to align with Atlassian Design System styling
21
+ - [`221f0101322`](https://bitbucket.org/atlassian/atlassian-frontend/commits/221f0101322) - Fixes a bug where get token could be called multiple times while in flight
22
+ - [`1537683bd72`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1537683bd72) - clean up css of emoji picker
23
+ - [`73b9fda49ad`](https://bitbucket.org/atlassian/atlassian-frontend/commits/73b9fda49ad) - Fixed accessibility issues in emoji picker flagged by axe
24
+ - Updated dependencies
25
+
26
+ ## 67.1.0
27
+
28
+ ### Minor Changes
29
+
30
+ - [`27b1925f52a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/27b1925f52a) - - search emoji in emoji picker will scroll to top
31
+ - improve emoji search analytics tracking
32
+ - add debounce to emoji search
33
+ - fix duplicated calls triggered by each emoji search
34
+ - functional component refactoring for VirtualList and EmojiPickerListSearch
35
+
36
+ ### Patch Changes
37
+
38
+ - Updated dependencies
39
+
3
40
  ## 67.0.7
4
41
 
5
42
  ### Patch Changes
@@ -49,6 +49,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
49
49
  (0, _classCallCheck2.default)(this, EmojiResource);
50
50
  _this = _super.call(this);
51
51
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "activeLoaders", 0);
52
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "initialLoaders", 0);
52
53
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "retries", new Map());
53
54
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isInitialised", false);
54
55
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getOptimisticImageURL", function (emojiId) {
@@ -57,8 +58,11 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
57
58
  }
58
59
  return;
59
60
  });
61
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isRepositoryAvailable", function (repository) {
62
+ return !!repository;
63
+ });
60
64
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isLoaded", function () {
61
- return _this.activeLoaders === 0 && !!_this.emojiRepository;
65
+ return _this.initialLoaders !== 0 && _this.activeLoaders === 0;
62
66
  });
63
67
  _this.emojiProviderConfig = config;
64
68
  _this.recordConfig = config.recordConfig;
@@ -69,6 +73,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
69
73
  if (config.providers.length === 0) {
70
74
  throw new Error('No providers specified');
71
75
  }
76
+ _this.initialLoaders = _this.emojiProviderConfig.providers.length;
72
77
  _this.activeLoaders = _this.emojiProviderConfig.providers.length;
73
78
  _this.emojiResponses = [];
74
79
  return _this;
@@ -192,7 +197,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
192
197
  switch (_context3.prev = _context3.next) {
193
198
  case 0:
194
199
  force = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : false;
195
- if (!(force || !this.emojiRepository && !this.isInitialised)) {
200
+ if (!(force || !this.isRepositoryAvailable(this.emojiRepository) && !this.isInitialised)) {
196
201
  _context3.next = 6;
197
202
  break;
198
203
  }
@@ -226,7 +231,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
226
231
  while (1) {
227
232
  switch (_context4.prev = _context4.next) {
228
233
  case 0:
229
- if (!(this.emojiRepository && this.isLoaded())) {
234
+ if (!(this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository))) {
230
235
  _context4.next = 8;
231
236
  break;
232
237
  }
@@ -264,7 +269,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
264
269
  }
265
270
  return _context4.abrupt("return");
266
271
  case 17:
267
- if (this.siteEmojiResource) {
272
+ if (this.isRepositoryAvailable(this.siteEmojiResource)) {
268
273
  _context4.next = 20;
269
274
  break;
270
275
  }
@@ -334,7 +339,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
334
339
  }, {
335
340
  key: "initSiteEmojiResource",
336
341
  value: function initSiteEmojiResource(emojiResponse, provider) {
337
- if (!this.siteEmojiResource && emojiResponse.mediaApiToken) {
342
+ if (!this.isRepositoryAvailable(this.siteEmojiResource) && emojiResponse.mediaApiToken) {
338
343
  this.siteEmojiResource = new _SiteEmojiResource.default(provider, emojiResponse.mediaApiToken);
339
344
 
340
345
  // Prime cache type + optimistic rendering by checking first Emoji.
@@ -432,7 +437,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
432
437
  while (1) {
433
438
  switch (_context5.prev = _context5.next) {
434
439
  case 0:
435
- if (!(this.siteEmojiResource && (0, _typeHelpers.isMediaRepresentation)(emoji.representation))) {
440
+ if (!(this.isRepositoryAvailable(this.siteEmojiResource) && (0, _typeHelpers.isMediaRepresentation)(emoji.representation))) {
436
441
  _context5.next = 5;
437
442
  break;
438
443
  }
@@ -462,7 +467,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
462
467
  }, {
463
468
  key: "loadMediaEmoji",
464
469
  value: function loadMediaEmoji(emoji, useAlt) {
465
- if (!this.siteEmojiResource || !(0, _typeHelpers.isMediaEmoji)(emoji)) {
470
+ if (!this.isRepositoryAvailable(this.siteEmojiResource) || !(0, _typeHelpers.isMediaEmoji)(emoji)) {
466
471
  return emoji;
467
472
  }
468
473
  return this.siteEmojiResource.loadMediaEmoji(emoji, useAlt);
@@ -473,7 +478,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
473
478
  if (!(0, _typeHelpers.isMediaEmoji)(emoji)) {
474
479
  return true;
475
480
  }
476
- if (!this.siteEmojiResource) {
481
+ if (!this.isRepositoryAvailable(this.siteEmojiResource)) {
477
482
  // Shouldn't have a media emoji without a siteEmojiResouce, but anyway ;)
478
483
  return false;
479
484
  }
@@ -487,12 +492,23 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
487
492
  }, {
488
493
  key: "filter",
489
494
  value: function filter(query, options) {
495
+ _ufoExperiences.ufoExperiences['emoji-searched'].start();
496
+ _ufoExperiences.ufoExperiences['emoji-searched'].addMetadata({
497
+ queryLength: (query === null || query === void 0 ? void 0 : query.length) || 0
498
+ });
490
499
  this.lastQuery = {
491
500
  query: query,
492
501
  options: options
493
502
  };
494
- if (this.emojiRepository) {
495
- this.notifyResult(this.emojiRepository.search(query, options));
503
+ if (this.isRepositoryAvailable(this.emojiRepository)) {
504
+ var searchResults = this.emojiRepository.search(query, options);
505
+ this.notifyResult(searchResults);
506
+ _ufoExperiences.ufoExperiences['emoji-searched'].success({
507
+ metadata: {
508
+ emojisLength: searchResults.emojis.length,
509
+ source: (options === null || options === void 0 ? void 0 : options.source) || 'typeahead'
510
+ }
511
+ });
496
512
  } else {
497
513
  // not ready
498
514
  this.notifyNotReady();
@@ -502,7 +518,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
502
518
  key: "findByShortName",
503
519
  value: function findByShortName(shortName) {
504
520
  var _this4 = this;
505
- if (this.isLoaded()) {
521
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
506
522
  // Wait for all emoji to load before looking by shortName (to ensure correct priority)
507
523
  return this.emojiRepository.findByShortName(shortName);
508
524
  }
@@ -516,7 +532,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
516
532
  var _this5 = this;
517
533
  var id = emojiId.id,
518
534
  shortName = emojiId.shortName;
519
- if (this.emojiRepository) {
535
+ if (this.isRepositoryAvailable(this.emojiRepository)) {
520
536
  if (id) {
521
537
  var emoji = this.emojiRepository.findById(id);
522
538
  if (emoji) {
@@ -525,7 +541,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
525
541
  if (this.isLoaded()) {
526
542
  // all loaded but not found by id, try server to see if
527
543
  // this is a newly uploaded emoji
528
- if (this.siteEmojiResource) {
544
+ if (this.isRepositoryAvailable(this.siteEmojiResource)) {
529
545
  return this.siteEmojiResource.findEmoji(emojiId).then(function (emoji) {
530
546
  if (!emoji) {
531
547
  // if not, fallback to searching by shortName to
@@ -554,7 +570,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
554
570
  key: "findById",
555
571
  value: function findById(id) {
556
572
  var _this6 = this;
557
- if (this.isLoaded()) {
573
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
558
574
  return this.emojiRepository.findById(id);
559
575
  }
560
576
  return this.retryIfLoading(function () {
@@ -565,7 +581,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
565
581
  key: "findInCategory",
566
582
  value: function findInCategory(categoryId) {
567
583
  var _this7 = this;
568
- if (this.isLoaded()) {
584
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
569
585
  return Promise.resolve(this.emojiRepository.findInCategory(categoryId));
570
586
  }
571
587
  return this.retryIfLoading(function () {
@@ -576,7 +592,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
576
592
  key: "getAsciiMap",
577
593
  value: function getAsciiMap() {
578
594
  var _this8 = this;
579
- if (this.isLoaded()) {
595
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
580
596
  return Promise.resolve(this.emojiRepository.getAsciiMap());
581
597
  }
582
598
  return this.retryIfLoading(function () {
@@ -587,7 +603,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
587
603
  key: "getFrequentlyUsed",
588
604
  value: function getFrequentlyUsed(options) {
589
605
  var _this9 = this;
590
- if (this.isLoaded()) {
606
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
591
607
  return Promise.resolve(this.emojiRepository.getFrequentlyUsed(options));
592
608
  }
593
609
  return this.retryIfLoading(function () {
@@ -606,7 +622,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
606
622
  key: "recordSelection",
607
623
  value: function recordSelection(emoji) {
608
624
  var recordConfig = this.recordConfig;
609
- if (this.emojiRepository) {
625
+ if (this.isRepositoryAvailable(this.emojiRepository)) {
610
626
  this.emojiRepository.used(emoji);
611
627
  }
612
628
  if (recordConfig) {
@@ -627,9 +643,9 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
627
643
  key: "deleteSiteEmoji",
628
644
  value: function deleteSiteEmoji(emoji) {
629
645
  var _this10 = this;
630
- if (this.siteEmojiResource && emoji.id) {
646
+ if (this.isRepositoryAvailable(this.siteEmojiResource) && emoji.id) {
631
647
  return this.siteEmojiResource.deleteEmoji(emoji).then(function (success) {
632
- if (success && _this10.emojiRepository) {
648
+ if (success && _this10.isRepositoryAvailable(_this10.emojiRepository)) {
633
649
  _this10.emojiRepository.delete(emoji);
634
650
  return true;
635
651
  }
@@ -669,7 +685,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
669
685
  key: "calculateDynamicCategories",
670
686
  value: function calculateDynamicCategories() {
671
687
  var _this11 = this;
672
- if (this.isLoaded()) {
688
+ if (this.isLoaded() && this.isRepositoryAvailable(this.emojiRepository)) {
673
689
  return Promise.resolve(this.emojiRepository.getDynamicCategoryList());
674
690
  }
675
691
  return this.retryIfLoading(function () {
@@ -684,7 +700,7 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
684
700
  }, {
685
701
  key: "addUnknownEmoji",
686
702
  value: function addUnknownEmoji(emoji) {
687
- if (this.emojiRepository) {
703
+ if (this.isRepositoryAvailable(this.emojiRepository)) {
688
704
  this.emojiRepository.addUnknownEmoji(emoji);
689
705
  }
690
706
  }
@@ -709,7 +725,7 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
709
725
  if (!this.allowUpload) {
710
726
  return Promise.resolve(false);
711
727
  }
712
- if (this.siteEmojiResource) {
728
+ if (this.isRepositoryAvailable(this.siteEmojiResource)) {
713
729
  return this.siteEmojiResource.hasUploadToken();
714
730
  }
715
731
  return this.retryIfLoading(function () {
@@ -722,7 +738,7 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
722
738
  var _this14 = this;
723
739
  var retry = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
724
740
  return this.isUploadSupported().then(function (supported) {
725
- if (!supported || !_this14.siteEmojiResource) {
741
+ if (!supported || !_this14.isRepositoryAvailable(_this14.siteEmojiResource)) {
726
742
  return Promise.reject('No media api support is configured');
727
743
  }
728
744
  return _this14.siteEmojiResource.uploadEmoji(upload, retry).then(function (emoji) {
@@ -736,7 +752,7 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
736
752
  key: "prepareForUpload",
737
753
  value: function prepareForUpload() {
738
754
  var _this15 = this;
739
- if (this.siteEmojiResource) {
755
+ if (this.isRepositoryAvailable(this.siteEmojiResource)) {
740
756
  this.siteEmojiResource.prepareForUpload();
741
757
  }
742
758
  return this.retryIfLoading(function () {
@@ -57,10 +57,10 @@ var TokenManager = /*#__PURE__*/function () {
57
57
  // still valid
58
58
  return Promise.resolve(mediaApiToken);
59
59
  }
60
- if (activeTokenRefresh) {
61
- // refresh token promise already active, return that
62
- return activeTokenRefresh;
63
- }
60
+ }
61
+ if (activeTokenRefresh) {
62
+ // refresh token promise already active, return that
63
+ return activeTokenRefresh;
64
64
  }
65
65
 
66
66
  // request a new token and track the promise for future requests until completed
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.default = exports.CachingMediaEmoji = exports.CachingEmoji = void 0;
9
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _typeHelpers = require("../../util/type-helpers");
@@ -21,7 +21,8 @@ var _constants = require("../../util/constants");
21
21
  var _ufoExperiences = require("../../util/analytics/ufoExperiences");
22
22
  var _useEmoji2 = require("../../hooks/useEmoji");
23
23
  var _analytics2 = require("../../util/analytics/analytics");
24
- var _excluded = ["emoji", "placeholderSize", "showTooltip", "fitToHeight", "children"];
24
+ var _excluded = ["emoji", "placeholderSize"],
25
+ _excluded2 = ["emoji", "placeholderSize", "showTooltip", "fitToHeight", "children"];
25
26
  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); }
26
27
  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; }
27
28
  /**
@@ -30,7 +31,9 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
30
31
  var CachingEmoji = function CachingEmoji(props) {
31
32
  // Optimisation to only render CachingMediaEmoji if necessary
32
33
  // slight performance hit, which accumulates for a large number of emoji.
33
- var emoji = props.emoji;
34
+ var emoji = props.emoji,
35
+ placeholderSize = props.placeholderSize,
36
+ restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
34
37
  // start emoji rendered experience, it may have already started earlier in `ResourcedEmoji`.
35
38
  (0, _analytics.useSampledUFOComponentExperience)(_analytics.ufoExperiences['emoji-rendered'].getInstance(emoji.id || emoji.shortName), _constants.SAMPLING_RATE_EMOJI_RENDERED_EXP, {
36
39
  source: 'CachingEmoji',
@@ -44,9 +47,14 @@ var CachingEmoji = function CachingEmoji(props) {
44
47
  }, []);
45
48
  var emojiNode = function emojiNode() {
46
49
  if ((0, _typeHelpers.isMediaEmoji)(emoji)) {
47
- return /*#__PURE__*/_react.default.createElement(CachingMediaEmoji, props);
50
+ return /*#__PURE__*/_react.default.createElement(CachingMediaEmoji, (0, _extends2.default)({
51
+ emoji: emoji,
52
+ placeholderSize: placeholderSize
53
+ }, restProps));
48
54
  }
49
- return /*#__PURE__*/_react.default.createElement(_Emoji.default, props);
55
+ return /*#__PURE__*/_react.default.createElement(_Emoji.default, (0, _extends2.default)({
56
+ emoji: emoji
57
+ }, restProps));
50
58
  };
51
59
  return /*#__PURE__*/_react.default.createElement(_UfoErrorBoundary.UfoErrorBoundary, {
52
60
  experiences: [_analytics.ufoExperiences['emoji-rendered'].getInstance(props.emoji.id || props.emoji.shortName)]
@@ -64,7 +72,7 @@ var CachingMediaEmoji = function CachingMediaEmoji(props) {
64
72
  showTooltip = props.showTooltip,
65
73
  fitToHeight = props.fitToHeight,
66
74
  children = props.children,
67
- restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
75
+ restProps = (0, _objectWithoutProperties2.default)(props, _excluded2);
68
76
  var shortName = emoji.shortName,
69
77
  representation = emoji.representation;
70
78
  var _useState = (0, _react.useState)(),
@@ -6,9 +6,10 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.default = exports.SpriteEmoji = exports.ImageEmoji = exports.Emoji = void 0;
9
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
13
  var _react = _interopRequireWildcard(require("react"));
13
14
  var _react2 = require("@emotion/react");
14
15
  var _EmojiUtils = require("../../api/EmojiUtils");
@@ -22,6 +23,8 @@ var _analytics = require("../../util/analytics");
22
23
  var _browserSupport = require("../../util/browser-support");
23
24
  var _useInView3 = require("../../util/useInView");
24
25
  var _ufoExperiences = require("../../util/analytics/ufoExperiences");
26
+ var _excluded = ["emoji", "fitToHeight", "selected", "selectOnHover", "className", "showTooltip", "shouldBeInteractive", "tabIndex", "onSelected", "onMouseMove", "onFocus", "onDelete", "onLoadError", "onLoadSuccess", "showDelete", "disableLazyLoad", "autoWidth"],
27
+ _excluded2 = ["emoji", "fitToHeight", "selected", "selectOnHover", "className", "showTooltip", "showDelete", "shouldBeInteractive", "tabIndex", "onSelected", "onMouseMove", "onFocus", "onDelete", "onLoadError", "onLoadSuccess", "disableLazyLoad", "autoWidth"];
25
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); }
26
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; }
27
30
  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; }
@@ -57,6 +60,13 @@ var handleMouseMove = function handleMouseMove(props, event) {
57
60
  onMouseMove((0, _typeHelpers.toEmojiId)(emoji), emoji, event);
58
61
  }
59
62
  };
63
+ var handleFocus = function handleFocus(props, event) {
64
+ var emoji = props.emoji,
65
+ onFocus = props.onFocus;
66
+ if (onFocus) {
67
+ onFocus((0, _typeHelpers.toEmojiId)(emoji), emoji, event);
68
+ }
69
+ };
60
70
  var handleDelete = function handleDelete(props, event) {
61
71
  var emoji = props.emoji,
62
72
  onDelete = props.onDelete;
@@ -88,7 +98,19 @@ var SpriteEmoji = function SpriteEmoji(props) {
88
98
  selectOnHover = props.selectOnHover,
89
99
  className = props.className,
90
100
  showTooltip = props.showTooltip,
91
- shouldBeInteractive = props.shouldBeInteractive;
101
+ _props$shouldBeIntera = props.shouldBeInteractive,
102
+ shouldBeInteractive = _props$shouldBeIntera === void 0 ? false : _props$shouldBeIntera,
103
+ tabIndex = props.tabIndex,
104
+ onSelected = props.onSelected,
105
+ onMouseMove = props.onMouseMove,
106
+ onFocus = props.onFocus,
107
+ onDelete = props.onDelete,
108
+ onLoadError = props.onLoadError,
109
+ onLoadSuccess = props.onLoadSuccess,
110
+ showDelete = props.showDelete,
111
+ disableLazyLoad = props.disableLazyLoad,
112
+ autoWidth = props.autoWidth,
113
+ other = (0, _objectWithoutProperties2.default)(props, _excluded);
92
114
  var representation = emoji.representation;
93
115
  var sprite = representation.sprite;
94
116
  var classes = "".concat(_styles.emojiNodeStyles, " ").concat(selected ? _styles.commonSelectedStyles : '', " ").concat(selectOnHover ? _styles.selectOnHoverStyles : '', " ").concat(className ? className : '');
@@ -108,11 +130,11 @@ var SpriteEmoji = function SpriteEmoji(props) {
108
130
  backgroundPosition: "".concat(xPositionInPercent, "% ").concat(yPositionInPercent, "%"),
109
131
  backgroundSize: "".concat(sprite.column * 100, "% ").concat(sprite.row * 100, "%")
110
132
  }, sizing);
111
- return (0, _react2.jsx)("span", {
133
+ return (0, _react2.jsx)("span", (0, _extends2.default)({
112
134
  "data-testid": "sprite-emoji-".concat(emoji.shortName),
113
135
  "data-emoji-type": "sprite",
114
- tabIndex: shouldBeInteractive ? 0 : undefined,
115
- role: shouldBeInteractive ? 'button' : undefined,
136
+ tabIndex: shouldBeInteractive ? tabIndex || 0 : undefined,
137
+ role: shouldBeInteractive ? 'button' : 'img',
116
138
  css: _styles.emojiContainer,
117
139
  className: classes,
118
140
  onKeyPress: function onKeyPress(event) {
@@ -124,9 +146,12 @@ var SpriteEmoji = function SpriteEmoji(props) {
124
146
  onMouseEnter: function onMouseEnter(event) {
125
147
  handleMouseMove(props, event);
126
148
  },
149
+ onFocus: function onFocus(event) {
150
+ handleFocus(props, event);
151
+ },
127
152
  "aria-label": emoji.shortName,
128
153
  title: showTooltip ? emoji.shortName : ''
129
- }, (0, _react2.jsx)("span", {
154
+ }, other), (0, _react2.jsx)("span", {
130
155
  className: _styles.emojiSprite,
131
156
  style: style
132
157
  }, "\xA0"));
@@ -142,10 +167,18 @@ var ImageEmoji = function ImageEmoji(props) {
142
167
  className = props.className,
143
168
  showTooltip = props.showTooltip,
144
169
  showDelete = props.showDelete,
145
- shouldBeInteractive = props.shouldBeInteractive,
170
+ _props$shouldBeIntera2 = props.shouldBeInteractive,
171
+ shouldBeInteractive = _props$shouldBeIntera2 === void 0 ? false : _props$shouldBeIntera2,
172
+ tabIndex = props.tabIndex,
173
+ onSelected = props.onSelected,
174
+ onMouseMove = props.onMouseMove,
175
+ onFocus = props.onFocus,
176
+ onDelete = props.onDelete,
177
+ onLoadError = props.onLoadError,
146
178
  onLoadSuccess = props.onLoadSuccess,
147
179
  disableLazyLoad = props.disableLazyLoad,
148
- autoWidth = props.autoWidth;
180
+ autoWidth = props.autoWidth,
181
+ other = (0, _objectWithoutProperties2.default)(props, _excluded2);
149
182
  var _useInView = (0, _useInView3.useInView)({
150
183
  triggerOnce: true
151
184
  }),
@@ -243,12 +276,12 @@ var ImageEmoji = function ImageEmoji(props) {
243
276
  onError: onError,
244
277
  onLoad: onLoad
245
278
  }, sizing));
246
- return (0, _react2.jsx)("span", {
279
+ return (0, _react2.jsx)("span", (0, _extends2.default)({
247
280
  "data-testid": "image-emoji-".concat(emoji.shortName),
248
281
  "data-emoji-type": "image",
249
282
  css: _styles.emojiStyles,
250
- tabIndex: shouldBeInteractive ? 0 : undefined,
251
- role: shouldBeInteractive ? 'button' : undefined,
283
+ tabIndex: shouldBeInteractive ? tabIndex || 0 : undefined,
284
+ role: shouldBeInteractive ? 'button' : 'img',
252
285
  className: classes,
253
286
  onKeyPress: function onKeyPress(event) {
254
287
  return handleKeyPress(props, event);
@@ -259,10 +292,13 @@ var ImageEmoji = function ImageEmoji(props) {
259
292
  onMouseEnter: function onMouseEnter(event) {
260
293
  handleMouseMove(props, event);
261
294
  },
295
+ onFocus: function onFocus(event) {
296
+ handleFocus(props, event);
297
+ },
262
298
  "aria-label": emoji.shortName,
263
299
  title: showTooltip ? emoji.shortName : '',
264
300
  ref: ref
265
- }, deleteButton, emojiNode);
301
+ }, other), deleteButton, emojiNode);
266
302
  };
267
303
  exports.ImageEmoji = ImageEmoji;
268
304
  var Emoji = function Emoji(props) {
@@ -12,15 +12,16 @@ var _react2 = require("@emotion/react");
12
12
  var _reactIntlNext = require("react-intl-next");
13
13
  var _EmojiDeletePreview = _interopRequireDefault(require("../common/EmojiDeletePreview"));
14
14
  var _EmojiUploadPicker = _interopRequireDefault(require("../common/EmojiUploadPicker"));
15
- var _EmojiPickerListSearch = _interopRequireDefault(require("../picker/EmojiPickerListSearch"));
15
+ var _EmojiPickerListSearch = require("../picker/EmojiPickerListSearch");
16
16
  var _ToneSelector = _interopRequireDefault(require("./ToneSelector"));
17
- var _EmojiButton = _interopRequireDefault(require("./EmojiButton"));
17
+ var _TonePreviewButton = _interopRequireDefault(require("./TonePreviewButton"));
18
18
  var _i18n = require("../i18n");
19
19
  var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
20
20
  var _add = _interopRequireDefault(require("@atlaskit/icon/glyph/add"));
21
21
  var _setSkinToneAriaLabelText = require("./setSkinToneAriaLabelText");
22
22
  var _styles = require("./styles");
23
23
  var _styles2 = require("../picker/styles");
24
+ var _constants = require("../../util/constants");
24
25
  /** @jsx jsx */
25
26
 
26
27
  var emojiActionsTestId = 'emoji-actions';
@@ -31,8 +32,7 @@ var uploadEmojiTestId = 'upload-emoji';
31
32
  exports.uploadEmojiTestId = uploadEmojiTestId;
32
33
  var AddOwnEmoji = function AddOwnEmoji(props) {
33
34
  var onOpenUpload = props.onOpenUpload,
34
- uploadEnabled = props.uploadEnabled,
35
- formatMessage = props.intl.formatMessage;
35
+ uploadEnabled = props.uploadEnabled;
36
36
  return (0, _react2.jsx)(_react.Fragment, null, uploadEnabled && (0, _react2.jsx)("div", {
37
37
  css: _styles.addCustomEmoji,
38
38
  "data-testid": uploadEmojiTestId
@@ -40,44 +40,73 @@ var AddOwnEmoji = function AddOwnEmoji(props) {
40
40
  return (0, _react2.jsx)(_standardButton.default, {
41
41
  onClick: onOpenUpload,
42
42
  iconBefore: (0, _react2.jsx)(_add.default, {
43
- label: formatMessage(_i18n.messages.addCustomEmojiLabel),
43
+ label: "",
44
44
  size: "small"
45
45
  }),
46
46
  appearance: "subtle",
47
47
  css: _styles.addCustomEmojiButton,
48
- className: _styles.emojiPickerAddEmoji
48
+ className: _styles.emojiPickerAddEmoji,
49
+ tabIndex: 0,
50
+ id: "add-custom-emoji"
49
51
  }, label);
50
52
  })));
51
53
  };
52
54
  var TonesWrapper = function TonesWrapper(props) {
53
55
  var toneEmoji = props.toneEmoji,
54
- selectedTone = props.selectedTone,
56
+ _props$selectedTone = props.selectedTone,
57
+ selectedTone = _props$selectedTone === void 0 ? _constants.DEFAULT_TONE : _props$selectedTone,
55
58
  intl = props.intl,
56
- onToneSelected = props.onToneSelected,
57
59
  onToneOpen = props.onToneOpen,
58
60
  showToneSelector = props.showToneSelector;
59
61
  var formatMessage = intl.formatMessage;
62
+ var tonePreviewButtonRef = (0, _react.useRef)(null);
63
+ var _useState = (0, _react.useState)(false),
64
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
65
+ focusTonePreviewButton = _useState2[0],
66
+ setFocusTonePreviewButton = _useState2[1];
67
+ (0, _react.useEffect)(function () {
68
+ if (focusTonePreviewButton && tonePreviewButtonRef.current) {
69
+ tonePreviewButtonRef.current.focus();
70
+ }
71
+ return function () {
72
+ setFocusTonePreviewButton(false);
73
+ };
74
+ });
75
+ var onToneCloseHandler = function onToneCloseHandler() {
76
+ var onToneClose = props.onToneClose;
77
+ onToneClose();
78
+ setFocusTonePreviewButton(true);
79
+ };
80
+ var onToneSelectedHandler = function onToneSelectedHandler(toneValue) {
81
+ var onToneSelected = props.onToneSelected;
82
+ onToneSelected(toneValue);
83
+ setFocusTonePreviewButton(true);
84
+ };
60
85
  if (!toneEmoji) {
61
86
  return null;
62
87
  }
63
- var previewEmoji = toneEmoji;
64
- if (selectedTone && previewEmoji.skinVariations) {
65
- previewEmoji = previewEmoji.skinVariations[(selectedTone || 1) - 1];
88
+ var previewToneEmoji = toneEmoji;
89
+ if (selectedTone !== _constants.DEFAULT_TONE && previewToneEmoji.skinVariations) {
90
+ previewToneEmoji = previewToneEmoji.skinVariations[selectedTone - 1];
66
91
  }
67
92
  return (0, _react2.jsx)("div", {
68
93
  css: _styles.emojiToneSelectorContainer
69
- }, showToneSelector && (0, _react2.jsx)(_ToneSelector.default, {
94
+ }, (0, _react2.jsx)(_ToneSelector.default, {
70
95
  emoji: toneEmoji,
71
- onToneSelected: onToneSelected,
72
- previewEmojiId: previewEmoji.id
73
- }), (0, _react2.jsx)(_EmojiButton.default, {
96
+ onToneSelected: onToneSelectedHandler,
97
+ onToneClose: onToneCloseHandler,
98
+ selectedTone: selectedTone,
99
+ isVisible: showToneSelector
100
+ }), (0, _react2.jsx)(_TonePreviewButton.default, {
101
+ ref: tonePreviewButtonRef,
74
102
  ariaExpanded: showToneSelector,
75
- emoji: previewEmoji,
103
+ emoji: previewToneEmoji,
76
104
  selectOnHover: true,
77
105
  onSelected: onToneOpen,
78
106
  ariaLabelText: formatMessage(_i18n.messages.emojiSelectSkinToneButtonAriaLabelText, {
79
- selectedTone: "".concat((0, _setSkinToneAriaLabelText.setSkinToneAriaLabelText)(previewEmoji.name), " selected")
80
- })
107
+ selectedTone: "".concat((0, _setSkinToneAriaLabelText.setSkinToneAriaLabelText)(previewToneEmoji.name))
108
+ }),
109
+ isVisible: !showToneSelector
81
110
  }));
82
111
  };
83
112
  var EmojiActions = function EmojiActions(props) {
@@ -93,15 +122,20 @@ var EmojiActions = function EmojiActions(props) {
93
122
  onFileChooserClicked = props.onFileChooserClicked,
94
123
  emojiToDelete = props.emojiToDelete,
95
124
  onChange = props.onChange,
96
- query = props.query;
97
- var _useState = (0, _react.useState)(false),
98
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
99
- showToneSelector = _useState2[0],
100
- setShowToneSelector = _useState2[1];
125
+ query = props.query,
126
+ _props$resultsCount = props.resultsCount,
127
+ resultsCount = _props$resultsCount === void 0 ? 0 : _props$resultsCount;
128
+ var _useState3 = (0, _react.useState)(false),
129
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
130
+ showToneSelector = _useState4[0],
131
+ setShowToneSelector = _useState4[1];
101
132
  var previewFooterClassnames = [_styles2.emojiPickerFooter, _styles2.emojiActionsContainerWithBottomShadow];
102
133
  var onToneOpenHandler = function onToneOpenHandler() {
103
134
  return setShowToneSelector(true);
104
135
  };
136
+ var onToneCloseHandler = function onToneCloseHandler() {
137
+ return setShowToneSelector(false);
138
+ };
105
139
  var onToneSelectedHandler = function onToneSelectedHandler(toneValue) {
106
140
  setShowToneSelector(false);
107
141
  if (onToneSelected) {
@@ -140,15 +174,17 @@ var EmojiActions = function EmojiActions(props) {
140
174
  onMouseLeave: onMouseLeaveHandler
141
175
  }, (0, _react2.jsx)("div", {
142
176
  css: _styles.emojiActionsWrapper
143
- }, !showToneSelector && (0, _react2.jsx)(_EmojiPickerListSearch.default, {
177
+ }, !showToneSelector && (0, _react2.jsx)(_EmojiPickerListSearch.EmojiPickerListSearch, {
144
178
  onChange: onChange,
145
- query: query
179
+ query: query,
180
+ resultsCount: resultsCount
146
181
  }), (0, _react2.jsx)(TonesWrapper, (0, _extends2.default)({}, props, {
147
182
  onToneOpen: onToneOpenHandler,
183
+ onToneClose: onToneCloseHandler,
148
184
  onToneSelected: onToneSelectedHandler,
149
185
  showToneSelector: showToneSelector
150
186
  }))), (0, _react2.jsx)(AddOwnEmoji, props));
151
187
  };
152
188
  exports.EmojiActions = EmojiActions;
153
- var _default = (0, _reactIntlNext.injectIntl)(EmojiActions);
189
+ var _default = (0, _reactIntlNext.injectIntl)( /*#__PURE__*/(0, _react.memo)(EmojiActions));
154
190
  exports.default = _default;