@atlaskit/emoji 67.8.8 → 67.8.9

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 (36) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/components/common/EmojiDeletePreview.js +18 -4
  3. package/dist/cjs/components/common/LoadingEmojiComponent.js +13 -1
  4. package/dist/cjs/components/picker/EmojiPickerComponent.js +32 -3
  5. package/dist/cjs/components/picker/EmojiPickerList.js +345 -10
  6. package/dist/cjs/components/picker/utils.js +7 -1
  7. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +28 -8
  8. package/dist/cjs/components/typeahead/EmojiTypeAheadList.js +40 -16
  9. package/dist/cjs/util/analytics/analytics.js +1 -1
  10. package/dist/es2019/components/common/EmojiDeletePreview.js +16 -4
  11. package/dist/es2019/components/common/LoadingEmojiComponent.js +11 -1
  12. package/dist/es2019/components/picker/EmojiPickerComponent.js +32 -3
  13. package/dist/es2019/components/picker/EmojiPickerList.js +312 -4
  14. package/dist/es2019/components/picker/utils.js +6 -0
  15. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +26 -8
  16. package/dist/es2019/components/typeahead/EmojiTypeAheadList.js +43 -20
  17. package/dist/es2019/util/analytics/analytics.js +1 -1
  18. package/dist/esm/components/common/EmojiDeletePreview.js +18 -4
  19. package/dist/esm/components/common/LoadingEmojiComponent.js +13 -1
  20. package/dist/esm/components/picker/EmojiPickerComponent.js +32 -3
  21. package/dist/esm/components/picker/EmojiPickerList.js +342 -11
  22. package/dist/esm/components/picker/utils.js +6 -0
  23. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +28 -8
  24. package/dist/esm/components/typeahead/EmojiTypeAheadList.js +40 -16
  25. package/dist/esm/util/analytics/analytics.js +1 -1
  26. package/dist/types/components/common/LoadingEmojiComponent.d.ts +1 -0
  27. package/dist/types/components/picker/EmojiPickerList.d.ts +10 -2
  28. package/dist/types/components/picker/utils.d.ts +1 -0
  29. package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +1 -0
  30. package/dist/types/components/typeahead/EmojiTypeAheadList.d.ts +1 -1
  31. package/dist/types-ts4.5/components/common/LoadingEmojiComponent.d.ts +1 -0
  32. package/dist/types-ts4.5/components/picker/EmojiPickerList.d.ts +10 -2
  33. package/dist/types-ts4.5/components/picker/utils.d.ts +1 -0
  34. package/dist/types-ts4.5/components/typeahead/EmojiTypeAheadComponent.d.ts +1 -0
  35. package/dist/types-ts4.5/components/typeahead/EmojiTypeAheadList.d.ts +1 -1
  36. package/package.json +6 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 67.8.9
4
+
5
+ ### Patch Changes
6
+
7
+ - [#154815](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/154815)
8
+ [`64d0333dd6b4b`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/64d0333dd6b4b) -
9
+ ED-24131 Refactors internal EmojiPickerList to a functional component and remediates usages of
10
+ UNSAFE lifecycle methods in elements/emoji
11
+
3
12
  ## 67.8.8
4
13
 
5
14
  ### Patch Changes
@@ -25,6 +25,7 @@ var _EmojiErrorMessage = _interopRequireWildcard(require("./EmojiErrorMessage"))
25
25
  var _RetryableButton = _interopRequireDefault(require("./RetryableButton"));
26
26
  var _styles = require("./styles");
27
27
  var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
28
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
28
29
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
29
30
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
30
31
  function _createSuper(t) { var r = _isNativeReflectConstruct(); return function () { var e, o = (0, _getPrototypeOf2.default)(t); if (r) { var s = (0, _getPrototypeOf2.default)(this).constructor; e = Reflect.construct(o, arguments, s); } else e = o.apply(this, arguments); return (0, _possibleConstructorReturn2.default)(this, e); }; }
@@ -74,10 +75,23 @@ var EmojiDeletePreview = /*#__PURE__*/function (_Component) {
74
75
  (0, _createClass2.default)(EmojiDeletePreview, [{
75
76
  key: "UNSAFE_componentWillUpdate",
76
77
  value: function UNSAFE_componentWillUpdate(nextProps) {
77
- if (nextProps.emoji.id !== this.props.emoji.id) {
78
- this.setState({
79
- error: false
80
- });
78
+ if (!(0, _platformFeatureFlags.fg)('platform_editor_react18_elements_emoji')) {
79
+ if (nextProps.emoji.id !== this.props.emoji.id) {
80
+ this.setState({
81
+ error: false
82
+ });
83
+ }
84
+ }
85
+ }
86
+ }, {
87
+ key: "componentDidUpdate",
88
+ value: function componentDidUpdate(prevProps) {
89
+ if ((0, _platformFeatureFlags.fg)('platform_editor_react18_elements_emoji')) {
90
+ if (prevProps.emoji.id !== this.props.emoji.id) {
91
+ this.setState({
92
+ error: false
93
+ });
94
+ }
81
95
  }
82
96
  }
83
97
  }, {
@@ -13,6 +13,7 @@ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime
13
13
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
14
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
15
  var _react = require("react");
16
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
17
  function _createSuper(t) { var r = _isNativeReflectConstruct(); return function () { var e, o = (0, _getPrototypeOf2.default)(t); if (r) { var s = (0, _getPrototypeOf2.default)(this).constructor; e = Reflect.construct(o, arguments, s); } else e = o.apply(this, arguments); return (0, _possibleConstructorReturn2.default)(this, e); }; }
17
18
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
18
19
  /**
@@ -52,7 +53,18 @@ var LoadingEmojiComponent = exports.default = /*#__PURE__*/function (_Component)
52
53
  }, {
53
54
  key: "UNSAFE_componentWillReceiveProps",
54
55
  value: function UNSAFE_componentWillReceiveProps(nextProps) {
55
- this.loadEmojiProvider(nextProps.emojiProvider);
56
+ if (!(0, _platformFeatureFlags.fg)('platform_editor_react18_elements_emoji')) {
57
+ this.loadEmojiProvider(nextProps.emojiProvider);
58
+ }
59
+ }
60
+ }, {
61
+ key: "componentDidUpdate",
62
+ value: function componentDidUpdate(prevProps) {
63
+ if ((0, _platformFeatureFlags.fg)('platform_editor_react18_elements_emoji')) {
64
+ if (this.props !== prevProps) {
65
+ this.loadEmojiProvider(this.props.emojiProvider);
66
+ }
67
+ }
56
68
  }
57
69
  }, {
58
70
  key: "componentWillUnmount",
@@ -22,12 +22,13 @@ var _UploadEmoji = require("../common/UploadEmoji");
22
22
  var _RecordSelectionDefault = require("../common/RecordSelectionDefault");
23
23
  var _CategorySelector = _interopRequireDefault(require("./CategorySelector"));
24
24
  var _EmojiPickerFooter = _interopRequireDefault(require("./EmojiPickerFooter"));
25
- var _EmojiPickerList = _interopRequireDefault(require("./EmojiPickerList"));
25
+ var _EmojiPickerList = require("./EmojiPickerList");
26
26
  var _analytics = require("../../util/analytics");
27
27
  var _styles = require("./styles");
28
28
  var _useEmoji2 = require("../../hooks/useEmoji");
29
29
  var _useIsMounted = require("../../hooks/useIsMounted");
30
30
  var _i18n = require("../i18n");
31
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
31
32
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
32
33
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /**
33
34
  * @jsxRuntime classic
@@ -103,7 +104,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
103
104
  toneEmoji = _useState28[0],
104
105
  setToneEmoji = _useState28[1];
105
106
  var emojiPickerList = (0, _react.useMemo)(function () {
106
- return /*#__PURE__*/(0, _react.createRef)();
107
+ return (0, _platformFeatureFlags.fg)('platform_editor_react18_elements_emoji') ? /*#__PURE__*/(0, _react.createRef)() : /*#__PURE__*/(0, _react.createRef)();
107
108
  }, []);
108
109
  var openTime = (0, _react.useRef)(0);
109
110
  var isMounting = (0, _react.useRef)(true);
@@ -486,7 +487,35 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
486
487
  dynamicCategories: dynamicCategories,
487
488
  disableCategories: disableCategories,
488
489
  onCategorySelected: onCategorySelected
489
- }), (0, _react2.jsx)(_EmojiPickerList.default, {
490
+ }), (0, _platformFeatureFlags.fg)('platform_editor_react18_elements_emoji') ? (0, _react2.jsx)(_EmojiPickerList.EmojiPickerVirtualListInternalNew, {
491
+ emojis: filteredEmojis,
492
+ currentUser: currentUser,
493
+ onEmojiSelected: recordUsageOnSelection,
494
+ onEmojiActive: onEmojiActive,
495
+ onEmojiDelete: onTriggerDelete,
496
+ onCategoryActivated: onCategoryActivated,
497
+ onSearch: onSearch,
498
+ query: query,
499
+ selectedTone: selectedTone,
500
+ loading: loading,
501
+ ref: emojiPickerList,
502
+ initialUploadName: query,
503
+ onToneSelected: onToneSelected,
504
+ onToneSelectorCancelled: onToneSelectorCancelled,
505
+ toneEmoji: toneEmoji,
506
+ uploading: uploading,
507
+ emojiToDelete: emojiToDelete,
508
+ uploadErrorMessage: formattedErrorMessage,
509
+ uploadEnabled: isUploadSupported && !uploading,
510
+ onUploadEmoji: onUploadEmoji,
511
+ onUploadCancelled: onUploadCancelled,
512
+ onDeleteEmoji: onDeleteEmoji,
513
+ onCloseDelete: onCloseDelete,
514
+ onFileChooserClicked: onFileChooserClicked,
515
+ onOpenUpload: onOpenUpload,
516
+ size: size,
517
+ activeCategoryId: activeCategory
518
+ }) : (0, _react2.jsx)(_EmojiPickerList.EmojiPickerVirtualListInternalOld, {
490
519
  emojis: filteredEmojis,
491
520
  currentUser: currentUser,
492
521
  onEmojiSelected: recordUsageOnSelection,
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
- exports.default = exports.RENDER_EMOJI_PICKER_LIST_TESTID = void 0;
8
+ exports.RENDER_EMOJI_PICKER_LIST_TESTID = exports.EmojiPickerVirtualListInternalOld = exports.EmojiPickerVirtualListInternalNew = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
8
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
11
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
10
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
@@ -13,7 +15,7 @@ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
13
15
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
16
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
15
17
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
16
- var _react = require("react");
18
+ var _react = _interopRequireWildcard(require("react"));
17
19
  var _react2 = require("@emotion/react");
18
20
  var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
19
21
  var _constants = require("../../util/constants");
@@ -28,6 +30,8 @@ var _VirtualList = require("./VirtualList");
28
30
  var _reactIntlNext = require("react-intl-next");
29
31
  var _i18n = require("../i18n");
30
32
  var _EmojiPickerListContext = require("../../context/EmojiPickerListContext");
33
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
34
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
31
35
  function _createSuper(t) { var r = _isNativeReflectConstruct(); return function () { var e, o = (0, _getPrototypeOf2.default)(t); if (r) { var s = (0, _getPrototypeOf2.default)(this).constructor; e = Reflect.construct(o, arguments, s); } else e = o.apply(this, arguments); return (0, _possibleConstructorReturn2.default)(this, e); }; }
32
36
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /**
33
37
  * @jsxRuntime classic
@@ -84,12 +88,12 @@ var EmojiPickerTabPanelInternal = /*#__PURE__*/function (_PureComponent) {
84
88
  return EmojiPickerTabPanelInternal;
85
89
  }(_react.PureComponent);
86
90
  var EmojiPickerTabPanel = (0, _reactIntlNext.injectIntl)(EmojiPickerTabPanelInternal);
87
- var EmojiPickerVirtualListInternal = exports.default = /*#__PURE__*/function (_PureComponent2) {
88
- (0, _inherits2.default)(EmojiPickerVirtualListInternal, _PureComponent2);
89
- var _super2 = _createSuper(EmojiPickerVirtualListInternal);
90
- function EmojiPickerVirtualListInternal(_props) {
91
+ var EmojiPickerVirtualListInternalOld = exports.EmojiPickerVirtualListInternalOld = /*#__PURE__*/function (_PureComponent2) {
92
+ (0, _inherits2.default)(EmojiPickerVirtualListInternalOld, _PureComponent2);
93
+ var _super2 = _createSuper(EmojiPickerVirtualListInternalOld);
94
+ function EmojiPickerVirtualListInternalOld(_props) {
91
95
  var _this;
92
- (0, _classCallCheck2.default)(this, EmojiPickerVirtualListInternal);
96
+ (0, _classCallCheck2.default)(this, EmojiPickerVirtualListInternalOld);
93
97
  _this = _super2.call(this, _props);
94
98
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "virtualItems", []);
95
99
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "categoryTracker", new _CategoryTracker.default());
@@ -295,7 +299,7 @@ var EmojiPickerVirtualListInternal = exports.default = /*#__PURE__*/function (_P
295
299
  _this.buildVirtualItems(_props, _this.state);
296
300
  return _this;
297
301
  }
298
- (0, _createClass2.default)(EmojiPickerVirtualListInternal, [{
302
+ (0, _createClass2.default)(EmojiPickerVirtualListInternalOld, [{
299
303
  key: "UNSAFE_componentWillUpdate",
300
304
  value: function UNSAFE_componentWillUpdate(nextProps, nextState) {
301
305
  if (this.props.emojis !== nextProps.emojis || this.props.selectedTone !== nextProps.selectedTone || this.props.loading !== nextProps.loading || this.props.query !== nextProps.query) {
@@ -415,13 +419,344 @@ var EmojiPickerVirtualListInternal = exports.default = /*#__PURE__*/function (_P
415
419
  })));
416
420
  }
417
421
  }]);
418
- return EmojiPickerVirtualListInternal;
422
+ return EmojiPickerVirtualListInternalOld;
419
423
  }(_react.PureComponent);
420
- (0, _defineProperty2.default)(EmojiPickerVirtualListInternal, "defaultProps", {
424
+ (0, _defineProperty2.default)(EmojiPickerVirtualListInternalOld, "defaultProps", {
421
425
  onEmojiSelected: function onEmojiSelected() {},
422
426
  onEmojiActive: function onEmojiActive() {},
423
427
  onEmojiDelete: function onEmojiDelete() {},
424
428
  onCategoryActivated: function onCategoryActivated() {},
425
429
  onSearch: function onSearch() {},
426
430
  size: _constants.defaultEmojiPickerSize
431
+ });
432
+ var EmojiPickerVirtualListInternalNew = exports.EmojiPickerVirtualListInternalNew = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
433
+ var emojis = props.emojis,
434
+ currentUser = props.currentUser,
435
+ _props$onEmojiSelecte = props.onEmojiSelected,
436
+ onEmojiSelected = _props$onEmojiSelecte === void 0 ? function () {} : _props$onEmojiSelecte,
437
+ _props$onEmojiActive = props.onEmojiActive,
438
+ onEmojiActive = _props$onEmojiActive === void 0 ? function () {} : _props$onEmojiActive,
439
+ _props$onEmojiDelete = props.onEmojiDelete,
440
+ onEmojiDelete = _props$onEmojiDelete === void 0 ? function () {} : _props$onEmojiDelete,
441
+ _props$onCategoryActi = props.onCategoryActivated,
442
+ onCategoryActivated = _props$onCategoryActi === void 0 ? function () {} : _props$onCategoryActi,
443
+ _props$onSearch = props.onSearch,
444
+ onSearch = _props$onSearch === void 0 ? function () {} : _props$onSearch,
445
+ _props$size = props.size,
446
+ size = _props$size === void 0 ? _constants.defaultEmojiPickerSize : _props$size,
447
+ query = props.query,
448
+ loading = props.loading,
449
+ selectedTone = props.selectedTone,
450
+ onToneSelected = props.onToneSelected,
451
+ onToneSelectorCancelled = props.onToneSelectorCancelled,
452
+ toneEmoji = props.toneEmoji,
453
+ uploading = props.uploading,
454
+ uploadEnabled = props.uploadEnabled,
455
+ emojiToDelete = props.emojiToDelete,
456
+ initialUploadName = props.initialUploadName,
457
+ uploadErrorMessage = props.uploadErrorMessage,
458
+ onUploadCancelled = props.onUploadCancelled,
459
+ onUploadEmoji = props.onUploadEmoji,
460
+ onDeleteEmoji = props.onDeleteEmoji,
461
+ onCloseDelete = props.onCloseDelete,
462
+ onFileChooserClicked = props.onFileChooserClicked,
463
+ onOpenUpload = props.onOpenUpload,
464
+ activeCategoryId = props.activeCategoryId;
465
+ var listRef = (0, _react.useRef)(null);
466
+ var _useState = (0, _react.useState)([]),
467
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
468
+ allEmojiGroups = _useState2[0],
469
+ setAllEmojiGroups = _useState2[1];
470
+ var _useState3 = (0, _react.useState)([]),
471
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
472
+ virtualItems = _useState4[0],
473
+ setVirtualItems = _useState4[1];
474
+ var _useState5 = (0, _react.useState)(0),
475
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
476
+ lastYourUploadsRow = _useState6[0],
477
+ setLastYourUploadsRow = _useState6[1];
478
+ var categoryTracker = (0, _react.useMemo)(function () {
479
+ return new _CategoryTracker.default();
480
+ }, []);
481
+ var _useState7 = (0, _react.useState)(false),
482
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
483
+ categoriesChanged = _useState8[0],
484
+ setCategoriesChanged = _useState8[1];
485
+ var groupByCategory = (0, _react.useCallback)(function (currentUser) {
486
+ return function (categoryToGroupMap, emoji) {
487
+ addToCategoryMap(categoryToGroupMap, emoji, emoji.category);
488
+ // separate user emojis
489
+ if (emoji.category === _constants.customCategory && currentUser && emoji.creatorUserId === currentUser.id) {
490
+ addToCategoryMap(categoryToGroupMap, emoji, _constants.yourUploadsCategory);
491
+ }
492
+ return categoryToGroupMap;
493
+ };
494
+ }, []);
495
+
496
+ /**
497
+ * onRowsRendered callback function
498
+ *
499
+ * Check the category of top of rendered row and inform category selector to change active category
500
+ * Rove index of emoji picker list
501
+ */
502
+ var onRowsRendered = (0, _react.useCallback)(function (indexes) {
503
+ var startIndex = indexes.startIndex;
504
+ var rowItem = virtualItems[startIndex];
505
+ var list = listRef.current;
506
+
507
+ // update tabIndex manually, startIndex is not 0 based here
508
+ if (rowItem instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
509
+ // if top of row rendered is category heading, update tabIndex for the next emoji row
510
+ list === null || list === void 0 || list.updateFocusIndex(startIndex + 1);
511
+ } else if (rowItem instanceof _EmojiPickerVirtualItems.EmojisRowItem) {
512
+ // if top of row rendered is emoji row, update it's tabIndex.
513
+ list === null || list === void 0 || list.updateFocusIndex(startIndex);
514
+ }
515
+ if (!query) {
516
+ // Calculate category in view - only relevant if categories shown, i.e. no query
517
+ var currentCategory = findCategoryToActivate(rowItem);
518
+ if (currentCategory !== null && activeCategoryId !== currentCategory) {
519
+ if (onCategoryActivated) {
520
+ onCategoryActivated(currentCategory);
521
+ }
522
+ }
523
+ }
524
+ }, [virtualItems, query, activeCategoryId, onCategoryActivated]);
525
+ var buildEmojiGroupedByCategory = (0, _react.useCallback)(function (emojis, currentUser) {
526
+ var categoryToGroupMap = emojis.reduce(groupByCategory(currentUser), {});
527
+ setAllEmojiGroups(Object.keys(categoryToGroupMap).map(function (key) {
528
+ return categoryToGroupMap[key];
529
+ }).map(function (group) {
530
+ if (group.category !== _constants.frequentCategory) {
531
+ group.emojis.sort(byOrder);
532
+ }
533
+ return group;
534
+ }).sort(byOrder));
535
+ }, [groupByCategory]);
536
+ var addToCategoryMap = function addToCategoryMap(categoryToGroupMap, emoji, category) {
537
+ if (!categoryToGroupMap[category]) {
538
+ var categoryDefinition = _categories.CategoryDescriptionMap[category];
539
+ categoryToGroupMap[category] = {
540
+ emojis: [],
541
+ title: categoryDefinition.name,
542
+ category: category,
543
+ order: categoryDefinition.order
544
+ };
545
+ }
546
+ categoryToGroupMap[category].emojis.push(emoji);
547
+ return categoryToGroupMap;
548
+ };
549
+ var buildVirtualItemFromGroup = (0, _react.useCallback)(function (group) {
550
+ var items = [];
551
+ items.push(new _EmojiPickerVirtualItems.CategoryHeadingItem({
552
+ id: group.category,
553
+ title: group.title,
554
+ className: categoryClassname
555
+ }));
556
+ var remainingEmojis = group.emojis;
557
+ while (remainingEmojis.length > 0) {
558
+ var rowEmojis = remainingEmojis.slice(0, _EmojiPickerSizes.sizes.emojiPerRow);
559
+ remainingEmojis = remainingEmojis.slice(_EmojiPickerSizes.sizes.emojiPerRow);
560
+ items.push(new _EmojiPickerVirtualItems.EmojisRowItem({
561
+ category: group.category,
562
+ emojis: rowEmojis,
563
+ title: group.title,
564
+ showDelete: group.title === _constants.userCustomTitle,
565
+ onSelected: onEmojiSelected,
566
+ onDelete: onEmojiDelete,
567
+ onMouseMove: onEmojiActive,
568
+ onFocus: onEmojiActive
569
+ }));
570
+ }
571
+ return items;
572
+ }, [onEmojiSelected, onEmojiDelete, onEmojiActive]);
573
+ var buildVirtualItems = (0, _react.useCallback)(function () {
574
+ var items = [];
575
+ var prevFirstCategory = categoryTracker.getFirstCategory();
576
+ categoryTracker.reset();
577
+ if (loading) {
578
+ items.push(new _EmojiPickerVirtualItems.LoadingItem());
579
+ } else {
580
+ if (query) {
581
+ var search = _categories.CategoryDescriptionMap.SEARCH;
582
+ // Only a single "result" category
583
+ items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(buildVirtualItemFromGroup({
584
+ category: _constants.searchCategory,
585
+ title: search.name,
586
+ emojis: emojis,
587
+ order: search.order
588
+ })));
589
+ } else {
590
+ // Group by category
591
+
592
+ // Not searching show in categories.
593
+ allEmojiGroups.forEach(function (group) {
594
+ // Optimisation - avoid re-rendering unaffected groups for the current selectedShortcut
595
+ // by not passing it to irrelevant groups
596
+ categoryTracker.add(group.emojis[0].category, items.length);
597
+ items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(buildVirtualItemFromGroup(group)));
598
+ if (group.category === _constants.yourUploadsCategory) {
599
+ setLastYourUploadsRow(items.length - 1);
600
+ }
601
+ });
602
+ }
603
+ }
604
+
605
+ // make sure virtualItems is up-to-date before calling onRowsRendered
606
+ setVirtualItems(items);
607
+ if (!loading && !query) {
608
+ if (categoryTracker.getFirstCategory() !== prevFirstCategory) {
609
+ setCategoriesChanged(true);
610
+ }
611
+ }
612
+ // eslint-disable-next-line react-hooks/exhaustive-deps
613
+ }, [allEmojiGroups, loading, query, emojis]);
614
+ var findCategoryToActivate = function findCategoryToActivate(row) {
615
+ var category = null;
616
+ if (row instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
617
+ category = row.props.id;
618
+ } else if (row instanceof _EmojiPickerVirtualItems.EmojisRowItem) {
619
+ category = row.props.category;
620
+ }
621
+ // your uploads is rendered, take it as upload category, so could be highlighted in category selector
622
+ if (category === _constants.yourUploadsCategory) {
623
+ return _constants.customCategory;
624
+ // search results is rendered, return null so won't be highlighted for category selector
625
+ } else if (category === _constants.searchCategory) {
626
+ return null;
627
+ }
628
+ return category;
629
+ };
630
+ var rowSize = function rowSize(index) {
631
+ var _virtualItems$index;
632
+ return ((_virtualItems$index = virtualItems[index]) === null || _virtualItems$index === void 0 ? void 0 : _virtualItems$index.height) || _EmojiPickerSizes.sizes.categoryHeadingHeight;
633
+ };
634
+ var renderRow = function renderRow(context) {
635
+ return (0, _EmojiPickerVirtualItems.virtualItemRenderer)(virtualItems, context);
636
+ };
637
+
638
+ /**
639
+ * After deleting emoji, we'll update the focus index to the first emoji of last row of your uploads, so when user navigate back focus will still work
640
+ * if last emoji in your uploads is deleted, the updated focus index will be outdated, as there will be no your uploads section
641
+ * however, it'll trigger onChange from VirtualList, which will update focus index automatically for us
642
+ */
643
+ var handleOnCloseDelete = function handleOnCloseDelete() {
644
+ var list = listRef.current;
645
+ list === null || list === void 0 || list.updateFocusIndex(lastYourUploadsRow);
646
+ onCloseDelete();
647
+ };
648
+ var findEmojiRowAndColumnById = function findEmojiRowAndColumnById(emojiId) {
649
+ var columnIndex = -1;
650
+ // for most of cases, it'd be in first emoji row, so should be quite fast to find in real world
651
+ var rowIndex = virtualItems.findIndex(function (rowItem) {
652
+ if (rowItem instanceof _EmojiPickerVirtualItems.EmojisRowItem) {
653
+ // find uploaded emoji in each emoji row
654
+ columnIndex = rowItem.props.emojis.findIndex(function (emoji) {
655
+ return emoji.id === emojiId;
656
+ });
657
+ return columnIndex !== -1;
658
+ }
659
+ return false;
660
+ });
661
+ return {
662
+ rowIndex: rowIndex,
663
+ columnIndex: columnIndex
664
+ };
665
+ };
666
+
667
+ /**
668
+ * Scrolls to a category in the list view
669
+ */
670
+ (0, _react.useImperativeHandle)(ref, function () {
671
+ return {
672
+ reveal: function reveal(category) {
673
+ var row = categoryTracker.getRow(category);
674
+ (0, _utils.scrollToRow)(listRef, row);
675
+ },
676
+ scrollToBottom: function scrollToBottom() {
677
+ (0, _utils.scrollToRow)(listRef, virtualItems.length);
678
+ },
679
+ scrollToTop: function scrollToTop() {
680
+ (0, _utils.scrollToRow)(listRef, 0);
681
+ },
682
+ scrollToRow: function scrollToRow(index) {
683
+ (0, _utils.scrollToRow)(listRef, index);
684
+ },
685
+ scrollToRecentlyUploaded: function scrollToRecentlyUploaded(uploadedEmoji) {
686
+ // when search results is shown
687
+ if (query) {
688
+ var _findEmojiRowAndColum = findEmojiRowAndColumnById(uploadedEmoji.id),
689
+ rowIndex = _findEmojiRowAndColum.rowIndex,
690
+ columnIndex = _findEmojiRowAndColum.columnIndex;
691
+ if (rowIndex !== -1) {
692
+ var _listRef$current;
693
+ (_listRef$current = listRef.current) === null || _listRef$current === void 0 || _listRef$current.scrollToEmojiAndFocus(rowIndex, columnIndex);
694
+ }
695
+ } else {
696
+ // when seeing all emojis
697
+ var row = lastYourUploadsRow;
698
+ if (row > 0) {
699
+ var _listRef$current2;
700
+ (_listRef$current2 = listRef.current) === null || _listRef$current2 === void 0 || _listRef$current2.scrollToRowAndFocusLastEmoji(lastYourUploadsRow);
701
+ }
702
+ }
703
+ }
704
+ };
705
+ });
706
+ (0, _react.useEffect)(function () {
707
+ if (!query) {
708
+ buildEmojiGroupedByCategory(emojis, currentUser);
709
+ }
710
+ }, [emojis, selectedTone, loading, query, currentUser, buildEmojiGroupedByCategory]);
711
+ (0, _react.useEffect)(function () {
712
+ buildVirtualItems();
713
+ }, [allEmojiGroups, buildVirtualItems]);
714
+ (0, _react.useEffect)(function () {
715
+ if (categoriesChanged) {
716
+ onRowsRendered({
717
+ startIndex: 0
718
+ });
719
+ }
720
+ // eslint-disable-next-line react-hooks/exhaustive-deps
721
+ }, [virtualItems, categoriesChanged]);
722
+ var virtualListHeight = (0, _react.useMemo)(function () {
723
+ return _EmojiPickerSizes.sizes.listHeight + (0, _utils.emojiPickerHeightOffset)(size);
724
+ }, [size]);
725
+ return (0, _react2.jsx)(EmojiPickerTabPanel, {
726
+ showSearchResults: !!query
727
+ }, (0, _react2.jsx)(_EmojiActions.default, {
728
+ selectedTone: selectedTone,
729
+ onToneSelected: onToneSelected,
730
+ onToneSelectorCancelled: onToneSelectorCancelled,
731
+ toneEmoji: toneEmoji,
732
+ uploading: uploading,
733
+ uploadEnabled: uploadEnabled,
734
+ emojiToDelete: emojiToDelete,
735
+ initialUploadName: initialUploadName,
736
+ uploadErrorMessage: uploadErrorMessage,
737
+ onUploadCancelled: onUploadCancelled,
738
+ onUploadEmoji: onUploadEmoji,
739
+ onCloseDelete: handleOnCloseDelete,
740
+ onDeleteEmoji: onDeleteEmoji,
741
+ onFileChooserClicked: onFileChooserClicked,
742
+ onOpenUpload: onOpenUpload,
743
+ query: query,
744
+ onChange: onSearch,
745
+ resultsCount: emojis.length
746
+ }), (0, _react2.jsx)(_EmojiPickerListContext.EmojiPickerListContextProvider, {
747
+ initialEmojisFocus: {
748
+ rowIndex: 1,
749
+ columnIndex: 0
750
+ }
751
+ }, (0, _react2.jsx)(_VirtualList.VirtualList, {
752
+ ref: listRef,
753
+ height: virtualListHeight,
754
+ overscanRowCount: 10,
755
+ rowCount: virtualItems.length,
756
+ rowHeight: rowSize,
757
+ rowRenderer: renderRow,
758
+ scrollToAlignment: "start",
759
+ width: _EmojiPickerSizes.sizes.listWidth,
760
+ onRowsRendered: onRowsRendered
761
+ })));
427
762
  });
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.emojiPickerHeightOffset = void 0;
6
+ exports.scrollToRow = exports.emojiPickerHeightOffset = void 0;
7
7
  var _constants = require("../../util/constants");
8
8
  var emojiPickerHeightOffset = exports.emojiPickerHeightOffset = function emojiPickerHeightOffset(size) {
9
9
  if (size === 'medium') {
@@ -12,4 +12,10 @@ var emojiPickerHeightOffset = exports.emojiPickerHeightOffset = function emojiPi
12
12
  return _constants.sizeGap * 2;
13
13
  }
14
14
  return 0;
15
+ };
16
+
17
+ // this function is being exported so it can be mocked in unit tests
18
+ var scrollToRow = exports.scrollToRow = function scrollToRow(listRef, index) {
19
+ var _listRef$current;
20
+ (_listRef$current = listRef.current) === null || _listRef$current === void 0 || _listRef$current.scrollToRow(index);
15
21
  };
@@ -25,6 +25,7 @@ var _typeHelpers = require("../../util/type-helpers");
25
25
  var _RecordSelectionDefault = require("../common/RecordSelectionDefault");
26
26
  var _EmojiTypeAheadList = _interopRequireDefault(require("./EmojiTypeAheadList"));
27
27
  var _styles = require("./styles");
28
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
28
29
  function _createSuper(t) { var r = _isNativeReflectConstruct(); return function () { var e, o = (0, _getPrototypeOf2.default)(t); if (r) { var s = (0, _getPrototypeOf2.default)(this).constructor; e = Reflect.construct(o, arguments, s); } else e = o.apply(this, arguments); return (0, _possibleConstructorReturn2.default)(this, e); }; }
29
30
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
30
31
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
@@ -196,14 +197,33 @@ var EmojiTypeAheadComponent = exports.default = /*#__PURE__*/function (_PureComp
196
197
  }, {
197
198
  key: "UNSAFE_componentWillReceiveProps",
198
199
  value: function UNSAFE_componentWillReceiveProps(nextProps) {
199
- var prevEmojiProvider = this.props.emojiProvider;
200
- var nextEmojiProvider = nextProps.emojiProvider;
201
- if (prevEmojiProvider !== nextEmojiProvider) {
202
- prevEmojiProvider.unsubscribe(this.onProviderChange);
203
- nextEmojiProvider.subscribe(this.onProviderChange);
204
- this.onSearch(nextProps.query);
205
- } else if (this.props.query !== nextProps.query) {
206
- this.onSearch(nextProps.query);
200
+ if (!(0, _platformFeatureFlags.fg)('platform_editor_react18_elements_emoji')) {
201
+ var prevEmojiProvider = this.props.emojiProvider;
202
+ var nextEmojiProvider = nextProps.emojiProvider;
203
+ if (prevEmojiProvider !== nextEmojiProvider) {
204
+ prevEmojiProvider.unsubscribe(this.onProviderChange);
205
+ nextEmojiProvider.subscribe(this.onProviderChange);
206
+ this.onSearch(nextProps.query);
207
+ } else if (this.props.query !== nextProps.query) {
208
+ this.onSearch(nextProps.query);
209
+ }
210
+ }
211
+ }
212
+ }, {
213
+ key: "componentDidUpdate",
214
+ value: function componentDidUpdate(prevProps) {
215
+ if ((0, _platformFeatureFlags.fg)('platform_editor_react18_elements_emoji')) {
216
+ if (prevProps !== this.props) {
217
+ var prevEmojiProvider = prevProps.emojiProvider;
218
+ var nextEmojiProvider = this.props.emojiProvider;
219
+ if (prevEmojiProvider !== nextEmojiProvider) {
220
+ prevEmojiProvider.unsubscribe(this.onProviderChange);
221
+ nextEmojiProvider.subscribe(this.onProviderChange);
222
+ this.onSearch(this.props.query);
223
+ } else if (prevProps.query !== this.props.query) {
224
+ this.onSearch(this.props.query);
225
+ }
226
+ }
207
227
  }
208
228
  }
209
229
  }, {