@atlaskit/emoji 67.0.7 → 67.1.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 (140) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/api/EmojiResource.js +12 -1
  3. package/dist/cjs/components/common/EmojiActions.js +2 -2
  4. package/dist/cjs/components/hooks.js +8 -5
  5. package/dist/cjs/components/picker/EmojiPickerComponent.js +23 -40
  6. package/dist/cjs/components/picker/EmojiPickerList.js +20 -43
  7. package/dist/cjs/components/picker/EmojiPickerListSearch.js +53 -117
  8. package/dist/cjs/components/picker/VirtualList.js +100 -180
  9. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +0 -10
  10. package/dist/cjs/i18n/cs.js +35 -34
  11. package/dist/cjs/i18n/da.js +35 -34
  12. package/dist/cjs/i18n/de.js +35 -34
  13. package/dist/cjs/i18n/en.js +35 -34
  14. package/dist/cjs/i18n/en_GB.js +35 -34
  15. package/dist/cjs/i18n/es.js +35 -34
  16. package/dist/cjs/i18n/fi.js +35 -34
  17. package/dist/cjs/i18n/fr.js +35 -34
  18. package/dist/cjs/i18n/hu.js +35 -34
  19. package/dist/cjs/i18n/it.js +35 -34
  20. package/dist/cjs/i18n/ja.js +35 -34
  21. package/dist/cjs/i18n/ko.js +35 -34
  22. package/dist/cjs/i18n/nb.js +35 -34
  23. package/dist/cjs/i18n/nl.js +35 -34
  24. package/dist/cjs/i18n/pl.js +35 -34
  25. package/dist/cjs/i18n/pt_BR.js +35 -34
  26. package/dist/cjs/i18n/ru.js +35 -34
  27. package/dist/cjs/i18n/sv.js +35 -34
  28. package/dist/cjs/i18n/th.js +35 -34
  29. package/dist/cjs/i18n/tr.js +35 -34
  30. package/dist/cjs/i18n/uk.js +35 -34
  31. package/dist/cjs/i18n/vi.js +35 -34
  32. package/dist/cjs/i18n/zh.js +35 -34
  33. package/dist/cjs/i18n/zh_TW.js +35 -34
  34. package/dist/cjs/types.js +7 -1
  35. package/dist/cjs/util/constants.js +4 -2
  36. package/dist/cjs/version.json +1 -1
  37. package/dist/es2019/api/EmojiResource.js +13 -2
  38. package/dist/es2019/components/common/EmojiActions.js +1 -1
  39. package/dist/es2019/components/hooks.js +7 -4
  40. package/dist/es2019/components/picker/EmojiPickerComponent.js +24 -41
  41. package/dist/es2019/components/picker/EmojiPickerList.js +17 -40
  42. package/dist/es2019/components/picker/EmojiPickerListSearch.js +51 -98
  43. package/dist/es2019/components/picker/VirtualList.js +71 -113
  44. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +0 -10
  45. package/dist/es2019/i18n/cs.js +35 -34
  46. package/dist/es2019/i18n/da.js +35 -34
  47. package/dist/es2019/i18n/de.js +35 -34
  48. package/dist/es2019/i18n/en.js +35 -34
  49. package/dist/es2019/i18n/en_GB.js +35 -34
  50. package/dist/es2019/i18n/es.js +35 -34
  51. package/dist/es2019/i18n/fi.js +35 -34
  52. package/dist/es2019/i18n/fr.js +35 -34
  53. package/dist/es2019/i18n/hu.js +35 -34
  54. package/dist/es2019/i18n/it.js +35 -34
  55. package/dist/es2019/i18n/ja.js +35 -34
  56. package/dist/es2019/i18n/ko.js +35 -34
  57. package/dist/es2019/i18n/nb.js +35 -34
  58. package/dist/es2019/i18n/nl.js +35 -34
  59. package/dist/es2019/i18n/pl.js +35 -34
  60. package/dist/es2019/i18n/pt_BR.js +35 -34
  61. package/dist/es2019/i18n/ru.js +35 -34
  62. package/dist/es2019/i18n/sv.js +35 -34
  63. package/dist/es2019/i18n/th.js +35 -34
  64. package/dist/es2019/i18n/tr.js +35 -34
  65. package/dist/es2019/i18n/uk.js +35 -34
  66. package/dist/es2019/i18n/vi.js +35 -34
  67. package/dist/es2019/i18n/zh.js +35 -34
  68. package/dist/es2019/i18n/zh_TW.js +35 -34
  69. package/dist/es2019/types.js +5 -0
  70. package/dist/es2019/util/constants.js +1 -0
  71. package/dist/es2019/version.json +1 -1
  72. package/dist/esm/api/EmojiResource.js +13 -2
  73. package/dist/esm/components/common/EmojiActions.js +1 -1
  74. package/dist/esm/components/hooks.js +7 -4
  75. package/dist/esm/components/picker/EmojiPickerComponent.js +24 -41
  76. package/dist/esm/components/picker/EmojiPickerList.js +21 -40
  77. package/dist/esm/components/picker/EmojiPickerListSearch.js +51 -117
  78. package/dist/esm/components/picker/VirtualList.js +99 -180
  79. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +0 -10
  80. package/dist/esm/i18n/cs.js +35 -34
  81. package/dist/esm/i18n/da.js +35 -34
  82. package/dist/esm/i18n/de.js +35 -34
  83. package/dist/esm/i18n/en.js +35 -34
  84. package/dist/esm/i18n/en_GB.js +35 -34
  85. package/dist/esm/i18n/es.js +35 -34
  86. package/dist/esm/i18n/fi.js +35 -34
  87. package/dist/esm/i18n/fr.js +35 -34
  88. package/dist/esm/i18n/hu.js +35 -34
  89. package/dist/esm/i18n/it.js +35 -34
  90. package/dist/esm/i18n/ja.js +35 -34
  91. package/dist/esm/i18n/ko.js +35 -34
  92. package/dist/esm/i18n/nb.js +35 -34
  93. package/dist/esm/i18n/nl.js +35 -34
  94. package/dist/esm/i18n/pl.js +35 -34
  95. package/dist/esm/i18n/pt_BR.js +35 -34
  96. package/dist/esm/i18n/ru.js +35 -34
  97. package/dist/esm/i18n/sv.js +35 -34
  98. package/dist/esm/i18n/th.js +35 -34
  99. package/dist/esm/i18n/tr.js +35 -34
  100. package/dist/esm/i18n/uk.js +35 -34
  101. package/dist/esm/i18n/vi.js +35 -34
  102. package/dist/esm/i18n/zh.js +35 -34
  103. package/dist/esm/i18n/zh_TW.js +35 -34
  104. package/dist/esm/types.js +5 -0
  105. package/dist/esm/util/constants.js +1 -0
  106. package/dist/esm/version.json +1 -1
  107. package/dist/types/components/common/EmojiActions.d.ts +1 -1
  108. package/dist/types/components/hooks.d.ts +1 -1
  109. package/dist/types/components/picker/CategoryTracker.d.ts +2 -2
  110. package/dist/types/components/picker/EmojiPickerList.d.ts +4 -2
  111. package/dist/types/components/picker/EmojiPickerListSearch.d.ts +3 -8
  112. package/dist/types/components/picker/VirtualList.d.ts +5 -24
  113. package/dist/types/i18n/cs.d.ts +34 -34
  114. package/dist/types/i18n/da.d.ts +34 -34
  115. package/dist/types/i18n/de.d.ts +34 -34
  116. package/dist/types/i18n/en.d.ts +34 -34
  117. package/dist/types/i18n/en_GB.d.ts +34 -34
  118. package/dist/types/i18n/es.d.ts +34 -34
  119. package/dist/types/i18n/fi.d.ts +34 -34
  120. package/dist/types/i18n/fr.d.ts +34 -34
  121. package/dist/types/i18n/hu.d.ts +34 -34
  122. package/dist/types/i18n/it.d.ts +34 -34
  123. package/dist/types/i18n/ja.d.ts +34 -34
  124. package/dist/types/i18n/ko.d.ts +34 -34
  125. package/dist/types/i18n/nb.d.ts +34 -34
  126. package/dist/types/i18n/nl.d.ts +34 -34
  127. package/dist/types/i18n/pl.d.ts +34 -34
  128. package/dist/types/i18n/pt_BR.d.ts +34 -34
  129. package/dist/types/i18n/ru.d.ts +34 -34
  130. package/dist/types/i18n/sv.d.ts +34 -34
  131. package/dist/types/i18n/th.d.ts +34 -34
  132. package/dist/types/i18n/tr.d.ts +34 -34
  133. package/dist/types/i18n/uk.d.ts +34 -34
  134. package/dist/types/i18n/vi.d.ts +34 -34
  135. package/dist/types/i18n/zh.d.ts +34 -34
  136. package/dist/types/i18n/zh_TW.d.ts +34 -34
  137. package/dist/types/types.d.ts +5 -0
  138. package/dist/types/util/constants.d.ts +1 -0
  139. package/package.json +5 -4
  140. package/report.api.md +10 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 67.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`27b1925f52a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/27b1925f52a) - - search emoji in emoji picker will scroll to top
8
+ - improve emoji search analytics tracking
9
+ - add debounce to emoji search
10
+ - fix duplicated calls triggered by each emoji search
11
+ - functional component refactoring for VirtualList and EmojiPickerListSearch
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies
16
+
3
17
  ## 67.0.7
4
18
 
5
19
  ### Patch Changes
@@ -487,12 +487,23 @@ var EmojiResource = /*#__PURE__*/function (_ref) {
487
487
  }, {
488
488
  key: "filter",
489
489
  value: function filter(query, options) {
490
+ _ufoExperiences.ufoExperiences['emoji-searched'].start();
491
+ _ufoExperiences.ufoExperiences['emoji-searched'].addMetadata({
492
+ queryLength: (query === null || query === void 0 ? void 0 : query.length) || 0
493
+ });
490
494
  this.lastQuery = {
491
495
  query: query,
492
496
  options: options
493
497
  };
494
498
  if (this.emojiRepository) {
495
- this.notifyResult(this.emojiRepository.search(query, options));
499
+ var searchResults = this.emojiRepository.search(query, options);
500
+ this.notifyResult(searchResults);
501
+ _ufoExperiences.ufoExperiences['emoji-searched'].success({
502
+ metadata: {
503
+ emojisLength: searchResults.emojis.length,
504
+ source: (options === null || options === void 0 ? void 0 : options.source) || 'typeahead'
505
+ }
506
+ });
496
507
  } else {
497
508
  // not ready
498
509
  this.notifyNotReady();
@@ -12,7 +12,7 @@ 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
17
  var _EmojiButton = _interopRequireDefault(require("./EmojiButton"));
18
18
  var _i18n = require("../i18n");
@@ -140,7 +140,7 @@ var EmojiActions = function EmojiActions(props) {
140
140
  onMouseLeave: onMouseLeaveHandler
141
141
  }, (0, _react2.jsx)("div", {
142
142
  css: _styles.emojiActionsWrapper
143
- }, !showToneSelector && (0, _react2.jsx)(_EmojiPickerListSearch.default, {
143
+ }, !showToneSelector && (0, _react2.jsx)(_EmojiPickerListSearch.EmojiPickerListSearch, {
144
144
  onChange: onChange,
145
145
  query: query
146
146
  }), (0, _react2.jsx)(TonesWrapper, (0, _extends2.default)({}, props, {
@@ -3,12 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useDidMount = useDidMount;
6
+ exports.useIsMounted = useIsMounted;
7
7
  var _react = require("react");
8
- function useDidMount() {
9
- var didMountRef = (0, _react.useRef)(false);
8
+ function useIsMounted() {
9
+ var isMountedRef = (0, _react.useRef)(false);
10
10
  (0, _react.useEffect)(function () {
11
- didMountRef.current = true;
11
+ isMountedRef.current = true;
12
+ return function () {
13
+ isMountedRef.current = false;
14
+ };
12
15
  }, []);
13
- return didMountRef.current;
16
+ return isMountedRef.current;
14
17
  }
@@ -25,8 +25,8 @@ var _EmojiPickerFooter = _interopRequireDefault(require("./EmojiPickerFooter"));
25
25
  var _EmojiPickerList = _interopRequireDefault(require("./EmojiPickerList"));
26
26
  var _analytics = require("../../util/analytics");
27
27
  var _styles = require("./styles");
28
- var _hooks = require("../hooks");
29
28
  var _useEmoji2 = require("../../hooks/useEmoji");
29
+ var _hooks = require("../hooks");
30
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; }
31
31
  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
32
  var FREQUENTLY_USED_MAX = 16;
@@ -101,12 +101,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
101
101
  }, []);
102
102
  var openTime = (0, _react.useRef)(0);
103
103
  var isMounting = (0, _react.useRef)(true);
104
- var didMount = (0, _hooks.useDidMount)();
105
- var updateAfterDidMount = (0, _react.useRef)(true);
106
104
  var previousEmojiProvider = (0, _react.useRef)(emojiProvider);
107
105
  var currentUser = (0, _react.useMemo)(function () {
108
106
  return emojiProvider.getCurrentUser();
109
107
  }, [emojiProvider]);
108
+ var isMounted = (0, _hooks.useIsMounted)();
110
109
  var fireAnalytics = (0, _react.useCallback)(function (analyticsEvent) {
111
110
  if (createAnalyticsEvent) {
112
111
  (0, _analytics.createAndFireEventInElementsChannel)(analyticsEvent)(createAnalyticsEvent);
@@ -210,7 +209,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
210
209
  emojiToRender: emojiToRender,
211
210
  searchEmoji: searchResults.emojis
212
211
  });
213
- }, [frequentlyUsedEmojis, query, setStateAfterEmojiChange]);
212
+ fireAnalytics((0, _analytics.pickerSearchedEvent)({
213
+ queryLength: searchQuery.length,
214
+ numMatches: searchResults.emojis.length
215
+ }));
216
+ }, [frequentlyUsedEmojis, query, setStateAfterEmojiChange, fireAnalytics]);
214
217
  var onProviderChange = (0, _react.useMemo)(function () {
215
218
  return {
216
219
  result: onSearchResult
@@ -300,22 +303,22 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
300
303
  var onFileChooserClicked = (0, _react.useCallback)(function () {
301
304
  fireAnalytics((0, _analytics.selectedFileEvent)());
302
305
  }, [fireAnalytics]);
306
+ var scrollToTopOfList = (0, _react.useCallback)(function () {
307
+ var _emojiPickerList$curr;
308
+ (_emojiPickerList$curr = emojiPickerList.current) === null || _emojiPickerList$curr === void 0 ? void 0 : _emojiPickerList$curr.scrollToTop();
309
+ }, [emojiPickerList]);
303
310
  var onSearch = (0, _react.useCallback)(function (searchQuery) {
304
311
  var options = {
305
- skinTone: selectedTone
312
+ skinTone: selectedTone,
313
+ source: _types.SearchSourceTypes.PICKER
306
314
  };
307
- if (query) {
308
- _analytics.ufoExperiences['emoji-searched'].start();
309
- _analytics.ufoExperiences['emoji-searched'].addMetadata({
310
- queryLength: query.length,
311
- source: 'EmojiPickerComponent'
312
- });
313
- }
314
315
  if (searchQuery !== query) {
315
316
  setQuery(searchQuery);
317
+ // scroll to top when search, which is search results section
318
+ scrollToTopOfList();
316
319
  }
317
- updateEmojis(query, options);
318
- }, [query, selectedTone, updateEmojis]);
320
+ updateEmojis(searchQuery, options);
321
+ }, [query, selectedTone, updateEmojis, scrollToTopOfList]);
319
322
  var onOpenUpload = (0, _react.useCallback)(function () {
320
323
  // Prime upload token so it's ready when the user adds
321
324
  if ((0, _EmojiResource.supportsUploadFeature)(emojiProvider)) {
@@ -331,8 +334,8 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
331
334
  if (emojiPickerList.current) {
332
335
  // Wait a tick to ensure repaint and updated height for picker list
333
336
  window.setTimeout(function () {
334
- var _emojiPickerList$curr;
335
- (_emojiPickerList$curr = emojiPickerList.current) === null || _emojiPickerList$curr === void 0 ? void 0 : _emojiPickerList$curr.scrollToBottom();
337
+ var _emojiPickerList$curr2;
338
+ (_emojiPickerList$curr2 = emojiPickerList.current) === null || _emojiPickerList$curr2 === void 0 ? void 0 : _emojiPickerList$curr2.scrollToBottom();
336
339
  }, 0);
337
340
  }
338
341
  }, [emojiPickerList]);
@@ -403,11 +406,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
403
406
  }
404
407
  (0, _react.useEffect)(function () {
405
408
  // componentDidMount logic
406
- if (didMount && updateAfterDidMount.current) {
409
+ if (!isMounted) {
407
410
  onComponentDidMount();
408
- updateAfterDidMount.current = false;
409
411
  }
410
- }, [didMount, onComponentDidMount]);
412
+ }, [onComponentDidMount, isMounted]);
411
413
  (0, _react.useEffect)(function () {
412
414
  previousEmojiProvider.current.unsubscribe(onProviderChange);
413
415
  previousEmojiProvider.current = emojiProvider;
@@ -416,26 +418,6 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
416
418
  emojiProvider.unsubscribe(onProviderChange);
417
419
  };
418
420
  }, [emojiProvider, onProviderChange]);
419
- (0, _react.useEffect)(function () {
420
- // We changed provider which means we subscribed to filter results for a new subscriber.
421
- // So we refresh the emoji display with onSearch and we do it here, after the new props have
422
- // been set since onSearch leads to filter being called on the current emojiProvider.
423
- // (Calling onSearch in a '...Will...' lifecycle method would lead to filter being called on
424
- // an emojiProvider we have already unsubscribed from)
425
- onSearch(query);
426
- }, [emojiProvider, onSearch, query]);
427
- (0, _react.useEffect)(function () {
428
- // Fire analytics event whenever query changes
429
- fireAnalytics((0, _analytics.pickerSearchedEvent)({
430
- queryLength: query.length,
431
- numMatches: filteredEmojis.length
432
- }));
433
- _analytics.ufoExperiences['emoji-searched'].success({
434
- metadata: {
435
- emojisLength: filteredEmojis.length
436
- }
437
- });
438
- }, [filteredEmojis.length, fireAnalytics, query]);
439
421
  (0, _react.useEffect)(function () {
440
422
  if (!frequentlyUsedEmojis.length || query) {
441
423
  setFilteredEmojis(searchEmojis);
@@ -505,7 +487,8 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
505
487
  onCloseDelete: onCloseDelete,
506
488
  onFileChooserClicked: onFileChooserClicked,
507
489
  onOpenUpload: onOpenUpload,
508
- size: size
490
+ size: size,
491
+ activeCategoryId: activeCategory
509
492
  }), showPreview && (0, _react2.jsx)(_EmojiPickerFooter.default, {
510
493
  selectedEmoji: selectedEmoji
511
494
  }));
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -14,7 +13,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
14
13
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
15
14
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
16
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
- var _react = _interopRequireWildcard(require("react"));
16
+ var _react = require("react");
18
17
  var _react2 = require("@emotion/react");
19
18
  var _constants = require("../../util/constants");
20
19
  var _categories = require("./categories");
@@ -25,8 +24,6 @@ var _EmojiActions = _interopRequireDefault(require("../common/EmojiActions"));
25
24
  var _styles = require("./styles");
26
25
  var _utils = require("./utils");
27
26
  var _VirtualList = require("./VirtualList");
28
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
30
27
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
31
28
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
32
29
  /**
@@ -47,14 +44,15 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
47
44
  _this = _super.call(this, _props);
48
45
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "virtualItems", []);
49
46
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "categoryTracker", new _CategoryTracker.default());
47
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "listRef", /*#__PURE__*/(0, _react.createRef)());
50
48
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onEmojiMouseEnter", function (emojiId, emoji) {
51
49
  if (_this.props.onEmojiActive) {
52
50
  _this.props.onEmojiActive(emojiId, emoji);
53
51
  }
54
52
  });
55
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSearch", function (e) {
53
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSearch", function (value) {
56
54
  if (_this.props.onSearch) {
57
- _this.props.onSearch(e.target.value);
55
+ _this.props.onSearch(value);
58
56
  }
59
57
  });
60
58
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "buildVirtualItemFromGroup", function (group) {
@@ -112,19 +110,7 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
112
110
  });
113
111
  }
114
112
  }
115
- var rowCountChanged = _this.virtualItems.length !== items.length;
116
113
  _this.virtualItems = items;
117
- var list = _this.refs.list;
118
- if (!rowCountChanged && list) {
119
- // Row count has not changed, so need to tell list to rerender.
120
- list.forceUpdateGrid();
121
- }
122
- if (!query && list) {
123
- // VirtualList can apply stale heights since it performs a shallow
124
- // compare to check if the list has changed. Should manually recompute
125
- // row heights for the case when frequent category come in later
126
- list.recomputeRowHeights();
127
- }
128
114
  });
129
115
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "addToCategoryMap", function (categoryToGroupMap, emoji, category) {
130
116
  if (!categoryToGroupMap[category]) {
@@ -160,31 +146,13 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
160
146
  return group;
161
147
  }).sort(byOrder);
162
148
  });
163
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "repaintList", function () {
164
- if (_this.refs.root) {
165
- var root = _this.refs.root;
166
- var display = root.style.display;
167
- root.style.display = 'none';
168
-
169
- // we need to access offset to force repaint
170
- // eslint-disable-next-line no-unused-expressions
171
- root.offsetHeight;
172
- root.style.display = display;
173
- }
174
- });
175
149
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "checkCategoryIdChange", function (indexes) {
176
150
  var startIndex = indexes.startIndex;
177
-
178
- // FS-1844 Fix a rendering problem when scrolling to the top
179
- if (startIndex === 0) {
180
- _this.repaintList();
181
- }
182
151
  if (!_this.props.query) {
183
152
  // Calculate category in view - only relevant if categories shown, i.e. no query
184
- var list = _this.refs.list;
153
+ var list = _this.listRef.current;
185
154
  var currentCategory = _this.categoryTracker.findNearestCategoryAbove(startIndex, list);
186
- if (currentCategory && _this.activeCategoryId !== currentCategory) {
187
- _this.activeCategoryId = currentCategory;
155
+ if (currentCategory && _this.props.activeCategoryId !== currentCategory) {
188
156
  if (_this.props.onCategoryActivated) {
189
157
  _this.props.onCategoryActivated(currentCategory);
190
158
  }
@@ -221,14 +189,23 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
221
189
  */
222
190
  function reveal(category) {
223
191
  var row = this.categoryTracker.getRow(category);
224
- var list = this.refs.list;
225
- list.scrollToRow(row);
192
+ this.scrollToRow(row);
226
193
  }
227
194
  }, {
228
195
  key: "scrollToBottom",
229
196
  value: function scrollToBottom() {
230
- var list = this.refs.list;
231
- list.scrollToRow(this.virtualItems.length);
197
+ this.scrollToRow(this.virtualItems.length);
198
+ }
199
+ }, {
200
+ key: "scrollToTop",
201
+ value: function scrollToTop() {
202
+ this.scrollToRow(0);
203
+ }
204
+ }, {
205
+ key: "scrollToRow",
206
+ value: function scrollToRow(index) {
207
+ var _this$listRef$current;
208
+ (_this$listRef$current = this.listRef.current) === null || _this$listRef$current === void 0 ? void 0 : _this$listRef$current.scrollToRow(index);
232
209
  }
233
210
  }, {
234
211
  key: "render",
@@ -276,7 +253,7 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
276
253
  query: query,
277
254
  onChange: this.onSearch
278
255
  }), (0, _react2.jsx)(_VirtualList.VirtualList, {
279
- ref: "list",
256
+ ref: this.listRef,
280
257
  height: virtualListHeight,
281
258
  overscanRowCount: 10,
282
259
  rowCount: this.virtualItems.length,
@@ -5,14 +5,8 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.emojiPickerSearchTestId = exports.default = void 0;
9
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
12
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
14
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
15
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
+ exports.emojiPickerSearchTestId = exports.EmojiPickerListSearch = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
16
10
  var _react = _interopRequireWildcard(require("react"));
17
11
  var _react2 = require("@emotion/react");
18
12
  var _textfield = _interopRequireDefault(require("@atlaskit/textfield"));
@@ -20,118 +14,60 @@ var _search = _interopRequireDefault(require("@atlaskit/icon/glyph/search"));
20
14
  var _reactIntlNext = require("react-intl-next");
21
15
  var _i18n = require("../i18n");
22
16
  var _styles = require("./styles");
17
+ var _constants = require("../../util/constants");
18
+ var _useDebounce = require("use-debounce");
23
19
  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); }
24
20
  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; }
25
- 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); }; }
26
- 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; } }
21
+ /** @jsx jsx */
22
+
27
23
  var emojiPickerSearchTestId = 'emoji-picker-serach';
28
24
  exports.emojiPickerSearchTestId = emojiPickerSearchTestId;
29
- var EmojiPickerListSearch = /*#__PURE__*/function (_PureComponent) {
30
- (0, _inherits2.default)(EmojiPickerListSearch, _PureComponent);
31
- var _super = _createSuper(EmojiPickerListSearch);
32
- function EmojiPickerListSearch() {
33
- var _this;
34
- (0, _classCallCheck2.default)(this, EmojiPickerListSearch);
35
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
36
- args[_key] = arguments[_key];
37
- }
38
- _this = _super.call.apply(_super, [this].concat(args));
39
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onBlur", function () {
40
- var activeElement = document.activeElement;
41
- // Input lost focus to emoji picker container (happens in IE11 when updating search results)
42
- // See FS-2111
43
- if (activeElement instanceof HTMLElement && activeElement.getAttribute('data-emoji-picker-container')) {
44
- _this.restoreInputFocus();
45
- }
46
- });
47
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onChange", function (e) {
48
- _this.saveInputSelection();
49
- _this.props.onChange(e);
50
- });
51
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "focusInput", function () {
52
- if (_this.inputRef) {
53
- _this.inputRef.focus();
54
- }
55
- });
56
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleInputRef", function (input) {
57
- if (input) {
58
- // Defer focus so it give some time to position the popup before
59
- // setting the focus to search input.
60
- // see FS-2056
61
- _this.inputRef = input;
62
- if (typeof window === 'undefined') {
63
- return;
64
- }
65
- window.requestAnimationFrame(_this.focusInput);
25
+ var EmojiPickerListSearch = function EmojiPickerListSearch(props) {
26
+ var style = props.style,
27
+ query = props.query,
28
+ onChange = props.onChange;
29
+ var textRef = (0, _react.useRef)(null);
30
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
31
+ formatMessage = _useIntl.formatMessage;
32
+
33
+ // Debounce callback
34
+ var _useDebouncedCallback = (0, _useDebounce.useDebouncedCallback)(function (value) {
35
+ onChange(value);
36
+ },
37
+ // delay in ms
38
+ _constants.EMOJI_SEARCH_DEBOUNCE),
39
+ _useDebouncedCallback2 = (0, _slicedToArray2.default)(_useDebouncedCallback, 1),
40
+ debouncedSearch = _useDebouncedCallback2[0];
41
+ var handleOnChange = function handleOnChange(e) {
42
+ debouncedSearch(e.target.value);
43
+ };
44
+ (0, _react.useLayoutEffect)(function () {
45
+ requestAnimationFrame(function () {
46
+ if (textRef) {
47
+ var _textRef$current;
48
+ (_textRef$current = textRef.current) === null || _textRef$current === void 0 ? void 0 : _textRef$current.focus();
66
49
  }
67
50
  });
68
- return _this;
69
- }
70
- (0, _createClass2.default)(EmojiPickerListSearch, [{
71
- key: "saveInputSelection",
72
- value: function saveInputSelection() {
73
- this.inputSelection = undefined;
74
- if (this.inputRef) {
75
- var _this$inputRef = this.inputRef,
76
- selectionStart = _this$inputRef.selectionStart,
77
- selectionEnd = _this$inputRef.selectionEnd,
78
- selectionDirection = _this$inputRef.selectionDirection;
79
- if (selectionStart && selectionEnd && selectionDirection) {
80
- this.inputSelection = {
81
- selectionStart: selectionStart,
82
- selectionEnd: selectionEnd,
83
- selectionDirection: selectionDirection
84
- };
85
- }
86
- }
87
- }
88
- }, {
89
- key: "restoreInputFocus",
90
- value: function restoreInputFocus() {
91
- this.focusInput();
92
- if (this.inputSelection && this.inputRef && this.inputRef.setSelectionRange) {
93
- var _this$inputSelection = this.inputSelection,
94
- selectionStart = _this$inputSelection.selectionStart,
95
- selectionEnd = _this$inputSelection.selectionEnd,
96
- selectionDirection = _this$inputSelection.selectionDirection;
97
- this.inputRef.setSelectionRange(selectionStart, selectionEnd, selectionDirection);
98
- }
99
- }
100
- }, {
101
- key: "render",
102
- value: function render() {
103
- var _this$props = this.props,
104
- style = _this$props.style,
105
- query = _this$props.query,
106
- intl = _this$props.intl;
107
- var formatMessage = intl.formatMessage;
108
- return (0, _react2.jsx)("div", {
109
- css: _styles.pickerSearch,
110
- style: style
111
- }, (0, _react2.jsx)(_textfield.default, {
112
- "aria-label": formatMessage(_i18n.messages.searchLabel),
113
- css: _styles.input,
114
- autoComplete: "off",
115
- name: "search",
116
- placeholder: "".concat(formatMessage(_i18n.messages.searchPlaceholder), "..."),
117
- onChange: this.onChange,
118
- value: query || '',
119
- ref: this.handleInputRef,
120
- isCompact: true,
121
- onBlur: this.onBlur,
122
- elemBeforeInput: (0, _react2.jsx)("span", {
123
- css: _styles.searchIcon
124
- }, (0, _react2.jsx)(_search.default, {
125
- label: ""
126
- })),
127
- testId: emojiPickerSearchTestId
128
- }));
129
- }
130
- }]);
131
- return EmojiPickerListSearch;
132
- }(_react.PureComponent);
133
- (0, _defineProperty2.default)(EmojiPickerListSearch, "defaultProps", {
134
- style: {}
135
- });
136
- var _default = (0, _reactIntlNext.injectIntl)(EmojiPickerListSearch);
137
- exports.default = _default;
51
+ }, []);
52
+ return (0, _react2.jsx)("div", {
53
+ css: _styles.pickerSearch,
54
+ style: style
55
+ }, (0, _react2.jsx)(_textfield.default, {
56
+ "aria-label": formatMessage(_i18n.messages.searchLabel),
57
+ css: _styles.input,
58
+ autoComplete: "off",
59
+ name: "search",
60
+ placeholder: "".concat(formatMessage(_i18n.messages.searchPlaceholder), "..."),
61
+ defaultValue: query || '',
62
+ onChange: handleOnChange,
63
+ isCompact: true,
64
+ elemBeforeInput: (0, _react2.jsx)("span", {
65
+ css: _styles.searchIcon
66
+ }, (0, _react2.jsx)(_search.default, {
67
+ label: ""
68
+ })),
69
+ testId: emojiPickerSearchTestId,
70
+ ref: textRef
71
+ }));
72
+ };
73
+ exports.EmojiPickerListSearch = EmojiPickerListSearch;