@atlaskit/emoji 71.0.0 → 71.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 (60) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/afm-products/tsconfig.json +3 -0
  4. package/dist/cjs/components/common/Emoji.js +141 -5
  5. package/dist/cjs/components/common/EmojiActions.compiled.css +8 -0
  6. package/dist/cjs/components/common/EmojiActions.js +69 -3
  7. package/dist/cjs/components/common/Popup.js +20 -5
  8. package/dist/cjs/components/common/ProductivityColorSelector.compiled.css +59 -0
  9. package/dist/cjs/components/common/ProductivityColorSelector.js +112 -0
  10. package/dist/cjs/components/common/ResourcedEmojiComponent.js +4 -1
  11. package/dist/cjs/components/common/TonePreviewButton.js +4 -2
  12. package/dist/cjs/components/i18n.js +10 -0
  13. package/dist/cjs/components/picker/EmojiPickerComponent.js +51 -36
  14. package/dist/cjs/components/picker/EmojiPickerList.js +36 -14
  15. package/dist/cjs/components/picker/VirtualList.js +4 -5
  16. package/dist/cjs/util/analytics/analytics.js +1 -1
  17. package/dist/cjs/util/hidden-emojis.js +33 -0
  18. package/dist/cjs/util/productivity-colors.js +51 -0
  19. package/dist/es2019/components/common/Emoji.js +115 -5
  20. package/dist/es2019/components/common/EmojiActions.compiled.css +8 -0
  21. package/dist/es2019/components/common/EmojiActions.js +67 -3
  22. package/dist/es2019/components/common/Popup.js +19 -5
  23. package/dist/es2019/components/common/ProductivityColorSelector.compiled.css +59 -0
  24. package/dist/es2019/components/common/ProductivityColorSelector.js +98 -0
  25. package/dist/es2019/components/common/ResourcedEmojiComponent.js +3 -1
  26. package/dist/es2019/components/common/TonePreviewButton.js +3 -2
  27. package/dist/es2019/components/i18n.js +10 -0
  28. package/dist/es2019/components/picker/EmojiPickerComponent.js +26 -14
  29. package/dist/es2019/components/picker/EmojiPickerList.js +32 -14
  30. package/dist/es2019/components/picker/VirtualList.js +4 -5
  31. package/dist/es2019/util/analytics/analytics.js +1 -1
  32. package/dist/es2019/util/hidden-emojis.js +25 -0
  33. package/dist/es2019/util/productivity-colors.js +37 -0
  34. package/dist/esm/components/common/Emoji.js +142 -6
  35. package/dist/esm/components/common/EmojiActions.compiled.css +8 -0
  36. package/dist/esm/components/common/EmojiActions.js +70 -4
  37. package/dist/esm/components/common/Popup.js +20 -5
  38. package/dist/esm/components/common/ProductivityColorSelector.compiled.css +59 -0
  39. package/dist/esm/components/common/ProductivityColorSelector.js +103 -0
  40. package/dist/esm/components/common/ResourcedEmojiComponent.js +4 -1
  41. package/dist/esm/components/common/TonePreviewButton.js +4 -2
  42. package/dist/esm/components/i18n.js +10 -0
  43. package/dist/esm/components/picker/EmojiPickerComponent.js +51 -36
  44. package/dist/esm/components/picker/EmojiPickerList.js +36 -14
  45. package/dist/esm/components/picker/VirtualList.js +4 -5
  46. package/dist/esm/util/analytics/analytics.js +1 -1
  47. package/dist/esm/util/hidden-emojis.js +27 -0
  48. package/dist/esm/util/productivity-colors.js +45 -0
  49. package/dist/types/components/common/Emoji.d.ts +5 -0
  50. package/dist/types/components/common/EmojiActions.d.ts +6 -0
  51. package/dist/types/components/common/Popup.d.ts +1 -0
  52. package/dist/types/components/common/ProductivityColorSelector.d.ts +17 -0
  53. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +6 -1
  54. package/dist/types/components/common/TonePreviewButton.d.ts +1 -0
  55. package/dist/types/components/i18n.d.ts +10 -0
  56. package/dist/types/components/picker/EmojiPickerList.d.ts +3 -0
  57. package/dist/types/types.d.ts +7 -0
  58. package/dist/types/util/hidden-emojis.d.ts +3 -0
  59. package/dist/types/util/productivity-colors.d.ts +8 -0
  60. package/package.json +3 -2
@@ -44,6 +44,8 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
44
44
  _ref$optimisticImageU = _ref.optimisticImageURL,
45
45
  optimisticImageURL = _ref$optimisticImageU === void 0 ? undefined : _ref$optimisticImageU,
46
46
  editorEmoji = _ref.editorEmoji,
47
+ _ref$renderUnicodeEmo = _ref.renderUnicodeEmojiAsImage,
48
+ renderUnicodeEmojiAsImage = _ref$renderUnicodeEmo === void 0 ? true : _ref$renderUnicodeEmo,
47
49
  _ref$pageTitleEmoji = _ref.pageTitleEmoji,
48
50
  pageTitleEmoji = _ref$pageTitleEmoji === void 0 ? false : _ref$pageTitleEmoji,
49
51
  placeholderXcss = _ref.placeholderXcss,
@@ -304,7 +306,8 @@ var ResourcedEmojiComponent = exports.ResourcedEmojiComponent = function Resourc
304
306
  showTooltip: showTooltip,
305
307
  fitToHeight: fitToHeight,
306
308
  autoWidth: autoWidth,
307
- editorEmoji: editorEmoji
309
+ editorEmoji: editorEmoji,
310
+ renderUnicodeEmojiAsImage: renderUnicodeEmojiAsImage
308
311
  })));
309
312
  };
310
313
  var _default = exports.default = ResourcedEmojiComponent;
@@ -22,6 +22,8 @@ var emojiButtonOutline = null;
22
22
  var TonePreviewButton = exports.TonePreviewButton = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
23
23
  var emoji = props.emoji,
24
24
  selectOnHover = props.selectOnHover,
25
+ _props$ariaControls = props.ariaControls,
26
+ ariaControls = _props$ariaControls === void 0 ? 'emoji-picker-tone-selector' : _props$ariaControls,
25
27
  ariaLabelText = props.ariaLabelText,
26
28
  ariaExpanded = props.ariaExpanded,
27
29
  onSelected = props.onSelected,
@@ -33,7 +35,7 @@ var TonePreviewButton = exports.TonePreviewButton = /*#__PURE__*/(0, _react.forw
33
35
  onClick: onSelected,
34
36
  "aria-label": ariaLabelText,
35
37
  "aria-expanded": ariaExpanded,
36
- "aria-controls": "emoji-picker-tone-selector"
38
+ "aria-controls": ariaControls
37
39
  // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
38
40
  ,
39
41
  style: {
@@ -53,7 +55,7 @@ var TonePreviewButton = exports.TonePreviewButton = /*#__PURE__*/(0, _react.forw
53
55
  onClick: onSelected,
54
56
  "aria-label": ariaLabelText,
55
57
  "aria-expanded": ariaExpanded,
56
- "aria-controls": "emoji-picker-tone-selector"
58
+ "aria-controls": ariaControls
57
59
  // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
58
60
  ,
59
61
  style: {
@@ -71,6 +71,16 @@ var messages = exports.messages = (0, _reactIntl.defineMessages)({
71
71
  defaultMessage: 'Choose your skin tone, {selectedTone} selected',
72
72
  description: 'Message indicating the purpose of the skin tone selection button and the selected tone'
73
73
  },
74
+ emojiSelectColorButtonAriaLabelText: {
75
+ id: 'fabric.emoji.select.color.ariaLabel',
76
+ defaultMessage: 'Productivity emoji color selector',
77
+ description: 'Message indicating the purpose of the color selection button and the selected color'
78
+ },
79
+ emojiSelectColorListAriaLabelText: {
80
+ id: 'fabric.emoji.select.color.list.ariaLabel',
81
+ defaultMessage: 'Productivity emoji colour selector',
82
+ description: 'Message indicating the purpose of the productivity emoji color list selector'
83
+ },
74
84
  emojiSelectSkinToneListAriaLabelText: {
75
85
  id: 'fabric.emoji.select.skin.list.ariaLabel',
76
86
  defaultMessage: 'Skin tone selector',
@@ -39,6 +39,8 @@ var _analytics = require("../../util/analytics");
39
39
  var _useEmoji2 = require("../../hooks/useEmoji");
40
40
  var _useIsMounted = require("../../hooks/useIsMounted");
41
41
  var _i18n = require("../i18n");
42
+ var _productivityColors = require("../../util/productivity-colors");
43
+ var _hiddenEmojis = require("../../util/hidden-emojis");
42
44
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
43
45
  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; }
44
46
  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; }
@@ -92,6 +94,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
92
94
  var _useEmoji = (0, _useEmoji2.useEmoji)(),
93
95
  emojiProvider = _useEmoji.emojiProvider,
94
96
  isUploadSupported = _useEmoji.isUploadSupported;
97
+ var isTeamojiExperimentEnabled = _featureGateJsClient.default.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
95
98
  var _useState = (0, _react.useState)([]),
96
99
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
97
100
  filteredEmojis = _useState2[0],
@@ -116,38 +119,42 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
116
119
  _useState10 = (0, _slicedToArray2.default)(_useState1, 2),
117
120
  selectedTone = _useState10[0],
118
121
  setSelectedTone = _useState10[1];
119
- var _useState11 = (0, _react.useState)(true),
122
+ var _useState11 = (0, _react.useState)(_productivityColors.defaultProductivityColor),
120
123
  _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
121
- loading = _useState12[0],
122
- setLoading = _useState12[1];
123
- var _useState13 = (0, _react.useState)(false),
124
+ selectedProductivityColor = _useState12[0],
125
+ setSelectedProductivityColor = _useState12[1];
126
+ var _useState13 = (0, _react.useState)(true),
124
127
  _useState14 = (0, _slicedToArray2.default)(_useState13, 2),
125
- uploading = _useState14[0],
126
- setUploading = _useState14[1];
127
- var _useState15 = (0, _react.useState)(),
128
+ loading = _useState14[0],
129
+ setLoading = _useState14[1];
130
+ var _useState15 = (0, _react.useState)(false),
128
131
  _useState16 = (0, _slicedToArray2.default)(_useState15, 2),
129
- selectedEmoji = _useState16[0],
130
- setSelectedEmoji = _useState16[1];
131
- var _useState17 = (0, _react.useState)(null),
132
+ uploading = _useState16[0],
133
+ setUploading = _useState16[1];
134
+ var _useState17 = (0, _react.useState)(),
132
135
  _useState18 = (0, _slicedToArray2.default)(_useState17, 2),
133
- activeCategory = _useState18[0],
134
- setActiveCategory = _useState18[1];
135
- var _useState19 = (0, _react.useState)(false),
136
+ selectedEmoji = _useState18[0],
137
+ setSelectedEmoji = _useState18[1];
138
+ var _useState19 = (0, _react.useState)(null),
136
139
  _useState20 = (0, _slicedToArray2.default)(_useState19, 2),
137
- disableCategories = _useState20[0],
138
- setDisableCategories = _useState20[1];
139
- var _useState21 = (0, _react.useState)(),
140
+ activeCategory = _useState20[0],
141
+ setActiveCategory = _useState20[1];
142
+ var _useState21 = (0, _react.useState)(false),
140
143
  _useState22 = (0, _slicedToArray2.default)(_useState21, 2),
141
- uploadErrorMessage = _useState22[0],
142
- setUploadErrorMessage = _useState22[1];
144
+ disableCategories = _useState22[0],
145
+ setDisableCategories = _useState22[1];
143
146
  var _useState23 = (0, _react.useState)(),
144
147
  _useState24 = (0, _slicedToArray2.default)(_useState23, 2),
145
- emojiToDelete = _useState24[0],
146
- setEmojiToDelete = _useState24[1];
148
+ uploadErrorMessage = _useState24[0],
149
+ setUploadErrorMessage = _useState24[1];
147
150
  var _useState25 = (0, _react.useState)(),
148
151
  _useState26 = (0, _slicedToArray2.default)(_useState25, 2),
149
- toneEmoji = _useState26[0],
150
- setToneEmoji = _useState26[1];
152
+ emojiToDelete = _useState26[0],
153
+ setEmojiToDelete = _useState26[1];
154
+ var _useState27 = (0, _react.useState)(),
155
+ _useState28 = (0, _slicedToArray2.default)(_useState27, 2),
156
+ toneEmoji = _useState28[0],
157
+ setToneEmoji = _useState28[1];
151
158
  var emojiPickerList = (0, _react.useMemo)(function () {
152
159
  return /*#__PURE__*/(0, _react.createRef)();
153
160
  }, []);
@@ -158,11 +165,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
158
165
  var isProgrammaticScroll = (0, _react.useRef)(false);
159
166
  var pickerRef = (0, _react.useRef)(null);
160
167
  var setPickerRef = (0, _react.useCallback)(function (el) {
161
- if (_featureGateJsClient.default.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false)) {
168
+ if (isTeamojiExperimentEnabled) {
162
169
  pickerRef.current = el;
163
170
  }
164
171
  onPickerRef === null || onPickerRef === void 0 || onPickerRef(el);
165
- }, [onPickerRef]);
172
+ }, [isTeamojiExperimentEnabled, onPickerRef]);
166
173
  var currentUser = (0, _react.useMemo)(function () {
167
174
  return emojiProvider.getCurrentUser();
168
175
  }, [emojiProvider]);
@@ -263,7 +270,8 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
263
270
  }, [filteredEmojis.length, getDynamicCategories, onDynamicCategoryChange, selectedEmoji]);
264
271
  var onFrequentEmojiResult = (0, _react.useCallback)(function (frequentEmoji) {
265
272
  // change the category of each of the featured emoji
266
- var recategorised = frequentEmoji.map(function (emoji) {
273
+ var visibleFrequentEmoji = isTeamojiExperimentEnabled ? (0, _hiddenEmojis.filterHiddenEmojis)(frequentEmoji) : frequentEmoji;
274
+ var recategorised = visibleFrequentEmoji.map(function (emoji) {
267
275
  var clone = JSON.parse(JSON.stringify(emoji));
268
276
  clone.category = _constants.frequentCategory;
269
277
  return clone;
@@ -271,10 +279,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
271
279
  setStateAfterEmojiChange({
272
280
  frequentEmoji: recategorised
273
281
  });
274
- }, [setStateAfterEmojiChange]);
282
+ }, [isTeamojiExperimentEnabled, setStateAfterEmojiChange]);
275
283
  var onSearchResult = (0, _react.useCallback)(function (searchResults) {
276
284
  var frequentlyUsedEmoji = frequentlyUsedEmojis || [];
277
285
  var searchQuery = searchResults.query || '';
286
+ var visibleSearchEmojis = isTeamojiExperimentEnabled ? (0, _hiddenEmojis.filterHiddenEmojis)(searchResults.emojis) : searchResults.emojis;
278
287
 
279
288
  /**
280
289
  * If there is no user search in the EmojiPicker then it should display all emoji received from the EmojiRepository and should
@@ -283,20 +292,20 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
283
292
  */
284
293
  var emojiToRender;
285
294
  if (!frequentlyUsedEmoji.length || query) {
286
- emojiToRender = searchResults.emojis;
295
+ emojiToRender = visibleSearchEmojis;
287
296
  } else {
288
- emojiToRender = [].concat((0, _toConsumableArray2.default)(searchResults.emojis), (0, _toConsumableArray2.default)(frequentlyUsedEmoji));
297
+ emojiToRender = [].concat((0, _toConsumableArray2.default)(visibleSearchEmojis), (0, _toConsumableArray2.default)(frequentlyUsedEmoji));
289
298
  }
290
299
  setStateAfterEmojiChange({
291
300
  searchQuery: searchQuery,
292
301
  emojiToRender: emojiToRender,
293
- searchEmoji: searchResults.emojis
302
+ searchEmoji: visibleSearchEmojis
294
303
  });
295
304
  fireAnalytics((0, _analytics.pickerSearchedEvent)({
296
305
  queryLength: searchQuery.length,
297
- numMatches: searchResults.emojis.length
306
+ numMatches: visibleSearchEmojis.length
298
307
  }));
299
- }, [frequentlyUsedEmojis, query, setStateAfterEmojiChange, fireAnalytics]);
308
+ }, [frequentlyUsedEmojis, isTeamojiExperimentEnabled, query, setStateAfterEmojiChange, fireAnalytics]);
300
309
  var onProviderChange = (0, _react.useMemo)(function () {
301
310
  return {
302
311
  result: onSearchResult
@@ -338,6 +347,9 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
338
347
  var onToneSelectorCancelled = (0, _react.useCallback)(function () {
339
348
  fireAnalytics((0, _analytics.toneSelectorClosedEvent)());
340
349
  }, [fireAnalytics]);
350
+ var onProductivityColorSelected = (0, _react.useCallback)(function (color) {
351
+ setSelectedProductivityColor(color);
352
+ }, []);
341
353
  var onSelectWrapper = (0, _react.useCallback)(function (emojiId, emoji, event) {
342
354
  if (onSelection) {
343
355
  onSelection(emojiId, emoji, event);
@@ -368,17 +380,18 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
368
380
  emojiProvider.findInCategory(categoryId).then(function (emojisInCategory) {
369
381
  if (!disableCategories) {
370
382
  var newSelectedEmoji;
371
- if (emojisInCategory && emojisInCategory.length > 0) {
372
- newSelectedEmoji = (0, _EmojiRepository.getEmojiVariation)(emojisInCategory[0], {
383
+ var visibleEmojisInCategory = isTeamojiExperimentEnabled ? (0, _hiddenEmojis.filterHiddenEmojis)(emojisInCategory || []) : emojisInCategory || [];
384
+ if (visibleEmojisInCategory.length > 0) {
385
+ newSelectedEmoji = (0, _EmojiRepository.getEmojiVariation)(visibleEmojisInCategory[0], {
373
386
  skinTone: selectedTone
374
387
  });
375
388
  }
376
389
  if (emojiPickerList.current) {
377
- if (_featureGateJsClient.default.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false)) {
390
+ if (isTeamojiExperimentEnabled) {
378
391
  isProgrammaticScroll.current = true;
379
392
  }
380
393
  emojiPickerList.current.reveal(categoryId);
381
- if (_featureGateJsClient.default.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false)) {
394
+ if (isTeamojiExperimentEnabled) {
382
395
  // Clear the flag after the scroll animation has settled.
383
396
  setTimeout(function () {
384
397
  isProgrammaticScroll.current = false;
@@ -394,7 +407,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
394
407
  }));
395
408
  }
396
409
  });
397
- }, [disableCategories, emojiPickerList, emojiProvider, fireAnalytics, selectedTone, uploading, emojiToDelete]);
410
+ }, [disableCategories, emojiPickerList, emojiProvider, fireAnalytics, isTeamojiExperimentEnabled, selectedTone, uploading, emojiToDelete]);
398
411
  var recordUsageOnSelection = (0, _react.useMemo)(function () {
399
412
  return (0, _RecordSelectionDefault.createRecordSelectionDefault)(emojiProvider, onSelectWrapper, function (analytic) {
400
413
  return fireAnalytics(analytic(_types.SearchSourceTypes.PICKER));
@@ -674,11 +687,13 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
674
687
  onSearch: onSearch,
675
688
  query: query,
676
689
  selectedTone: selectedTone,
690
+ selectedProductivityColor: isTeamojiExperimentEnabled ? selectedProductivityColor : undefined,
677
691
  loading: loading,
678
692
  ref: emojiPickerList,
679
693
  initialUploadName: query,
680
694
  onToneSelected: onToneSelected,
681
695
  onToneSelectorCancelled: onToneSelectorCancelled,
696
+ onProductivityColorSelected: isTeamojiExperimentEnabled ? onProductivityColorSelected : undefined,
682
697
  toneEmoji: toneEmoji,
683
698
  uploading: uploading,
684
699
  emojiToDelete: emojiToDelete,
@@ -12,6 +12,8 @@ var _reactIntl = require("react-intl");
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _featureGateJsClient = _interopRequireDefault(require("@atlaskit/feature-gate-js-client"));
14
14
  var _constants = require("../../util/constants");
15
+ var _productivityColors = require("../../util/productivity-colors");
16
+ var _hiddenEmojis = require("../../util/hidden-emojis");
15
17
  var _categories = require("./categories");
16
18
  var _CategoryTracker = _interopRequireDefault(require("./CategoryTracker"));
17
19
  var _EmojiPickerSizes = require("./EmojiPickerSizes");
@@ -79,7 +81,9 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
79
81
  onCloseDelete = props.onCloseDelete,
80
82
  onFileChooserClicked = props.onFileChooserClicked,
81
83
  onOpenUpload = props.onOpenUpload,
82
- activeCategoryId = props.activeCategoryId;
84
+ onProductivityColorSelected = props.onProductivityColorSelected,
85
+ activeCategoryId = props.activeCategoryId,
86
+ selectedProductivityColor = props.selectedProductivityColor;
83
87
  var _useIntl = (0, _reactIntl.useIntl)(),
84
88
  formatMessage = _useIntl.formatMessage;
85
89
  var listRef = (0, _react.useRef)(null);
@@ -103,6 +107,12 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
103
107
  categoriesChanged = _useState8[0],
104
108
  setCategoriesChanged = _useState8[1];
105
109
  var isTeamojiExperimentEnabled = _featureGateJsClient.default.getExperimentValue(teamojiRefreshExperimentName, 'isEnabled', false);
110
+ var visibleEmojis = (0, _react.useMemo)(function () {
111
+ return isTeamojiExperimentEnabled ? (0, _hiddenEmojis.filterHiddenEmojis)(emojis) : emojis;
112
+ }, [emojis, isTeamojiExperimentEnabled]);
113
+ var productivityColorPreviewEmojis = (0, _react.useMemo)(function () {
114
+ return isTeamojiExperimentEnabled ? (0, _productivityColors.getProductivityColorPreviewEmojis)(visibleEmojis) : {};
115
+ }, [isTeamojiExperimentEnabled, visibleEmojis]);
106
116
  var addToCategoryMap = (0, _react.useCallback)(function (categoryToGroupMap, emoji, category) {
107
117
  if (!categoryToGroupMap[category]) {
108
118
  var categoryDefinition = isTeamojiExperimentEnabled ? _categories.CategoryDescriptionMapNew[category] : _categories.CategoryDescriptionMap[category];
@@ -183,16 +193,23 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
183
193
  setAllEmojiGroups(Object.keys(categoryToGroupMap).map(function (key) {
184
194
  return categoryToGroupMap[key];
185
195
  }).map(function (group) {
186
- if (group.category !== _constants.frequentCategory) {
196
+ if (isTeamojiExperimentEnabled && selectedProductivityColor) {
187
197
  var _group$subcategories;
188
- group.emojis.sort(byOrder);
198
+ group.emojis = (0, _productivityColors.filterProductivityEmojisByColor)(group.emojis, selectedProductivityColor);
189
199
  (_group$subcategories = group.subcategories) === null || _group$subcategories === void 0 || _group$subcategories.forEach(function (subcategory) {
200
+ subcategory.emojis = (0, _productivityColors.filterProductivityEmojisByColor)(subcategory.emojis, selectedProductivityColor);
201
+ });
202
+ }
203
+ if (group.category !== _constants.frequentCategory) {
204
+ var _group$subcategories2;
205
+ group.emojis.sort(byOrder);
206
+ (_group$subcategories2 = group.subcategories) === null || _group$subcategories2 === void 0 || _group$subcategories2.forEach(function (subcategory) {
190
207
  subcategory.emojis.sort(byOrder);
191
208
  });
192
209
  }
193
210
  return group;
194
211
  }).sort(byOrder));
195
- }, [groupByCategory]);
212
+ }, [groupByCategory, isTeamojiExperimentEnabled, selectedProductivityColor]);
196
213
  var buildEmojiRows = (0, _react.useCallback)(function (items, category, title, emojis, showDelete) {
197
214
  var remainingEmojis = emojis;
198
215
  while (remainingEmojis.length > 0) {
@@ -212,9 +229,9 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
212
229
  }
213
230
  }, [isTeamojiExperimentEnabled, onEmojiActive, onEmojiDelete, onEmojiLeave, onEmojiSelected]);
214
231
  var buildVirtualItemFromGroup = (0, _react.useCallback)(function (group) {
215
- var _group$subcategories2;
232
+ var _group$subcategories3;
216
233
  var items = [];
217
- var hasAtlassianSubcategories = isTeamojiExperimentEnabled && group.category === atlassianCategory && !!((_group$subcategories2 = group.subcategories) !== null && _group$subcategories2 !== void 0 && _group$subcategories2.length);
234
+ var hasAtlassianSubcategories = isTeamojiExperimentEnabled && group.category === atlassianCategory && !!((_group$subcategories3 = group.subcategories) !== null && _group$subcategories3 !== void 0 && _group$subcategories3.length);
218
235
  if (!hasAtlassianSubcategories) {
219
236
  items.push(new _EmojiPickerVirtualItems.CategoryHeadingItem({
220
237
  id: group.category,
@@ -259,7 +276,7 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
259
276
  } else {
260
277
  if (query) {
261
278
  var search = isTeamojiExperimentEnabled ? _categories.CategoryDescriptionMapNew.SEARCH : _categories.CategoryDescriptionMap.SEARCH;
262
- if (emojis.length === 0 && isTeamojiExperimentEnabled) {
279
+ if (visibleEmojis.length === 0 && isTeamojiExperimentEnabled) {
263
280
  // Show a "No results" category heading, then a no-results illustration below it
264
281
  items.push(new _EmojiPickerVirtualItems.CategoryHeadingItem({
265
282
  id: _constants.searchCategory,
@@ -275,7 +292,7 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
275
292
  items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(buildVirtualItemFromGroup({
276
293
  category: _constants.searchCategory,
277
294
  title: search.name,
278
- emojis: emojis,
295
+ emojis: visibleEmojis,
279
296
  order: search.order
280
297
  })));
281
298
  }
@@ -303,7 +320,7 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
303
320
  }
304
321
  }
305
322
  // eslint-disable-next-line react-hooks/exhaustive-deps
306
- }, [allEmojiGroups, buildVirtualItemFromGroup, emojis, formatMessage, isTeamojiExperimentEnabled, loading, onOpenUpload, query, uploadEnabled]);
323
+ }, [allEmojiGroups, buildVirtualItemFromGroup, formatMessage, isTeamojiExperimentEnabled, loading, onOpenUpload, query, uploadEnabled, visibleEmojis]);
307
324
  var findCategoryToActivate = function findCategoryToActivate(row) {
308
325
  var category = null;
309
326
  if (row instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
@@ -398,9 +415,9 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
398
415
  });
399
416
  (0, _react.useEffect)(function () {
400
417
  if (!query) {
401
- buildEmojiGroupedByCategory(emojis, currentUser);
418
+ buildEmojiGroupedByCategory(visibleEmojis, currentUser);
402
419
  }
403
- }, [emojis, selectedTone, loading, query, currentUser, buildEmojiGroupedByCategory]);
420
+ }, [visibleEmojis, selectedTone, selectedProductivityColor, loading, query, currentUser, buildEmojiGroupedByCategory]);
404
421
  (0, _react.useEffect)(function () {
405
422
  buildVirtualItems();
406
423
  }, [allEmojiGroups, buildVirtualItems]);
@@ -409,16 +426,17 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
409
426
  onRowsRendered({
410
427
  startIndex: 0
411
428
  });
429
+ setCategoriesChanged(false);
412
430
  }
413
431
  // eslint-disable-next-line react-hooks/exhaustive-deps
414
432
  }, [virtualItems, categoriesChanged]);
415
433
  var virtualListHeight = (0, _react.useMemo)(function () {
416
- if (query && emojis.length === 0 && isTeamojiExperimentEnabled) {
434
+ if (query && visibleEmojis.length === 0 && isTeamojiExperimentEnabled) {
417
435
  // No-results state: expand the list height to fit heading + illustration without scrolling
418
436
  return _EmojiPickerSizes.sizes.categoryHeadingHeight + _EmojiPickerSizes.sizes.noResultsHeight + (0, _utils.emojiPickerHeightOffset)(size);
419
437
  }
420
438
  return isTeamojiExperimentEnabled ? _EmojiPickerSizes.sizes.listHeightNew + (0, _utils.emojiPickerHeightOffset)(size) : _EmojiPickerSizes.sizes.listHeight + (0, _utils.emojiPickerHeightOffset)(size);
421
- }, [size, query, emojis.length, isTeamojiExperimentEnabled]);
439
+ }, [size, query, visibleEmojis.length, isTeamojiExperimentEnabled]);
422
440
  return /*#__PURE__*/_react.default.createElement(_EmojiPickerTabPanel.default, {
423
441
  showSearchResults: !!query
424
442
  }, /*#__PURE__*/_react.default.createElement(_EmojiActions.default, {
@@ -426,6 +444,9 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
426
444
  onToneSelected: onToneSelected,
427
445
  onToneSelectorCancelled: onToneSelectorCancelled,
428
446
  toneEmoji: toneEmoji,
447
+ activeCategoryId: isTeamojiExperimentEnabled ? activeCategoryId : undefined,
448
+ productivityColorPreviewEmojis: isTeamojiExperimentEnabled ? productivityColorPreviewEmojis : undefined,
449
+ selectedProductivityColor: isTeamojiExperimentEnabled ? selectedProductivityColor : undefined,
429
450
  uploading: uploading,
430
451
  uploadEnabled: uploadEnabled,
431
452
  emojiToDelete: emojiToDelete,
@@ -437,9 +458,10 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
437
458
  onDeleteEmoji: onDeleteEmoji,
438
459
  onFileChooserClicked: onFileChooserClicked,
439
460
  onOpenUpload: onOpenUpload,
461
+ onProductivityColorSelected: isTeamojiExperimentEnabled ? onProductivityColorSelected : undefined,
440
462
  query: query,
441
463
  onChange: onSearch,
442
- resultsCount: emojis.length
464
+ resultsCount: visibleEmojis.length
443
465
  }), /*#__PURE__*/_react.default.createElement(_EmojiPickerListContext.EmojiPickerListContextProvider, {
444
466
  initialEmojisFocus: {
445
467
  rowIndex: 1,
@@ -14,6 +14,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
  var _reactVirtual = require("@tanstack/react-virtual");
16
16
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
17
+ var _featureGateJsClient = _interopRequireDefault(require("@atlaskit/feature-gate-js-client"));
17
18
  var _useEmojiPickerListContext = require("../../hooks/useEmojiPickerListContext");
18
19
  var _constants = require("../../util/constants");
19
20
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
@@ -64,13 +65,11 @@ var VirtualList = exports.VirtualList = /*#__PURE__*/_react.default.forwardRef(f
64
65
  var elemBottom = elementRect.bottom;
65
66
  var parentTop = parentRect.top;
66
67
  var parentBottom = parentRect.bottom;
67
-
68
- // Only completely visible elements return true:
69
- var isVisible = elemTop >= parentTop && elemBottom <= parentBottom;
68
+ var isVisible = _featureGateJsClient.default.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false) ? elemTop >= parentTop && elemBottom <= parentBottom : elemBottom > parentTop && elemTop < parentBottom;
70
69
  return isVisible;
71
70
  };
72
71
  var getFirstVisibleListElementIndex = (0, _react.useCallback)(function () {
73
- var _parentRef$current;
72
+ var _parentRef$current, _virtualList$;
74
73
  var virtualList = rowVirtualizer.getVirtualItems();
75
74
  var renderedElements = (_parentRef$current = parentRef.current) === null || _parentRef$current === void 0 || (_parentRef$current = _parentRef$current.firstChild) === null || _parentRef$current === void 0 ? void 0 : _parentRef$current.childNodes;
76
75
  if (virtualList.length === 0 || !renderedElements || renderedElements.length === 0) {
@@ -85,7 +84,7 @@ var VirtualList = exports.VirtualList = /*#__PURE__*/_react.default.forwardRef(f
85
84
  var _virtualList$firstVis;
86
85
  return ((_virtualList$firstVis = virtualList[firstVisibleIndex]) === null || _virtualList$firstVis === void 0 ? void 0 : _virtualList$firstVis.index) || 0;
87
86
  }
88
- return 0;
87
+ return _featureGateJsClient.default.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false) ? ((_virtualList$ = virtualList[0]) === null || _virtualList$ === void 0 ? void 0 : _virtualList$.index) || 0 : 0;
89
88
  }, [rowVirtualizer]);
90
89
 
91
90
  /**
@@ -20,7 +20,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
20
20
  actionSubjectId: actionSubjectId,
21
21
  attributes: _objectSpread({
22
22
  packageName: "@atlaskit/emoji",
23
- packageVersion: "70.17.10"
23
+ packageVersion: "71.0.1"
24
24
  }, attributes)
25
25
  };
26
26
  };
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isHiddenEmoji = exports.filterHiddenEmojis = void 0;
7
+ var hasHiddenTag = function hasHiddenTag(tags) {
8
+ var _tags$includes;
9
+ return (_tags$includes = tags === null || tags === void 0 ? void 0 : tags.includes('hidden')) !== null && _tags$includes !== void 0 ? _tags$includes : false;
10
+ };
11
+ var hasHiddenMetadataTag = function hasHiddenMetadataTag(emoji) {
12
+ var emojiWithMetadata = emoji;
13
+ var metadata = emojiWithMetadata.metadata;
14
+ if (typeof metadata === 'string') {
15
+ return metadata === 'hidden';
16
+ }
17
+ if (Array.isArray(metadata)) {
18
+ return hasHiddenTag(metadata);
19
+ }
20
+ return hasHiddenTag(metadata === null || metadata === void 0 ? void 0 : metadata.tags) || hasHiddenTag(emojiWithMetadata.tags);
21
+ };
22
+ var isHiddenEmoji = exports.isHiddenEmoji = function isHiddenEmoji(emoji) {
23
+ var emojiWithMetadata = emoji;
24
+ if (emojiWithMetadata.hidden) {
25
+ return true;
26
+ }
27
+ return hasHiddenMetadataTag(emoji);
28
+ };
29
+ var filterHiddenEmojis = exports.filterHiddenEmojis = function filterHiddenEmojis(emojis) {
30
+ return emojis.filter(function (emoji) {
31
+ return !isHiddenEmoji(emoji);
32
+ });
33
+ };
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.productivityColors = exports.isProductivityNumberEmoji = exports.getProductivityColorPreviewEmojis = exports.getProductivityColor = exports.filterProductivityEmojisByColor = exports.defaultProductivityColor = void 0;
7
+ var productivityColors = exports.productivityColors = ['gray', 'magenta', 'purple', 'blue', 'teal', 'green', 'lime', 'yellow', 'orange', 'red'];
8
+ var productivityColorSet = new Set(productivityColors);
9
+ var zeroSquareVariantParent = '0_zero_square_blue';
10
+ var defaultProductivityColor = exports.defaultProductivityColor = 'blue';
11
+ var getProductivityVariant = function getProductivityVariant(emoji) {
12
+ if (emoji.type !== 'ATLASSIAN' || !emoji.color || !productivityColorSet.has(emoji.color)) {
13
+ return undefined;
14
+ }
15
+ return {
16
+ color: emoji.color
17
+ };
18
+ };
19
+ var getProductivityColor = exports.getProductivityColor = function getProductivityColor(emoji) {
20
+ var _getProductivityVaria;
21
+ return (_getProductivityVaria = getProductivityVariant(emoji)) === null || _getProductivityVaria === void 0 ? void 0 : _getProductivityVaria.color;
22
+ };
23
+ var isProductivityNumberEmoji = exports.isProductivityNumberEmoji = function isProductivityNumberEmoji(emoji) {
24
+ return getProductivityColor(emoji) !== undefined;
25
+ };
26
+ var filterProductivityEmojisByColor = exports.filterProductivityEmojisByColor = function filterProductivityEmojisByColor(emojis, selectedColor) {
27
+ return emojis.filter(function (emoji) {
28
+ var variant = getProductivityVariant(emoji);
29
+ return !variant || variant.color === selectedColor;
30
+ });
31
+ };
32
+ var isZeroSquareProductivityEmoji = function isZeroSquareProductivityEmoji(emoji) {
33
+ var _emoji$variantChildre, _emoji$keywords, _emoji$variantChildre2;
34
+ return emoji.variantParent === zeroSquareVariantParent || ((_emoji$variantChildre = emoji.variantChildren) === null || _emoji$variantChildre === void 0 ? void 0 : _emoji$variantChildre.some(function (variantChild) {
35
+ return variantChild.includes('0_zero_square_');
36
+ })) || !!(emoji.variantBase && (_emoji$keywords = emoji.keywords) !== null && _emoji$keywords !== void 0 && _emoji$keywords.includes('0') && (_emoji$variantChildre2 = emoji.variantChildren) !== null && _emoji$variantChildre2 !== void 0 && _emoji$variantChildre2.some(function (variantChild) {
37
+ return variantChild.includes('_square_');
38
+ }));
39
+ };
40
+ var getProductivityColorPreviewEmojis = exports.getProductivityColorPreviewEmojis = function getProductivityColorPreviewEmojis(emojis) {
41
+ return emojis.reduce(function (previewEmojis, emoji) {
42
+ var color = getProductivityColor(emoji);
43
+ if (!color) {
44
+ return previewEmojis;
45
+ }
46
+ if (isZeroSquareProductivityEmoji(emoji) || !previewEmojis[color]) {
47
+ previewEmojis[color] = emoji;
48
+ }
49
+ return previewEmojis;
50
+ }, {});
51
+ };