@atlaskit/emoji 67.1.0 → 67.2.1

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 (134) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/cjs/api/EmojiResource.js +29 -24
  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 +60 -24
  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/ResourcedEmoji.js +5 -3
  14. package/dist/cjs/components/common/ResourcedEmojiComponent.js +4 -0
  15. package/dist/cjs/components/common/RetryableButton.js +7 -3
  16. package/dist/cjs/components/common/TonePreviewButton.js +44 -0
  17. package/dist/cjs/components/common/ToneSelector.js +53 -25
  18. package/dist/cjs/components/common/styles.js +45 -16
  19. package/dist/cjs/components/i18n.js +44 -4
  20. package/dist/cjs/components/picker/CategorySelector.js +112 -90
  21. package/dist/cjs/components/picker/CategoryTracker.js +0 -28
  22. package/dist/cjs/components/picker/EmojiPickerCategoryHeading.js +2 -1
  23. package/dist/cjs/components/picker/EmojiPickerComponent.js +13 -7
  24. package/dist/cjs/components/picker/EmojiPickerEmojiRow.js +32 -4
  25. package/dist/cjs/components/picker/EmojiPickerList.js +140 -51
  26. package/dist/cjs/components/picker/EmojiPickerListSearch.js +16 -3
  27. package/dist/cjs/components/picker/EmojiPickerVirtualItems.js +5 -2
  28. package/dist/cjs/components/picker/VirtualList.js +196 -14
  29. package/dist/cjs/components/picker/styles.js +43 -51
  30. package/dist/cjs/context/EmojiPickerListContext.js +33 -0
  31. package/dist/cjs/hooks/useEmojiPickerListContext.js +12 -0
  32. package/dist/cjs/util/constants.js +40 -1
  33. package/dist/cjs/util/shared-styles.js +3 -4
  34. package/dist/cjs/version.json +1 -1
  35. package/dist/es2019/api/EmojiResource.js +29 -24
  36. package/dist/es2019/api/media/TokenManager.js +4 -4
  37. package/dist/es2019/components/common/CachingEmoji.js +10 -3
  38. package/dist/es2019/components/common/Emoji.js +44 -11
  39. package/dist/es2019/components/common/EmojiActions.js +54 -23
  40. package/dist/es2019/components/common/EmojiErrorMessage.js +7 -3
  41. package/dist/es2019/components/common/EmojiPlaceholder.js +1 -0
  42. package/dist/es2019/components/common/EmojiRadioButton.js +54 -0
  43. package/dist/es2019/components/common/EmojiUploadPicker.js +75 -36
  44. package/dist/es2019/components/common/EmojiUploadPreview.js +11 -2
  45. package/dist/es2019/components/common/FileChooser.js +1 -1
  46. package/dist/es2019/components/common/ResourcedEmoji.js +5 -3
  47. package/dist/es2019/components/common/ResourcedEmojiComponent.js +4 -0
  48. package/dist/es2019/components/common/RetryableButton.js +7 -3
  49. package/dist/es2019/components/common/TonePreviewButton.js +34 -0
  50. package/dist/es2019/components/common/ToneSelector.js +55 -21
  51. package/dist/es2019/components/common/styles.js +41 -10
  52. package/dist/es2019/components/i18n.js +44 -4
  53. package/dist/es2019/components/picker/CategorySelector.js +114 -89
  54. package/dist/es2019/components/picker/CategoryTracker.js +0 -24
  55. package/dist/es2019/components/picker/EmojiPickerCategoryHeading.js +2 -2
  56. package/dist/es2019/components/picker/EmojiPickerComponent.js +14 -7
  57. package/dist/es2019/components/picker/EmojiPickerEmojiRow.js +51 -21
  58. package/dist/es2019/components/picker/EmojiPickerList.js +102 -21
  59. package/dist/es2019/components/picker/EmojiPickerListSearch.js +14 -4
  60. package/dist/es2019/components/picker/EmojiPickerVirtualItems.js +4 -1
  61. package/dist/es2019/components/picker/VirtualList.js +193 -12
  62. package/dist/es2019/components/picker/styles.js +20 -28
  63. package/dist/es2019/context/EmojiPickerListContext.js +17 -0
  64. package/dist/es2019/hooks/useEmojiPickerListContext.js +3 -0
  65. package/dist/es2019/util/constants.js +31 -0
  66. package/dist/es2019/util/shared-styles.js +1 -2
  67. package/dist/es2019/version.json +1 -1
  68. package/dist/esm/api/EmojiResource.js +29 -24
  69. package/dist/esm/api/media/TokenManager.js +4 -4
  70. package/dist/esm/components/common/CachingEmoji.js +14 -6
  71. package/dist/esm/components/common/Emoji.js +48 -12
  72. package/dist/esm/components/common/EmojiActions.js +61 -25
  73. package/dist/esm/components/common/EmojiErrorMessage.js +7 -3
  74. package/dist/esm/components/common/EmojiPlaceholder.js +1 -0
  75. package/dist/esm/components/common/EmojiRadioButton.js +52 -0
  76. package/dist/esm/components/common/EmojiUploadPicker.js +77 -36
  77. package/dist/esm/components/common/EmojiUploadPreview.js +11 -2
  78. package/dist/esm/components/common/FileChooser.js +1 -1
  79. package/dist/esm/components/common/ResourcedEmoji.js +5 -3
  80. package/dist/esm/components/common/ResourcedEmojiComponent.js +4 -0
  81. package/dist/esm/components/common/RetryableButton.js +7 -3
  82. package/dist/esm/components/common/TonePreviewButton.js +33 -0
  83. package/dist/esm/components/common/ToneSelector.js +49 -18
  84. package/dist/esm/components/common/styles.js +40 -12
  85. package/dist/esm/components/i18n.js +44 -4
  86. package/dist/esm/components/picker/CategorySelector.js +114 -95
  87. package/dist/esm/components/picker/CategoryTracker.js +0 -28
  88. package/dist/esm/components/picker/EmojiPickerCategoryHeading.js +2 -2
  89. package/dist/esm/components/picker/EmojiPickerComponent.js +13 -7
  90. package/dist/esm/components/picker/EmojiPickerEmojiRow.js +32 -4
  91. package/dist/esm/components/picker/EmojiPickerList.js +141 -52
  92. package/dist/esm/components/picker/EmojiPickerListSearch.js +17 -4
  93. package/dist/esm/components/picker/EmojiPickerVirtualItems.js +5 -2
  94. package/dist/esm/components/picker/VirtualList.js +195 -12
  95. package/dist/esm/components/picker/styles.js +37 -45
  96. package/dist/esm/context/EmojiPickerListContext.js +21 -0
  97. package/dist/esm/hooks/useEmojiPickerListContext.js +5 -0
  98. package/dist/esm/util/constants.js +31 -0
  99. package/dist/esm/util/shared-styles.js +1 -2
  100. package/dist/esm/version.json +1 -1
  101. package/dist/types/api/EmojiResource.d.ts +2 -0
  102. package/dist/types/components/common/Emoji.d.ts +7 -1
  103. package/dist/types/components/common/EmojiActions.d.ts +3 -2
  104. package/dist/types/components/common/{EmojiButton.d.ts → EmojiRadioButton.d.ts} +3 -4
  105. package/dist/types/components/common/EmojiUploadPicker.d.ts +6 -4
  106. package/dist/types/components/common/RetryableButton.d.ts +1 -0
  107. package/dist/types/components/common/TonePreviewButton.d.ts +14 -0
  108. package/dist/types/components/common/ToneSelector.d.ts +8 -5
  109. package/dist/types/components/common/internal-types.d.ts +9 -0
  110. package/dist/types/components/common/styles.d.ts +2 -1
  111. package/dist/types/components/i18n.d.ts +40 -0
  112. package/dist/types/components/picker/CategorySelector.d.ts +3 -10
  113. package/dist/types/components/picker/CategoryTracker.d.ts +0 -2
  114. package/dist/types/components/picker/EmojiPickerCategoryHeading.d.ts +2 -1
  115. package/dist/types/components/picker/EmojiPickerEmojiRow.d.ts +5 -0
  116. package/dist/types/components/picker/EmojiPickerList.d.ts +10 -5
  117. package/dist/types/components/picker/EmojiPickerListSearch.d.ts +1 -0
  118. package/dist/types/components/picker/EmojiPickerVirtualItems.d.ts +1 -1
  119. package/dist/types/components/picker/VirtualList.d.ts +2 -0
  120. package/dist/types/components/picker/styles.d.ts +1 -1
  121. package/dist/types/context/EmojiPickerListContext.d.ts +10 -0
  122. package/dist/types/hooks/useEmojiPickerListContext.d.ts +1 -0
  123. package/dist/types/util/constants.d.ts +27 -0
  124. package/dist/types/util/shared-styles.d.ts +1 -1
  125. package/dist/types/util/type-helpers.d.ts +1 -1
  126. package/package.json +9 -6
  127. package/report.api.md +52 -1
  128. package/README.md +0 -3
  129. package/dist/es2019/components/common/EmojiButton.js +0 -49
  130. package/dist/esm/components/common/EmojiButton.js +0 -43
  131. /package/dist/cjs/{components/hooks.js → hooks/useIsMounted.js} +0 -0
  132. /package/dist/es2019/{components/hooks.js → hooks/useIsMounted.js} +0 -0
  133. /package/dist/esm/{components/hooks.js → hooks/useIsMounted.js} +0 -0
  134. /package/dist/types/{components/hooks.d.ts → hooks/useIsMounted.d.ts} +0 -0
@@ -26,7 +26,8 @@ var _EmojiPickerList = _interopRequireDefault(require("./EmojiPickerList"));
26
26
  var _analytics = require("../../util/analytics");
27
27
  var _styles = require("./styles");
28
28
  var _useEmoji2 = require("../../hooks/useEmoji");
29
- var _hooks = require("../hooks");
29
+ var _useIsMounted = require("../../hooks/useIsMounted");
30
+ var _i18n = require("../i18n");
30
31
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
31
32
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
32
33
  var FREQUENTLY_USED_MAX = 16;
@@ -37,6 +38,8 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
37
38
  createAnalyticsEvent = _ref.createAnalyticsEvent,
38
39
  _ref$size = _ref.size,
39
40
  size = _ref$size === void 0 ? _constants.defaultEmojiPickerSize : _ref$size;
41
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
42
+ formatMessage = _useIntl.formatMessage;
40
43
  var _useEmoji = (0, _useEmoji2.useEmoji)(),
41
44
  emojiProvider = _useEmoji.emojiProvider,
42
45
  isUploadSupported = _useEmoji.isUploadSupported;
@@ -105,7 +108,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
105
108
  var currentUser = (0, _react.useMemo)(function () {
106
109
  return emojiProvider.getCurrentUser();
107
110
  }, [emojiProvider]);
108
- var isMounted = (0, _hooks.useIsMounted)();
111
+ var isMounted = (0, _useIsMounted.useIsMounted)();
109
112
  var fireAnalytics = (0, _react.useCallback)(function (analyticsEvent) {
110
113
  if (createAnalyticsEvent) {
111
114
  (0, _analytics.createAndFireEventInElementsChannel)(analyticsEvent)(createAnalyticsEvent);
@@ -330,12 +333,12 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
330
333
  });
331
334
  fireAnalytics((0, _analytics.uploadBeginButton)());
332
335
  }, [emojiProvider, fireAnalytics]);
333
- var scrollToEndOfList = (0, _react.useCallback)(function () {
336
+ var scrollToUploadedEmoji = (0, _react.useCallback)(function () {
334
337
  if (emojiPickerList.current) {
335
338
  // Wait a tick to ensure repaint and updated height for picker list
336
339
  window.setTimeout(function () {
337
340
  var _emojiPickerList$curr2;
338
- (_emojiPickerList$curr2 = emojiPickerList.current) === null || _emojiPickerList$curr2 === void 0 ? void 0 : _emojiPickerList$curr2.scrollToBottom();
341
+ (_emojiPickerList$curr2 = emojiPickerList.current) === null || _emojiPickerList$curr2 === void 0 ? void 0 : _emojiPickerList$curr2.scrollToRecentlyUploaded();
339
342
  }, 0);
340
343
  }
341
344
  }, [emojiPickerList]);
@@ -352,10 +355,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
352
355
  setSelectedEmoji(emojiDescription);
353
356
  setUploading(false);
354
357
  });
355
- scrollToEndOfList();
358
+ scrollToUploadedEmoji();
356
359
  };
357
360
  (0, _UploadEmoji.uploadEmoji)(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry);
358
- }, [emojiProvider, fireAnalytics, scrollToEndOfList]);
361
+ }, [emojiProvider, fireAnalytics, scrollToUploadedEmoji]);
359
362
  var onTriggerDelete = (0, _react.useCallback)(function (_emojiId, emoji) {
360
363
  if (_emojiId) {
361
364
  fireAnalytics((0, _analytics.deleteBeginEvent)({
@@ -455,7 +458,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
455
458
  return (0, _react2.jsx)("div", {
456
459
  css: (0, _styles.emojiPicker)(showPreview, size),
457
460
  ref: onPickerRef,
458
- "data-emoji-picker-container": true
461
+ "data-emoji-picker-container": true,
462
+ role: "dialog",
463
+ "aria-label": formatMessage(_i18n.messages.emojiPickerTitle),
464
+ "aria-modal": true
459
465
  }, (0, _react2.jsx)(_CategorySelector.default, {
460
466
  activeCategoryId: activeCategory,
461
467
  dynamicCategories: dynamicCategories,
@@ -7,34 +7,62 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _react = require("react");
9
9
  var _react2 = require("@emotion/react");
10
+ var _reactIntlNext = require("react-intl-next");
10
11
  var _CachingEmoji = _interopRequireDefault(require("../common/CachingEmoji"));
11
12
  var _styles = require("./styles");
13
+ var _useEmojiPickerListContext = require("../../hooks/useEmojiPickerListContext");
14
+ var _i18n = require("../i18n");
12
15
  /** @jsx jsx */
13
16
 
14
17
  var EmojiPickerEmojiRow = function EmojiPickerEmojiRow(_ref) {
15
18
  var emojis = _ref.emojis,
16
19
  onSelected = _ref.onSelected,
17
20
  onMouseMove = _ref.onMouseMove,
21
+ onFocus = _ref.onFocus,
18
22
  title = _ref.title,
19
23
  showDelete = _ref.showDelete,
20
- onDelete = _ref.onDelete;
24
+ onDelete = _ref.onDelete,
25
+ virtualItemContext = _ref.virtualItemContext;
26
+ var _useEmojiPickerListCo = (0, _useEmojiPickerListContext.useEmojiPickerListContext)(),
27
+ currentEmojisFocus = _useEmojiPickerListCo.currentEmojisFocus,
28
+ setEmojisFocus = _useEmojiPickerListCo.setEmojisFocus;
29
+ var rowIndex = (virtualItemContext === null || virtualItemContext === void 0 ? void 0 : virtualItemContext.index) || 0;
30
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
31
+ formatMessage = _useIntl.formatMessage;
32
+ var handleFocus = function handleFocus(index) {
33
+ return function (emojiId, emoji, event) {
34
+ setEmojisFocus({
35
+ rowIndex: rowIndex,
36
+ columnIndex: index
37
+ });
38
+ onFocus && onFocus(emojiId, emoji, event);
39
+ };
40
+ };
21
41
  return (0, _react2.jsx)("div", {
22
- css: _styles.emojiPickerRow
23
- }, emojis.map(function (emoji) {
42
+ css: _styles.emojiPickerRow,
43
+ role: "presentation"
44
+ }, emojis.map(function (emoji, index) {
24
45
  var shortName = emoji.shortName,
25
46
  id = emoji.id;
26
47
  var key = id ? "".concat(id, "-").concat(title) : "".concat(shortName, "-").concat(title);
48
+ var focus = currentEmojisFocus.rowIndex === rowIndex && currentEmojisFocus.columnIndex === index;
27
49
  return (0, _react2.jsx)("span", {
28
50
  css: _styles.emojiItem,
29
- key: key
51
+ key: key,
52
+ role: "gridcell",
53
+ "aria-colindex": index + 1 // aria-colindex is 1 based
30
54
  }, (0, _react2.jsx)(_CachingEmoji.default, {
31
55
  emoji: emoji,
32
56
  selectOnHover: true,
33
57
  onSelected: onSelected,
34
58
  onMouseMove: onMouseMove,
59
+ onFocus: handleFocus(index),
35
60
  showDelete: showDelete,
36
61
  onDelete: onDelete,
37
62
  placeholderSize: 24,
63
+ "data-focus-index": "".concat(rowIndex, "-").concat(index),
64
+ tabIndex: focus ? 0 : -1,
65
+ "aria-roledescription": formatMessage(_i18n.messages.emojiButtonRoleDescription),
38
66
  shouldBeInteractive: true
39
67
  }));
40
68
  }));
@@ -6,15 +6,16 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = exports.RENDER_EMOJI_PICKER_LIST_TESTID = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
12
13
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
14
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
14
15
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
15
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
16
  var _react = require("react");
17
17
  var _react2 = require("@emotion/react");
18
+ var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
18
19
  var _constants = require("../../util/constants");
19
20
  var _categories = require("./categories");
20
21
  var _CategoryTracker = _interopRequireDefault(require("./CategoryTracker"));
@@ -24,6 +25,9 @@ var _EmojiActions = _interopRequireDefault(require("../common/EmojiActions"));
24
25
  var _styles = require("./styles");
25
26
  var _utils = require("./utils");
26
27
  var _VirtualList = require("./VirtualList");
28
+ var _reactIntlNext = require("react-intl-next");
29
+ var _i18n = require("../i18n");
30
+ var _EmojiPickerListContext = require("../../context/EmojiPickerListContext");
27
31
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
28
32
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
29
33
  /**
@@ -35,17 +39,53 @@ var categoryClassname = 'emoji-category';
35
39
  var byOrder = function byOrder(orderableA, orderableB) {
36
40
  return (orderableA.order || 0) - (orderableB.order || 0);
37
41
  };
38
- var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
39
- (0, _inherits2.default)(EmojiPickerVirtualList, _PureComponent);
40
- var _super = _createSuper(EmojiPickerVirtualList);
41
- function EmojiPickerVirtualList(_props) {
42
+
43
+ /**
44
+ * TODO: have to use class component here as unit test is relying on ref.root. Will refactor this whole file to functional component in future
45
+ * ticket: COLLAB-2317
46
+ */
47
+ var EmojiPickerTabPanelInternal = /*#__PURE__*/function (_PureComponent) {
48
+ (0, _inherits2.default)(EmojiPickerTabPanelInternal, _PureComponent);
49
+ var _super = _createSuper(EmojiPickerTabPanelInternal);
50
+ function EmojiPickerTabPanelInternal() {
51
+ (0, _classCallCheck2.default)(this, EmojiPickerTabPanelInternal);
52
+ return _super.apply(this, arguments);
53
+ }
54
+ (0, _createClass2.default)(EmojiPickerTabPanelInternal, [{
55
+ key: "render",
56
+ value: function render() {
57
+ var _this$props = this.props,
58
+ formatMessage = _this$props.intl.formatMessage,
59
+ children = _this$props.children,
60
+ showSearchResults = _this$props.showSearchResults;
61
+ return (0, _react2.jsx)("div", {
62
+ ref: "root",
63
+ css: _styles.emojiPickerList,
64
+ "data-testid": RENDER_EMOJI_PICKER_LIST_TESTID,
65
+ id: RENDER_EMOJI_PICKER_LIST_TESTID,
66
+ role: "tabpanel",
67
+ "aria-label": formatMessage(_i18n.messages.emojiPickerListPanel)
68
+ }, (0, _react2.jsx)(_visuallyHidden.default, {
69
+ id: "emoji-picker-table-description"
70
+ }, formatMessage(_i18n.messages.emojiPickerGrid, {
71
+ showSearchResults: showSearchResults
72
+ })), children);
73
+ }
74
+ }]);
75
+ return EmojiPickerTabPanelInternal;
76
+ }(_react.PureComponent);
77
+ var EmojiPickerTabPanel = (0, _reactIntlNext.injectIntl)(EmojiPickerTabPanelInternal);
78
+ var EmojiPickerVirtualListInternal = /*#__PURE__*/function (_PureComponent2) {
79
+ (0, _inherits2.default)(EmojiPickerVirtualListInternal, _PureComponent2);
80
+ var _super2 = _createSuper(EmojiPickerVirtualListInternal);
81
+ function EmojiPickerVirtualListInternal(_props) {
42
82
  var _this;
43
- (0, _classCallCheck2.default)(this, EmojiPickerVirtualList);
44
- _this = _super.call(this, _props);
83
+ (0, _classCallCheck2.default)(this, EmojiPickerVirtualListInternal);
84
+ _this = _super2.call(this, _props);
45
85
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "virtualItems", []);
46
86
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "categoryTracker", new _CategoryTracker.default());
47
87
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "listRef", /*#__PURE__*/(0, _react.createRef)());
48
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onEmojiMouseEnter", function (emojiId, emoji) {
88
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onEmojiActive", function (emojiId, emoji) {
49
89
  if (_this.props.onEmojiActive) {
50
90
  _this.props.onEmojiActive(emojiId, emoji);
51
91
  }
@@ -56,9 +96,9 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
56
96
  }
57
97
  });
58
98
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "buildVirtualItemFromGroup", function (group) {
59
- var _this$props = _this.props,
60
- onEmojiSelected = _this$props.onEmojiSelected,
61
- onEmojiDelete = _this$props.onEmojiDelete;
99
+ var _this$props2 = _this.props,
100
+ onEmojiSelected = _this$props2.onEmojiSelected,
101
+ onEmojiDelete = _this$props2.onEmojiDelete;
62
102
  var items = [];
63
103
  items.push(new _EmojiPickerVirtualItems.CategoryHeadingItem({
64
104
  id: group.category,
@@ -70,12 +110,14 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
70
110
  var rowEmojis = remainingEmojis.slice(0, _EmojiPickerSizes.sizes.emojiPerRow);
71
111
  remainingEmojis = remainingEmojis.slice(_EmojiPickerSizes.sizes.emojiPerRow);
72
112
  items.push(new _EmojiPickerVirtualItems.EmojisRowItem({
113
+ category: group.category,
73
114
  emojis: rowEmojis,
74
115
  title: group.title,
75
116
  showDelete: group.title === _constants.userCustomTitle,
76
117
  onSelected: onEmojiSelected,
77
118
  onDelete: onEmojiDelete,
78
- onMouseMove: _this.onEmojiMouseEnter
119
+ onMouseMove: _this.onEmojiActive,
120
+ onFocus: _this.onEmojiActive
79
121
  }));
80
122
  }
81
123
  return items;
@@ -93,7 +135,7 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
93
135
  var search = _categories.CategoryDescriptionMap.SEARCH;
94
136
  // Only a single "result" category
95
137
  items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(_this.buildVirtualItemFromGroup({
96
- category: 'SEARCH',
138
+ category: _constants.searchCategory,
97
139
  title: search.name,
98
140
  emojis: emojis,
99
141
  order: search.order
@@ -107,6 +149,12 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
107
149
  // by not passing it to irrelevant groups
108
150
  _this.categoryTracker.add(group.emojis[0].category, items.length);
109
151
  items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(_this.buildVirtualItemFromGroup(group)));
152
+ if (group.category === _constants.yourUploadsCategory) {
153
+ _this.lastYourUploadsRow = items.length - 1;
154
+ }
155
+ });
156
+ _this.onRowsRendered({
157
+ startIndex: 0
110
158
  });
111
159
  }
112
160
  }
@@ -130,7 +178,7 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
130
178
  _this.addToCategoryMap(categoryToGroupMap, emoji, emoji.category);
131
179
  // separate user emojis
132
180
  if (emoji.category === _constants.customCategory && currentUser && emoji.creatorUserId === currentUser.id) {
133
- _this.addToCategoryMap(categoryToGroupMap, emoji, 'USER_CUSTOM');
181
+ _this.addToCategoryMap(categoryToGroupMap, emoji, _constants.yourUploadsCategory);
134
182
  }
135
183
  return categoryToGroupMap;
136
184
  };
@@ -140,19 +188,45 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
140
188
  _this.allEmojiGroups = Object.keys(categoryToGroupMap).map(function (key) {
141
189
  return categoryToGroupMap[key];
142
190
  }).map(function (group) {
143
- if (group.category !== 'FREQUENT') {
191
+ if (group.category !== _constants.frequentCategory) {
144
192
  group.emojis.sort(byOrder);
145
193
  }
146
194
  return group;
147
195
  }).sort(byOrder);
148
196
  });
149
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "checkCategoryIdChange", function (indexes) {
197
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "findCategoryToActivate", function (row) {
198
+ var category = null;
199
+ if (row instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
200
+ category = row.props.id;
201
+ } else if (row instanceof _EmojiPickerVirtualItems.EmojisRowItem) {
202
+ category = row.props.category;
203
+ }
204
+ // your uploads is rendered, take it as upload category, so could be highlighted in category selector
205
+ if (category === _constants.yourUploadsCategory) {
206
+ return _constants.customCategory;
207
+ // search results is rendered, return null so won't be highlighted for category selector
208
+ } else if (category === _constants.searchCategory) {
209
+ return null;
210
+ }
211
+ return category;
212
+ });
213
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onRowsRendered", function (indexes) {
150
214
  var startIndex = indexes.startIndex;
215
+ var rowItem = _this.virtualItems[startIndex];
216
+ var list = _this.listRef.current;
217
+
218
+ // update tabIndex manually, startIndex is not 0 based here
219
+ if (rowItem instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
220
+ // if top of row rendered is category heading, update tabIndex for the next emoji row
221
+ list === null || list === void 0 ? void 0 : list.updateFocusIndex(startIndex + 1);
222
+ } else if (rowItem instanceof _EmojiPickerVirtualItems.EmojisRowItem) {
223
+ // if top of row rendered is emoji row, update it's tabIndex.
224
+ list === null || list === void 0 ? void 0 : list.updateFocusIndex(startIndex);
225
+ }
151
226
  if (!_this.props.query) {
152
227
  // Calculate category in view - only relevant if categories shown, i.e. no query
153
- var list = _this.listRef.current;
154
- var currentCategory = _this.categoryTracker.findNearestCategoryAbove(startIndex, list);
155
- if (currentCategory && _this.props.activeCategoryId !== currentCategory) {
228
+ var currentCategory = _this.findCategoryToActivate(rowItem);
229
+ if (currentCategory !== null && _this.props.activeCategoryId !== currentCategory) {
156
230
  if (_this.props.onCategoryActivated) {
157
231
  _this.props.onCategoryActivated(currentCategory);
158
232
  }
@@ -166,11 +240,12 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
166
240
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderRow", function (context) {
167
241
  return (0, _EmojiPickerVirtualItems.virtualItemRenderer)(_this.virtualItems, context);
168
242
  });
243
+ _this.lastYourUploadsRow = 0;
169
244
  _this.buildEmojiGroupedByCategory(_props.emojis, _props.currentUser);
170
245
  _this.buildVirtualItems(_props, _this.state);
171
246
  return _this;
172
247
  }
173
- (0, _createClass2.default)(EmojiPickerVirtualList, [{
248
+ (0, _createClass2.default)(EmojiPickerVirtualListInternal, [{
174
249
  key: "UNSAFE_componentWillUpdate",
175
250
  value: function UNSAFE_componentWillUpdate(nextProps, nextState) {
176
251
  if (this.props.emojis !== nextProps.emojis || this.props.selectedTone !== nextProps.selectedTone || this.props.loading !== nextProps.loading || this.props.query !== nextProps.query) {
@@ -207,33 +282,41 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
207
282
  var _this$listRef$current;
208
283
  (_this$listRef$current = this.listRef.current) === null || _this$listRef$current === void 0 ? void 0 : _this$listRef$current.scrollToRow(index);
209
284
  }
285
+ }, {
286
+ key: "scrollToRecentlyUploaded",
287
+ value: function scrollToRecentlyUploaded() {
288
+ var row = this.lastYourUploadsRow;
289
+ if (row > 0) {
290
+ var _this$listRef$current2;
291
+ (_this$listRef$current2 = this.listRef.current) === null || _this$listRef$current2 === void 0 ? void 0 : _this$listRef$current2.scrollToRowAndFocusLastEmoji(this.lastYourUploadsRow);
292
+ }
293
+ }
210
294
  }, {
211
295
  key: "render",
212
296
  value: function render() {
213
- var _this$props2 = this.props,
214
- query = _this$props2.query,
215
- selectedTone = _this$props2.selectedTone,
216
- onToneSelected = _this$props2.onToneSelected,
217
- onToneSelectorCancelled = _this$props2.onToneSelectorCancelled,
218
- toneEmoji = _this$props2.toneEmoji,
219
- uploading = _this$props2.uploading,
220
- uploadEnabled = _this$props2.uploadEnabled,
221
- emojiToDelete = _this$props2.emojiToDelete,
222
- initialUploadName = _this$props2.initialUploadName,
223
- uploadErrorMessage = _this$props2.uploadErrorMessage,
224
- onUploadCancelled = _this$props2.onUploadCancelled,
225
- onUploadEmoji = _this$props2.onUploadEmoji,
226
- onCloseDelete = _this$props2.onCloseDelete,
227
- onDeleteEmoji = _this$props2.onDeleteEmoji,
228
- onFileChooserClicked = _this$props2.onFileChooserClicked,
229
- onOpenUpload = _this$props2.onOpenUpload,
230
- _this$props2$size = _this$props2.size,
231
- size = _this$props2$size === void 0 ? _constants.defaultEmojiPickerSize : _this$props2$size;
297
+ var _this$props3 = this.props,
298
+ query = _this$props3.query,
299
+ selectedTone = _this$props3.selectedTone,
300
+ onToneSelected = _this$props3.onToneSelected,
301
+ onToneSelectorCancelled = _this$props3.onToneSelectorCancelled,
302
+ toneEmoji = _this$props3.toneEmoji,
303
+ uploading = _this$props3.uploading,
304
+ uploadEnabled = _this$props3.uploadEnabled,
305
+ emojiToDelete = _this$props3.emojiToDelete,
306
+ initialUploadName = _this$props3.initialUploadName,
307
+ uploadErrorMessage = _this$props3.uploadErrorMessage,
308
+ onUploadCancelled = _this$props3.onUploadCancelled,
309
+ onUploadEmoji = _this$props3.onUploadEmoji,
310
+ onCloseDelete = _this$props3.onCloseDelete,
311
+ onDeleteEmoji = _this$props3.onDeleteEmoji,
312
+ onFileChooserClicked = _this$props3.onFileChooserClicked,
313
+ onOpenUpload = _this$props3.onOpenUpload,
314
+ _this$props3$size = _this$props3.size,
315
+ size = _this$props3$size === void 0 ? _constants.defaultEmojiPickerSize : _this$props3$size,
316
+ emojis = _this$props3.emojis;
232
317
  var virtualListHeight = _EmojiPickerSizes.sizes.listHeight + (0, _utils.emojiPickerHeightOffset)(size);
233
- return (0, _react2.jsx)("div", {
234
- ref: "root",
235
- css: _styles.emojiPickerList,
236
- "data-testid": RENDER_EMOJI_PICKER_LIST_TESTID
318
+ return (0, _react2.jsx)(EmojiPickerTabPanel, {
319
+ showSearchResults: !!query
237
320
  }, (0, _react2.jsx)(_EmojiActions.default, {
238
321
  selectedTone: selectedTone,
239
322
  onToneSelected: onToneSelected,
@@ -251,8 +334,14 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
251
334
  onFileChooserClicked: onFileChooserClicked,
252
335
  onOpenUpload: onOpenUpload,
253
336
  query: query,
254
- onChange: this.onSearch
255
- }), (0, _react2.jsx)(_VirtualList.VirtualList, {
337
+ onChange: this.onSearch,
338
+ resultsCount: emojis.length
339
+ }), (0, _react2.jsx)(_EmojiPickerListContext.EmojiPickerListContextProvider, {
340
+ initialEmojisFocus: {
341
+ rowIndex: 1,
342
+ columnIndex: 0
343
+ }
344
+ }, (0, _react2.jsx)(_VirtualList.VirtualList, {
256
345
  ref: this.listRef,
257
346
  height: virtualListHeight,
258
347
  overscanRowCount: 10,
@@ -261,14 +350,14 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
261
350
  rowRenderer: this.renderRow,
262
351
  scrollToAlignment: "start",
263
352
  width: _EmojiPickerSizes.sizes.listWidth,
264
- onRowsRendered: this.checkCategoryIdChange
265
- }));
353
+ onRowsRendered: this.onRowsRendered
354
+ })));
266
355
  }
267
356
  }]);
268
- return EmojiPickerVirtualList;
357
+ return EmojiPickerVirtualListInternal;
269
358
  }(_react.PureComponent);
270
- exports.default = EmojiPickerVirtualList;
271
- (0, _defineProperty2.default)(EmojiPickerVirtualList, "defaultProps", {
359
+ exports.default = EmojiPickerVirtualListInternal;
360
+ (0, _defineProperty2.default)(EmojiPickerVirtualListInternal, "defaultProps", {
272
361
  onEmojiSelected: function onEmojiSelected() {},
273
362
  onEmojiActive: function onEmojiActive() {},
274
363
  onEmojiDelete: function onEmojiDelete() {},
@@ -11,6 +11,7 @@ var _react = _interopRequireWildcard(require("react"));
11
11
  var _react2 = require("@emotion/react");
12
12
  var _textfield = _interopRequireDefault(require("@atlaskit/textfield"));
13
13
  var _search = _interopRequireDefault(require("@atlaskit/icon/glyph/search"));
14
+ var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
14
15
  var _reactIntlNext = require("react-intl-next");
15
16
  var _i18n = require("../i18n");
16
17
  var _styles = require("./styles");
@@ -25,14 +26,20 @@ exports.emojiPickerSearchTestId = emojiPickerSearchTestId;
25
26
  var EmojiPickerListSearch = function EmojiPickerListSearch(props) {
26
27
  var style = props.style,
27
28
  query = props.query,
29
+ resultsCount = props.resultsCount,
28
30
  onChange = props.onChange;
29
31
  var textRef = (0, _react.useRef)(null);
32
+ var _useState = (0, _react.useState)(false),
33
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
34
+ dirty = _useState2[0],
35
+ setDirty = _useState2[1];
30
36
  var _useIntl = (0, _reactIntlNext.useIntl)(),
31
37
  formatMessage = _useIntl.formatMessage;
32
38
 
33
39
  // Debounce callback
34
40
  var _useDebouncedCallback = (0, _useDebounce.useDebouncedCallback)(function (value) {
35
41
  onChange(value);
42
+ setDirty(true);
36
43
  },
37
44
  // delay in ms
38
45
  _constants.EMOJI_SEARCH_DEBOUNCE),
@@ -52,7 +59,13 @@ var EmojiPickerListSearch = function EmojiPickerListSearch(props) {
52
59
  return (0, _react2.jsx)("div", {
53
60
  css: _styles.pickerSearch,
54
61
  style: style
55
- }, (0, _react2.jsx)(_textfield.default, {
62
+ }, (0, _react2.jsx)(_visuallyHidden.default, {
63
+ id: "emoji-search-results-status",
64
+ role: "status"
65
+ }, dirty && query === '' && formatMessage(_i18n.messages.searchResultsStatusSeeAll), query !== '' && formatMessage(_i18n.messages.searchResultsStatus, {
66
+ count: resultsCount
67
+ })), (0, _react2.jsx)(_textfield.default, {
68
+ role: "searchbox",
56
69
  "aria-label": formatMessage(_i18n.messages.searchLabel),
57
70
  css: _styles.input,
58
71
  autoComplete: "off",
@@ -60,14 +73,14 @@ var EmojiPickerListSearch = function EmojiPickerListSearch(props) {
60
73
  placeholder: "".concat(formatMessage(_i18n.messages.searchPlaceholder), "..."),
61
74
  defaultValue: query || '',
62
75
  onChange: handleOnChange,
63
- isCompact: true,
64
76
  elemBeforeInput: (0, _react2.jsx)("span", {
65
77
  css: _styles.searchIcon
66
78
  }, (0, _react2.jsx)(_search.default, {
67
79
  label: ""
68
80
  })),
69
81
  testId: emojiPickerSearchTestId,
70
- ref: textRef
82
+ ref: textRef,
83
+ isCompact: true
71
84
  }));
72
85
  };
73
86
  exports.EmojiPickerListSearch = EmojiPickerListSearch;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.virtualItemRenderer = exports.LoadingItem = exports.EmojisRowItem = exports.CategoryHeadingItem = exports.AbstractItem = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
8
9
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
9
10
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
10
11
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
@@ -33,8 +34,10 @@ var EmojisRowItem = /*#__PURE__*/function (_AbstractItem) {
33
34
  var _this;
34
35
  (0, _classCallCheck2.default)(this, EmojisRowItem);
35
36
  _this = _super.call(this, props, _EmojiPickerSizes.sizes.emojiRowHeight);
36
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderItem", function () {
37
- return (0, _react.jsx)(_EmojiPickerEmojiRow.default, _this.props);
37
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderItem", function (context) {
38
+ return (0, _react.jsx)(_EmojiPickerEmojiRow.default, (0, _extends2.default)({}, _this.props, {
39
+ virtualItemContext: context
40
+ }));
38
41
  });
39
42
  return _this;
40
43
  }