@atlaskit/emoji 70.11.1 → 70.11.2
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.
- package/CHANGELOG.md +7 -0
- package/afm-cc/tsconfig.json +3 -0
- package/afm-products/tsconfig.json +3 -0
- package/dist/cjs/components/i18n.js +10 -0
- package/dist/cjs/components/picker/EmojiPickerComponent.compiled.css +3 -0
- package/dist/cjs/components/picker/EmojiPickerComponent.js +20 -6
- package/dist/cjs/components/picker/EmojiPickerList.js +31 -10
- package/dist/cjs/components/picker/EmojiPickerNoResults.compiled.css +12 -0
- package/dist/cjs/components/picker/EmojiPickerNoResults.js +50 -0
- package/dist/cjs/components/picker/EmojiPickerSizes.js +2 -0
- package/dist/cjs/components/picker/EmojiPickerVirtualItems.js +15 -1
- package/dist/cjs/util/analytics/analytics.js +1 -1
- package/dist/es2019/components/i18n.js +10 -0
- package/dist/es2019/components/picker/EmojiPickerComponent.compiled.css +3 -0
- package/dist/es2019/components/picker/EmojiPickerComponent.js +20 -6
- package/dist/es2019/components/picker/EmojiPickerList.js +33 -11
- package/dist/es2019/components/picker/EmojiPickerNoResults.compiled.css +12 -0
- package/dist/es2019/components/picker/EmojiPickerNoResults.js +40 -0
- package/dist/es2019/components/picker/EmojiPickerSizes.js +2 -0
- package/dist/es2019/components/picker/EmojiPickerVirtualItems.js +7 -0
- package/dist/es2019/util/analytics/analytics.js +1 -1
- package/dist/esm/components/i18n.js +10 -0
- package/dist/esm/components/picker/EmojiPickerComponent.compiled.css +3 -0
- package/dist/esm/components/picker/EmojiPickerComponent.js +20 -6
- package/dist/esm/components/picker/EmojiPickerList.js +32 -11
- package/dist/esm/components/picker/EmojiPickerNoResults.compiled.css +12 -0
- package/dist/esm/components/picker/EmojiPickerNoResults.js +41 -0
- package/dist/esm/components/picker/EmojiPickerSizes.js +2 -0
- package/dist/esm/components/picker/EmojiPickerVirtualItems.js +14 -0
- package/dist/esm/util/analytics/analytics.js +1 -1
- package/dist/types/components/i18n.d.ts +10 -0
- package/dist/types/components/picker/EmojiPickerNoResults.d.ts +7 -0
- package/dist/types/components/picker/EmojiPickerSizes.d.ts +1 -0
- package/dist/types/components/picker/EmojiPickerVirtualItems.d.ts +6 -1
- package/dist/types-ts4.5/components/i18n.d.ts +10 -0
- package/dist/types-ts4.5/components/picker/EmojiPickerNoResults.d.ts +7 -0
- package/dist/types-ts4.5/components/picker/EmojiPickerSizes.d.ts +1 -0
- package/dist/types-ts4.5/components/picker/EmojiPickerVirtualItems.d.ts +6 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @atlaskit/emoji
|
|
2
2
|
|
|
3
|
+
## 70.11.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`73c9a0824c93e`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/73c9a0824c93e) -
|
|
8
|
+
Add a new empty state for no results in emoji picker
|
|
9
|
+
|
|
3
10
|
## 70.11.1
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
package/afm-cc/tsconfig.json
CHANGED
|
@@ -231,6 +231,16 @@ var messages = exports.messages = (0, _reactIntl.defineMessages)({
|
|
|
231
231
|
defaultMessage: 'An emoji with this name exists already',
|
|
232
232
|
description: 'Error message shown when the user tries to upload an emoji with a name that already exists in the custom emoji set'
|
|
233
233
|
},
|
|
234
|
+
emojiPickerNoResults: {
|
|
235
|
+
id: 'fabric.emoji.picker.no.results',
|
|
236
|
+
defaultMessage: 'No results',
|
|
237
|
+
description: 'Heading shown in the emoji picker when a search query returns no matching emojis.'
|
|
238
|
+
},
|
|
239
|
+
emojiPickerAddCustomEmoji: {
|
|
240
|
+
id: 'fabric.emoji.picker.add.custom.emoji',
|
|
241
|
+
defaultMessage: 'Add custom emoji',
|
|
242
|
+
description: 'Label for the button shown in the emoji picker no-results screen that opens the custom emoji upload panel.'
|
|
243
|
+
},
|
|
234
244
|
emojiPickerTitle: {
|
|
235
245
|
id: 'fabric.emoji.picker',
|
|
236
246
|
defaultMessage: 'Emoji picker',
|
|
@@ -21,13 +21,16 @@
|
|
|
21
21
|
._1xi2idpf{right:0}
|
|
22
22
|
._2lx21bp4{flex-direction:column}
|
|
23
23
|
._4t3i1784{height:470px}
|
|
24
|
+
._4t3i19lm{height:514px}
|
|
24
25
|
._4t3i1ckg{height:455px}
|
|
25
26
|
._4t3i1dsu{height:419px}
|
|
27
|
+
._4t3i1j8x{height:354px}
|
|
26
28
|
._4t3i1sa4{height:390px}
|
|
27
29
|
._4t3i2300{height:429px}
|
|
28
30
|
._4t3i50k7{height:499px}
|
|
29
31
|
._4t3iaq3k{height:295px}
|
|
30
32
|
._4t3ibqjm{height:310px}
|
|
33
|
+
._4t3iihnn{height:434px}
|
|
31
34
|
._4t3iixjv{height:375px}
|
|
32
35
|
._4t3iqbeb{height:339px}
|
|
33
36
|
._4t3iuxo9{height:var(--_19dn98e)}
|
|
@@ -76,6 +76,12 @@ var withoutPreviewHeight = {
|
|
|
76
76
|
medium: "_4t3iixjv _1tke5x59",
|
|
77
77
|
large: "_4t3i1ckg _1tke1pna"
|
|
78
78
|
};
|
|
79
|
+
var emojiPickerHeightNoResults = 354;
|
|
80
|
+
var withNoResultsRefreshHeight = {
|
|
81
|
+
small: "_4t3i1j8x _1tkegx0z",
|
|
82
|
+
medium: "_4t3iihnn _1tke5x59",
|
|
83
|
+
large: "_4t3i19lm _1tke1pna"
|
|
84
|
+
};
|
|
79
85
|
var FREQUENTLY_USED_MAX = 16;
|
|
80
86
|
var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
81
87
|
var onSelection = _ref.onSelection,
|
|
@@ -150,6 +156,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
150
156
|
}, []);
|
|
151
157
|
var openTime = (0, _react.useRef)(0);
|
|
152
158
|
var isMounting = (0, _react.useRef)(true);
|
|
159
|
+
var lastNonSearchCategory = (0, _react.useRef)(activeCategory);
|
|
153
160
|
var previousEmojiProvider = (0, _react.useRef)(emojiProvider);
|
|
154
161
|
var isProgrammaticScroll = (0, _react.useRef)(false);
|
|
155
162
|
var pickerRef = (0, _react.useRef)(null);
|
|
@@ -191,8 +198,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
191
198
|
}
|
|
192
199
|
if (activeCategory !== category) {
|
|
193
200
|
setActiveCategory(category);
|
|
201
|
+
if (!query && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
|
|
202
|
+
lastNonSearchCategory.current = category;
|
|
203
|
+
}
|
|
194
204
|
}
|
|
195
|
-
}, [activeCategory, uploading, emojiToDelete]);
|
|
205
|
+
}, [activeCategory, uploading, emojiToDelete, query]);
|
|
196
206
|
var calculateElapsedTime = function calculateElapsedTime() {
|
|
197
207
|
return Date.now() - openTime.current;
|
|
198
208
|
};
|
|
@@ -409,6 +419,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
409
419
|
source: _types.SearchSourceTypes.PICKER
|
|
410
420
|
};
|
|
411
421
|
if (searchQuery !== query) {
|
|
422
|
+
// Capture the active category before entering search so we can keep it highlighted
|
|
423
|
+
if (!query && searchQuery && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
|
|
424
|
+
lastNonSearchCategory.current = activeCategory;
|
|
425
|
+
}
|
|
412
426
|
setQuery(searchQuery);
|
|
413
427
|
}
|
|
414
428
|
updateEmojis(searchQuery, options);
|
|
@@ -416,7 +430,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
416
430
|
// scroll to top when search, which is search results section
|
|
417
431
|
scrollToTopOfList();
|
|
418
432
|
}
|
|
419
|
-
}, [query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
|
|
433
|
+
}, [activeCategory, query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
|
|
420
434
|
|
|
421
435
|
// When the upload screen is open, intercept any file drag at the window level so it
|
|
422
436
|
// cannot reach underlying page drop handlers (e.g. the Confluence editor).
|
|
@@ -637,7 +651,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
637
651
|
role: "dialog",
|
|
638
652
|
"aria-label": formatMessage(_i18n.messages.emojiPickerTitle),
|
|
639
653
|
"aria-modal": true,
|
|
640
|
-
className: (0, _runtime.ax)([(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
|
|
654
|
+
className: (0, _runtime.ax)([(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
|
|
641
655
|
style: {
|
|
642
656
|
"--_19dn98e": (0, _runtime.ix)("".concat(emojiPickerHeight, "px")),
|
|
643
657
|
"--_gsvyy7": (0, _runtime.ix)("".concat(emojiPickerWidth, "px"))
|
|
@@ -682,7 +696,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
682
696
|
onOpenUpload: onOpenUpload,
|
|
683
697
|
size: size,
|
|
684
698
|
activeCategoryId: activeCategory
|
|
685
|
-
}), showPreview && !(emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(_EmojiPickerFooter.default, {
|
|
699
|
+
}), showPreview && !(emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(_EmojiPickerFooter.default, {
|
|
686
700
|
selectedEmoji: selectedEmoji,
|
|
687
701
|
uploadEnabled: isUploadSupported && !uploading,
|
|
688
702
|
onOpenUpload: onOpenUpload
|
|
@@ -697,7 +711,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
697
711
|
onKeyPress: suppressKeyPress,
|
|
698
712
|
onKeyUp: suppressKeyPress,
|
|
699
713
|
onKeyDown: suppressKeyPress,
|
|
700
|
-
className: (0, _runtime.ax)([(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
|
|
714
|
+
className: (0, _runtime.ax)([(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
|
|
701
715
|
style: {
|
|
702
716
|
"--_19dn98e": (0, _runtime.ix)("".concat(emojiPickerHeight, "px")),
|
|
703
717
|
"--_gsvyy7": (0, _runtime.ix)("".concat(emojiPickerWidth, "px"))
|
|
@@ -736,7 +750,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
736
750
|
onOpenUpload: onOpenUpload,
|
|
737
751
|
size: size,
|
|
738
752
|
activeCategoryId: activeCategory
|
|
739
|
-
}), showPreview && !(emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(_EmojiPickerFooter.default, {
|
|
753
|
+
}), showPreview && !(emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(_EmojiPickerFooter.default, {
|
|
740
754
|
selectedEmoji: selectedEmoji,
|
|
741
755
|
uploadEnabled: isUploadSupported && !uploading,
|
|
742
756
|
onOpenUpload: onOpenUpload
|
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.RENDER_EMOJI_PICKER_LIST_TESTID = exports.EmojiPickerVirtualListInternal = void 0;
|
|
9
9
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
10
10
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
var _reactIntl = require("react-intl");
|
|
11
12
|
var _react = _interopRequireWildcard(require("react"));
|
|
12
13
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
13
14
|
var _constants = require("../../util/constants");
|
|
@@ -20,6 +21,7 @@ var _utils = require("./utils");
|
|
|
20
21
|
var _VirtualList = require("./VirtualList");
|
|
21
22
|
var _EmojiPickerListContext = require("../../context/EmojiPickerListContext");
|
|
22
23
|
var _EmojiPickerTabPanel = _interopRequireDefault(require("./EmojiPickerTabPanel"));
|
|
24
|
+
var _i18n = require("../i18n");
|
|
23
25
|
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); }
|
|
24
26
|
/**
|
|
25
27
|
* Test id for wrapper Emoji Picker List div
|
|
@@ -68,6 +70,8 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
|
|
|
68
70
|
onFileChooserClicked = props.onFileChooserClicked,
|
|
69
71
|
onOpenUpload = props.onOpenUpload,
|
|
70
72
|
activeCategoryId = props.activeCategoryId;
|
|
73
|
+
var _useIntl = (0, _reactIntl.useIntl)(),
|
|
74
|
+
formatMessage = _useIntl.formatMessage;
|
|
71
75
|
var listRef = (0, _react.useRef)(null);
|
|
72
76
|
var _useState = (0, _react.useState)([]),
|
|
73
77
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
@@ -185,14 +189,27 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
|
|
|
185
189
|
items.push(new _EmojiPickerVirtualItems.LoadingItem());
|
|
186
190
|
} else {
|
|
187
191
|
if (query) {
|
|
188
|
-
var search = _categories.CategoryDescriptionMap.SEARCH;
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
192
|
+
var search = (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? _categories.CategoryDescriptionMapNew.SEARCH : _categories.CategoryDescriptionMap.SEARCH;
|
|
193
|
+
if (emojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
|
|
194
|
+
// Show a "No results" category heading, then a no-results illustration below it
|
|
195
|
+
items.push(new _EmojiPickerVirtualItems.CategoryHeadingItem({
|
|
196
|
+
id: _constants.searchCategory,
|
|
197
|
+
title: formatMessage(_i18n.messages.emojiPickerNoResults),
|
|
198
|
+
className: categoryClassname
|
|
199
|
+
}));
|
|
200
|
+
items.push(new _EmojiPickerVirtualItems.NoResultsItem({
|
|
201
|
+
onOpenUpload: onOpenUpload,
|
|
202
|
+
uploadEnabled: uploadEnabled
|
|
203
|
+
}));
|
|
204
|
+
} else {
|
|
205
|
+
// Only a single "result" category
|
|
206
|
+
items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(buildVirtualItemFromGroup({
|
|
207
|
+
category: _constants.searchCategory,
|
|
208
|
+
title: search.name,
|
|
209
|
+
emojis: emojis,
|
|
210
|
+
order: search.order
|
|
211
|
+
})));
|
|
212
|
+
}
|
|
196
213
|
} else {
|
|
197
214
|
// Group by category
|
|
198
215
|
|
|
@@ -217,7 +234,7 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
|
|
|
217
234
|
}
|
|
218
235
|
}
|
|
219
236
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
220
|
-
}, [allEmojiGroups, loading, query, emojis]);
|
|
237
|
+
}, [allEmojiGroups, loading, query, emojis, onOpenUpload, uploadEnabled, formatMessage]);
|
|
221
238
|
var findCategoryToActivate = function findCategoryToActivate(row) {
|
|
222
239
|
var category = null;
|
|
223
240
|
if (row instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
|
|
@@ -327,8 +344,12 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
|
|
|
327
344
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
328
345
|
}, [virtualItems, categoriesChanged]);
|
|
329
346
|
var virtualListHeight = (0, _react.useMemo)(function () {
|
|
347
|
+
if (query && emojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
|
|
348
|
+
// No-results state: expand the list height to fit heading + illustration without scrolling
|
|
349
|
+
return _EmojiPickerSizes.sizes.categoryHeadingHeight + _EmojiPickerSizes.sizes.noResultsHeight + (0, _utils.emojiPickerHeightOffset)(size);
|
|
350
|
+
}
|
|
330
351
|
return (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? _EmojiPickerSizes.sizes.listHeightNew + (0, _utils.emojiPickerHeightOffset)(size) : _EmojiPickerSizes.sizes.listHeight + (0, _utils.emojiPickerHeightOffset)(size);
|
|
331
|
-
}, [size]);
|
|
352
|
+
}, [size, query, emojis.length]);
|
|
332
353
|
return /*#__PURE__*/_react.default.createElement(_EmojiPickerTabPanel.default, {
|
|
333
354
|
showSearchResults: !!query
|
|
334
355
|
}, /*#__PURE__*/_react.default.createElement(_EmojiActions.default, {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
._zulppxbi{gap:var(--ds-space-200,1pc)}._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
|
|
3
|
+
._1bah1h6o{justify-content:center}
|
|
4
|
+
._1bsb1osq{width:100%}
|
|
5
|
+
._1e0c1txw{display:flex}
|
|
6
|
+
._2lx21bp4{flex-direction:column}
|
|
7
|
+
._4cvr1h6o{align-items:center}
|
|
8
|
+
._ca0q1ejb{padding-top:var(--ds-space-300,24px)}
|
|
9
|
+
._n3td1ejb{padding-bottom:var(--ds-space-300,24px)}
|
|
10
|
+
._u5f3pxbi{padding-right:var(--ds-space-200,1pc)}
|
|
11
|
+
._vchhusvi{box-sizing:border-box}
|
|
12
|
+
._y3gn1h6o{text-align:center}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/* EmojiPickerNoResults.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
Object.defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
exports.default = exports.RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = void 0;
|
|
10
|
+
require("./EmojiPickerNoResults.compiled.css");
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var React = _react;
|
|
13
|
+
var _runtime = require("@compiled/react/runtime");
|
|
14
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
15
|
+
var _reactIntl = require("react-intl");
|
|
16
|
+
var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
|
|
17
|
+
var _image = _interopRequireDefault(require("@atlaskit/image"));
|
|
18
|
+
var _i18n = require("../i18n");
|
|
19
|
+
var _dark = _interopRequireDefault(require("./assets/spot/search-no-result/dark.svg"));
|
|
20
|
+
var _light = _interopRequireDefault(require("./assets/spot/search-no-result/light.svg"));
|
|
21
|
+
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); }
|
|
22
|
+
var noResultsContainer = null;
|
|
23
|
+
var RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = exports.RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = 'render-emoji-picker-no-results';
|
|
24
|
+
var EmojiPickerNoResults = function EmojiPickerNoResults(_ref) {
|
|
25
|
+
var onOpenUpload = _ref.onOpenUpload,
|
|
26
|
+
uploadEnabled = _ref.uploadEnabled;
|
|
27
|
+
var handleOpenUpload = (0, _react.useCallback)(function (event) {
|
|
28
|
+
if ((0, _platformFeatureFlags.fg)('platform_emoji_keep_picker_open_on_upload')) {
|
|
29
|
+
event.preventDefault();
|
|
30
|
+
event.stopPropagation();
|
|
31
|
+
}
|
|
32
|
+
onOpenUpload();
|
|
33
|
+
}, [onOpenUpload]);
|
|
34
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
35
|
+
"data-testid": RENDER_EMOJI_PICKER_NO_RESULTS_TESTID,
|
|
36
|
+
className: (0, _runtime.ax)(["_zulppxbi _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _ca0q1ejb _u5f3pxbi _n3td1ejb _19bvpxbi _y3gn1h6o _1bsb1osq _vchhusvi"])
|
|
37
|
+
}, /*#__PURE__*/React.createElement(_image.default, {
|
|
38
|
+
src: _light.default,
|
|
39
|
+
srcDark: _dark.default,
|
|
40
|
+
alt: "",
|
|
41
|
+
width: 200
|
|
42
|
+
}), uploadEnabled && /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _i18n.messages.emojiPickerAddCustomEmoji, function (label) {
|
|
43
|
+
return /*#__PURE__*/React.createElement(_standardButton.default, {
|
|
44
|
+
onClick: handleOpenUpload,
|
|
45
|
+
appearance: "default",
|
|
46
|
+
tabIndex: 0
|
|
47
|
+
}, label);
|
|
48
|
+
}));
|
|
49
|
+
};
|
|
50
|
+
var _default = exports.default = EmojiPickerNoResults;
|
|
@@ -19,6 +19,8 @@ var sizes = exports.sizes = {
|
|
|
19
19
|
// 32px height
|
|
20
20
|
loadingRowHeight: 150,
|
|
21
21
|
// Fills remaining space without scrolling when loading.
|
|
22
|
+
noResultsHeight: 300,
|
|
23
|
+
// illustration (200px) + button + padding + gap
|
|
22
24
|
uploadActionHeight: 40,
|
|
23
25
|
// 40px height
|
|
24
26
|
emojiPerRow: 8
|
|
@@ -6,7 +6,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", {
|
|
7
7
|
value: true
|
|
8
8
|
});
|
|
9
|
-
exports.virtualItemRenderer = exports.LoadingItem = exports.EmojisRowItem = exports.CategoryHeadingItem = exports.AbstractItem = void 0;
|
|
9
|
+
exports.virtualItemRenderer = exports.NoResultsItem = exports.LoadingItem = exports.EmojisRowItem = exports.CategoryHeadingItem = exports.AbstractItem = void 0;
|
|
10
10
|
require("./EmojiPickerVirtualItems.compiled.css");
|
|
11
11
|
var React = _interopRequireWildcard(require("react"));
|
|
12
12
|
var _runtime = require("@compiled/react/runtime");
|
|
@@ -20,6 +20,7 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
|
|
|
20
20
|
var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
|
|
21
21
|
var _EmojiPickerCategoryHeading = _interopRequireDefault(require("./EmojiPickerCategoryHeading"));
|
|
22
22
|
var _EmojiPickerEmojiRow = _interopRequireDefault(require("./EmojiPickerEmojiRow"));
|
|
23
|
+
var _EmojiPickerNoResults = _interopRequireDefault(require("./EmojiPickerNoResults"));
|
|
23
24
|
var _EmojiPickerSizes = require("./EmojiPickerSizes");
|
|
24
25
|
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); }
|
|
25
26
|
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
|
|
@@ -75,6 +76,19 @@ var CategoryHeadingItem = exports.CategoryHeadingItem = /*#__PURE__*/function (_
|
|
|
75
76
|
(0, _inherits2.default)(CategoryHeadingItem, _AbstractItem3);
|
|
76
77
|
return (0, _createClass2.default)(CategoryHeadingItem);
|
|
77
78
|
}(AbstractItem);
|
|
79
|
+
var NoResultsItem = exports.NoResultsItem = /*#__PURE__*/function (_AbstractItem4) {
|
|
80
|
+
function NoResultsItem(props) {
|
|
81
|
+
var _this4;
|
|
82
|
+
(0, _classCallCheck2.default)(this, NoResultsItem);
|
|
83
|
+
_this4 = _callSuper(this, NoResultsItem, [props, _EmojiPickerSizes.sizes.noResultsHeight]);
|
|
84
|
+
(0, _defineProperty2.default)(_this4, "renderItem", function () {
|
|
85
|
+
return /*#__PURE__*/React.createElement(_EmojiPickerNoResults.default, _this4.props);
|
|
86
|
+
});
|
|
87
|
+
return _this4;
|
|
88
|
+
}
|
|
89
|
+
(0, _inherits2.default)(NoResultsItem, _AbstractItem4);
|
|
90
|
+
return (0, _createClass2.default)(NoResultsItem);
|
|
91
|
+
}(AbstractItem);
|
|
78
92
|
var virtualItemRenderer = exports.virtualItemRenderer = function virtualItemRenderer(rows, context) {
|
|
79
93
|
var index = context.index,
|
|
80
94
|
key = context.key;
|
|
@@ -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.11.
|
|
23
|
+
packageVersion: "70.11.1"
|
|
24
24
|
}, attributes)
|
|
25
25
|
};
|
|
26
26
|
};
|
|
@@ -225,6 +225,16 @@ export const messages = defineMessages({
|
|
|
225
225
|
defaultMessage: 'An emoji with this name exists already',
|
|
226
226
|
description: 'Error message shown when the user tries to upload an emoji with a name that already exists in the custom emoji set'
|
|
227
227
|
},
|
|
228
|
+
emojiPickerNoResults: {
|
|
229
|
+
id: 'fabric.emoji.picker.no.results',
|
|
230
|
+
defaultMessage: 'No results',
|
|
231
|
+
description: 'Heading shown in the emoji picker when a search query returns no matching emojis.'
|
|
232
|
+
},
|
|
233
|
+
emojiPickerAddCustomEmoji: {
|
|
234
|
+
id: 'fabric.emoji.picker.add.custom.emoji',
|
|
235
|
+
defaultMessage: 'Add custom emoji',
|
|
236
|
+
description: 'Label for the button shown in the emoji picker no-results screen that opens the custom emoji upload panel.'
|
|
237
|
+
},
|
|
228
238
|
emojiPickerTitle: {
|
|
229
239
|
id: 'fabric.emoji.picker',
|
|
230
240
|
defaultMessage: 'Emoji picker',
|
|
@@ -21,13 +21,16 @@
|
|
|
21
21
|
._1xi2idpf{right:0}
|
|
22
22
|
._2lx21bp4{flex-direction:column}
|
|
23
23
|
._4t3i1784{height:470px}
|
|
24
|
+
._4t3i19lm{height:514px}
|
|
24
25
|
._4t3i1ckg{height:455px}
|
|
25
26
|
._4t3i1dsu{height:419px}
|
|
27
|
+
._4t3i1j8x{height:354px}
|
|
26
28
|
._4t3i1sa4{height:390px}
|
|
27
29
|
._4t3i2300{height:429px}
|
|
28
30
|
._4t3i50k7{height:499px}
|
|
29
31
|
._4t3iaq3k{height:295px}
|
|
30
32
|
._4t3ibqjm{height:310px}
|
|
33
|
+
._4t3iihnn{height:434px}
|
|
31
34
|
._4t3iixjv{height:375px}
|
|
32
35
|
._4t3iqbeb{height:339px}
|
|
33
36
|
._4t3ivixp{height:349px}
|
|
@@ -60,6 +60,12 @@ const withoutPreviewHeight = {
|
|
|
60
60
|
medium: "_4t3iixjv _1tke5x59",
|
|
61
61
|
large: "_4t3i1ckg _1tke1pna"
|
|
62
62
|
};
|
|
63
|
+
const emojiPickerHeightNoResults = 354;
|
|
64
|
+
const withNoResultsRefreshHeight = {
|
|
65
|
+
small: "_4t3i1j8x _1tkegx0z",
|
|
66
|
+
medium: "_4t3iihnn _1tke5x59",
|
|
67
|
+
large: "_4t3i19lm _1tke1pna"
|
|
68
|
+
};
|
|
63
69
|
const FREQUENTLY_USED_MAX = 16;
|
|
64
70
|
const EmojiPickerComponent = ({
|
|
65
71
|
onSelection,
|
|
@@ -92,6 +98,7 @@ const EmojiPickerComponent = ({
|
|
|
92
98
|
const emojiPickerList = useMemo(() => /*#__PURE__*/createRef(), []);
|
|
93
99
|
const openTime = useRef(0);
|
|
94
100
|
const isMounting = useRef(true);
|
|
101
|
+
const lastNonSearchCategory = useRef(activeCategory);
|
|
95
102
|
const previousEmojiProvider = useRef(emojiProvider);
|
|
96
103
|
const isProgrammaticScroll = useRef(false);
|
|
97
104
|
const pickerRef = useRef(null);
|
|
@@ -133,8 +140,11 @@ const EmojiPickerComponent = ({
|
|
|
133
140
|
}
|
|
134
141
|
if (activeCategory !== category) {
|
|
135
142
|
setActiveCategory(category);
|
|
143
|
+
if (!query && fg('platform_emoji_picker_refresh')) {
|
|
144
|
+
lastNonSearchCategory.current = category;
|
|
145
|
+
}
|
|
136
146
|
}
|
|
137
|
-
}, [activeCategory, uploading, emojiToDelete]);
|
|
147
|
+
}, [activeCategory, uploading, emojiToDelete, query]);
|
|
138
148
|
const calculateElapsedTime = () => {
|
|
139
149
|
return Date.now() - openTime.current;
|
|
140
150
|
};
|
|
@@ -347,6 +357,10 @@ const EmojiPickerComponent = ({
|
|
|
347
357
|
source: SearchSourceTypes.PICKER
|
|
348
358
|
};
|
|
349
359
|
if (searchQuery !== query) {
|
|
360
|
+
// Capture the active category before entering search so we can keep it highlighted
|
|
361
|
+
if (!query && searchQuery && fg('platform_emoji_picker_refresh')) {
|
|
362
|
+
lastNonSearchCategory.current = activeCategory;
|
|
363
|
+
}
|
|
350
364
|
setQuery(searchQuery);
|
|
351
365
|
}
|
|
352
366
|
updateEmojis(searchQuery, options);
|
|
@@ -354,7 +368,7 @@ const EmojiPickerComponent = ({
|
|
|
354
368
|
// scroll to top when search, which is search results section
|
|
355
369
|
scrollToTopOfList();
|
|
356
370
|
}
|
|
357
|
-
}, [query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
|
|
371
|
+
}, [activeCategory, query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
|
|
358
372
|
|
|
359
373
|
// When the upload screen is open, intercept any file drag at the window level so it
|
|
360
374
|
// cannot reach underlying page drop handlers (e.g. the Confluence editor).
|
|
@@ -547,7 +561,7 @@ const EmojiPickerComponent = ({
|
|
|
547
561
|
role: "dialog",
|
|
548
562
|
"aria-label": formatMessage(messages.emojiPickerTitle),
|
|
549
563
|
"aria-modal": true,
|
|
550
|
-
className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]])
|
|
564
|
+
className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]])
|
|
551
565
|
}, /*#__PURE__*/React.createElement("div", {
|
|
552
566
|
role: "presentation",
|
|
553
567
|
onKeyPress: suppressKeyPress,
|
|
@@ -588,7 +602,7 @@ const EmojiPickerComponent = ({
|
|
|
588
602
|
onOpenUpload: onOpenUpload,
|
|
589
603
|
size: size,
|
|
590
604
|
activeCategoryId: activeCategory
|
|
591
|
-
}), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
|
|
605
|
+
}), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
|
|
592
606
|
selectedEmoji: selectedEmoji,
|
|
593
607
|
uploadEnabled: isUploadSupported && !uploading,
|
|
594
608
|
onOpenUpload: onOpenUpload
|
|
@@ -603,7 +617,7 @@ const EmojiPickerComponent = ({
|
|
|
603
617
|
onKeyPress: suppressKeyPress,
|
|
604
618
|
onKeyUp: suppressKeyPress,
|
|
605
619
|
onKeyDown: suppressKeyPress,
|
|
606
|
-
className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]])
|
|
620
|
+
className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]])
|
|
607
621
|
}, /*#__PURE__*/React.createElement(CategorySelector, {
|
|
608
622
|
activeCategoryId: (uploading || emojiToDelete) && fg('platform_emoji_picker_refresh') ? null : activeCategory,
|
|
609
623
|
dynamicCategories: dynamicCategories,
|
|
@@ -638,7 +652,7 @@ const EmojiPickerComponent = ({
|
|
|
638
652
|
onOpenUpload: onOpenUpload,
|
|
639
653
|
size: size,
|
|
640
654
|
activeCategoryId: activeCategory
|
|
641
|
-
}), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
|
|
655
|
+
}), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
|
|
642
656
|
selectedEmoji: selectedEmoji,
|
|
643
657
|
uploadEnabled: isUploadSupported && !uploading,
|
|
644
658
|
onOpenUpload: onOpenUpload
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import { useIntl } from 'react-intl';
|
|
1
2
|
import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
2
3
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
3
4
|
import { customCategory, defaultEmojiPickerSize, frequentCategory, searchCategory, userCustomTitle, yourUploadsCategory } from '../../util/constants';
|
|
4
5
|
import { CategoryDescriptionMap, CategoryDescriptionMapNew } from './categories';
|
|
5
6
|
import CategoryTracker from './CategoryTracker';
|
|
6
7
|
import { sizes } from './EmojiPickerSizes';
|
|
7
|
-
import { CategoryHeadingItem, EmojisRowItem, LoadingItem, virtualItemRenderer } from './EmojiPickerVirtualItems';
|
|
8
|
+
import { CategoryHeadingItem, EmojisRowItem, LoadingItem, NoResultsItem, virtualItemRenderer } from './EmojiPickerVirtualItems';
|
|
8
9
|
import EmojiActions from '../common/EmojiActions';
|
|
9
10
|
import { emojiPickerHeightOffset, scrollToRow } from './utils';
|
|
10
11
|
import { VirtualList } from './VirtualList';
|
|
11
12
|
import { EmojiPickerListContextProvider } from '../../context/EmojiPickerListContext';
|
|
12
13
|
import EmojiPickerTabPanel from './EmojiPickerTabPanel';
|
|
14
|
+
import { messages } from '../i18n';
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
17
|
* Test id for wrapper Emoji Picker List div
|
|
@@ -52,6 +54,9 @@ export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((pro
|
|
|
52
54
|
onOpenUpload,
|
|
53
55
|
activeCategoryId
|
|
54
56
|
} = props;
|
|
57
|
+
const {
|
|
58
|
+
formatMessage
|
|
59
|
+
} = useIntl();
|
|
55
60
|
const listRef = useRef(null);
|
|
56
61
|
const [allEmojiGroups, setAllEmojiGroups] = useState([]);
|
|
57
62
|
const [virtualItems, setVirtualItems] = useState([]);
|
|
@@ -153,14 +158,27 @@ export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((pro
|
|
|
153
158
|
items.push(new LoadingItem());
|
|
154
159
|
} else {
|
|
155
160
|
if (query) {
|
|
156
|
-
const search = CategoryDescriptionMap.SEARCH;
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
161
|
+
const search = fg('platform_emoji_picker_refresh') ? CategoryDescriptionMapNew.SEARCH : CategoryDescriptionMap.SEARCH;
|
|
162
|
+
if (emojis.length === 0 && fg('platform_emoji_picker_refresh')) {
|
|
163
|
+
// Show a "No results" category heading, then a no-results illustration below it
|
|
164
|
+
items.push(new CategoryHeadingItem({
|
|
165
|
+
id: searchCategory,
|
|
166
|
+
title: formatMessage(messages.emojiPickerNoResults),
|
|
167
|
+
className: categoryClassname
|
|
168
|
+
}));
|
|
169
|
+
items.push(new NoResultsItem({
|
|
170
|
+
onOpenUpload,
|
|
171
|
+
uploadEnabled
|
|
172
|
+
}));
|
|
173
|
+
} else {
|
|
174
|
+
// Only a single "result" category
|
|
175
|
+
items = [...items, ...buildVirtualItemFromGroup({
|
|
176
|
+
category: searchCategory,
|
|
177
|
+
title: search.name,
|
|
178
|
+
emojis,
|
|
179
|
+
order: search.order
|
|
180
|
+
})];
|
|
181
|
+
}
|
|
164
182
|
} else {
|
|
165
183
|
// Group by category
|
|
166
184
|
|
|
@@ -185,7 +203,7 @@ export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((pro
|
|
|
185
203
|
}
|
|
186
204
|
}
|
|
187
205
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
188
|
-
}, [allEmojiGroups, loading, query, emojis]);
|
|
206
|
+
}, [allEmojiGroups, loading, query, emojis, onOpenUpload, uploadEnabled, formatMessage]);
|
|
189
207
|
const findCategoryToActivate = row => {
|
|
190
208
|
let category = null;
|
|
191
209
|
if (row instanceof CategoryHeadingItem) {
|
|
@@ -294,8 +312,12 @@ export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((pro
|
|
|
294
312
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
295
313
|
}, [virtualItems, categoriesChanged]);
|
|
296
314
|
const virtualListHeight = useMemo(() => {
|
|
315
|
+
if (query && emojis.length === 0 && fg('platform_emoji_picker_refresh')) {
|
|
316
|
+
// No-results state: expand the list height to fit heading + illustration without scrolling
|
|
317
|
+
return sizes.categoryHeadingHeight + sizes.noResultsHeight + emojiPickerHeightOffset(size);
|
|
318
|
+
}
|
|
297
319
|
return fg('platform_emoji_picker_refresh') ? sizes.listHeightNew + emojiPickerHeightOffset(size) : sizes.listHeight + emojiPickerHeightOffset(size);
|
|
298
|
-
}, [size]);
|
|
320
|
+
}, [size, query, emojis.length]);
|
|
299
321
|
return /*#__PURE__*/React.createElement(EmojiPickerTabPanel, {
|
|
300
322
|
showSearchResults: !!query
|
|
301
323
|
}, /*#__PURE__*/React.createElement(EmojiActions, {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
._zulppxbi{gap:var(--ds-space-200,1pc)}._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
|
|
3
|
+
._1bah1h6o{justify-content:center}
|
|
4
|
+
._1bsb1osq{width:100%}
|
|
5
|
+
._1e0c1txw{display:flex}
|
|
6
|
+
._2lx21bp4{flex-direction:column}
|
|
7
|
+
._4cvr1h6o{align-items:center}
|
|
8
|
+
._ca0q1ejb{padding-top:var(--ds-space-300,24px)}
|
|
9
|
+
._n3td1ejb{padding-bottom:var(--ds-space-300,24px)}
|
|
10
|
+
._u5f3pxbi{padding-right:var(--ds-space-200,1pc)}
|
|
11
|
+
._vchhusvi{box-sizing:border-box}
|
|
12
|
+
._y3gn1h6o{text-align:center}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* EmojiPickerNoResults.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
import "./EmojiPickerNoResults.compiled.css";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
5
|
+
import { useCallback } from 'react';
|
|
6
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
7
|
+
import { FormattedMessage } from 'react-intl';
|
|
8
|
+
import AkButton from '@atlaskit/button/standard-button';
|
|
9
|
+
import Image from '@atlaskit/image';
|
|
10
|
+
import { messages } from '../i18n';
|
|
11
|
+
import SearchNoResultDark from './assets/spot/search-no-result/dark.svg';
|
|
12
|
+
import SearchNoResultLight from './assets/spot/search-no-result/light.svg';
|
|
13
|
+
const noResultsContainer = null;
|
|
14
|
+
export const RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = 'render-emoji-picker-no-results';
|
|
15
|
+
const EmojiPickerNoResults = ({
|
|
16
|
+
onOpenUpload,
|
|
17
|
+
uploadEnabled
|
|
18
|
+
}) => {
|
|
19
|
+
const handleOpenUpload = useCallback(event => {
|
|
20
|
+
if (fg('platform_emoji_keep_picker_open_on_upload')) {
|
|
21
|
+
event.preventDefault();
|
|
22
|
+
event.stopPropagation();
|
|
23
|
+
}
|
|
24
|
+
onOpenUpload();
|
|
25
|
+
}, [onOpenUpload]);
|
|
26
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
27
|
+
"data-testid": RENDER_EMOJI_PICKER_NO_RESULTS_TESTID,
|
|
28
|
+
className: ax(["_zulppxbi _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _ca0q1ejb _u5f3pxbi _n3td1ejb _19bvpxbi _y3gn1h6o _1bsb1osq _vchhusvi"])
|
|
29
|
+
}, /*#__PURE__*/React.createElement(Image, {
|
|
30
|
+
src: SearchNoResultLight,
|
|
31
|
+
srcDark: SearchNoResultDark,
|
|
32
|
+
alt: "",
|
|
33
|
+
width: 200
|
|
34
|
+
}), uploadEnabled && /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiPickerAddCustomEmoji, label => /*#__PURE__*/React.createElement(AkButton, {
|
|
35
|
+
onClick: handleOpenUpload,
|
|
36
|
+
appearance: "default",
|
|
37
|
+
tabIndex: 0
|
|
38
|
+
}, label)));
|
|
39
|
+
};
|
|
40
|
+
export default EmojiPickerNoResults;
|
|
@@ -13,6 +13,8 @@ export const sizes = {
|
|
|
13
13
|
// 32px height
|
|
14
14
|
loadingRowHeight: 150,
|
|
15
15
|
// Fills remaining space without scrolling when loading.
|
|
16
|
+
noResultsHeight: 300,
|
|
17
|
+
// illustration (200px) + button + padding + gap
|
|
16
18
|
uploadActionHeight: 40,
|
|
17
19
|
// 40px height
|
|
18
20
|
emojiPerRow: 8
|
|
@@ -7,6 +7,7 @@ import { ax, ix } from "@compiled/react/runtime";
|
|
|
7
7
|
import Spinner from '@atlaskit/spinner';
|
|
8
8
|
import EmojiPickerCategoryHeading from './EmojiPickerCategoryHeading';
|
|
9
9
|
import EmojiPickerEmojiRow from './EmojiPickerEmojiRow';
|
|
10
|
+
import EmojiPickerNoResults from './EmojiPickerNoResults';
|
|
10
11
|
import { sizes } from './EmojiPickerSizes';
|
|
11
12
|
const emojiPickerSpinner = null;
|
|
12
13
|
export class AbstractItem {
|
|
@@ -39,6 +40,12 @@ export class CategoryHeadingItem extends AbstractItem {
|
|
|
39
40
|
_defineProperty(this, "renderItem", () => /*#__PURE__*/React.createElement(EmojiPickerCategoryHeading, this.props));
|
|
40
41
|
}
|
|
41
42
|
}
|
|
43
|
+
export class NoResultsItem extends AbstractItem {
|
|
44
|
+
constructor(props) {
|
|
45
|
+
super(props, sizes.noResultsHeight);
|
|
46
|
+
_defineProperty(this, "renderItem", () => /*#__PURE__*/React.createElement(EmojiPickerNoResults, this.props));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
42
49
|
export const virtualItemRenderer = (rows, context) => {
|
|
43
50
|
const {
|
|
44
51
|
index,
|
|
@@ -225,6 +225,16 @@ export var messages = defineMessages({
|
|
|
225
225
|
defaultMessage: 'An emoji with this name exists already',
|
|
226
226
|
description: 'Error message shown when the user tries to upload an emoji with a name that already exists in the custom emoji set'
|
|
227
227
|
},
|
|
228
|
+
emojiPickerNoResults: {
|
|
229
|
+
id: 'fabric.emoji.picker.no.results',
|
|
230
|
+
defaultMessage: 'No results',
|
|
231
|
+
description: 'Heading shown in the emoji picker when a search query returns no matching emojis.'
|
|
232
|
+
},
|
|
233
|
+
emojiPickerAddCustomEmoji: {
|
|
234
|
+
id: 'fabric.emoji.picker.add.custom.emoji',
|
|
235
|
+
defaultMessage: 'Add custom emoji',
|
|
236
|
+
description: 'Label for the button shown in the emoji picker no-results screen that opens the custom emoji upload panel.'
|
|
237
|
+
},
|
|
228
238
|
emojiPickerTitle: {
|
|
229
239
|
id: 'fabric.emoji.picker',
|
|
230
240
|
defaultMessage: 'Emoji picker',
|
|
@@ -21,13 +21,16 @@
|
|
|
21
21
|
._1xi2idpf{right:0}
|
|
22
22
|
._2lx21bp4{flex-direction:column}
|
|
23
23
|
._4t3i1784{height:470px}
|
|
24
|
+
._4t3i19lm{height:514px}
|
|
24
25
|
._4t3i1ckg{height:455px}
|
|
25
26
|
._4t3i1dsu{height:419px}
|
|
27
|
+
._4t3i1j8x{height:354px}
|
|
26
28
|
._4t3i1sa4{height:390px}
|
|
27
29
|
._4t3i2300{height:429px}
|
|
28
30
|
._4t3i50k7{height:499px}
|
|
29
31
|
._4t3iaq3k{height:295px}
|
|
30
32
|
._4t3ibqjm{height:310px}
|
|
33
|
+
._4t3iihnn{height:434px}
|
|
31
34
|
._4t3iixjv{height:375px}
|
|
32
35
|
._4t3iqbeb{height:339px}
|
|
33
36
|
._4t3iuxo9{height:var(--_19dn98e)}
|
|
@@ -67,6 +67,12 @@ var withoutPreviewHeight = {
|
|
|
67
67
|
medium: "_4t3iixjv _1tke5x59",
|
|
68
68
|
large: "_4t3i1ckg _1tke1pna"
|
|
69
69
|
};
|
|
70
|
+
var emojiPickerHeightNoResults = 354;
|
|
71
|
+
var withNoResultsRefreshHeight = {
|
|
72
|
+
small: "_4t3i1j8x _1tkegx0z",
|
|
73
|
+
medium: "_4t3iihnn _1tke5x59",
|
|
74
|
+
large: "_4t3i19lm _1tke1pna"
|
|
75
|
+
};
|
|
70
76
|
var FREQUENTLY_USED_MAX = 16;
|
|
71
77
|
var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
72
78
|
var onSelection = _ref.onSelection,
|
|
@@ -141,6 +147,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
141
147
|
}, []);
|
|
142
148
|
var openTime = useRef(0);
|
|
143
149
|
var isMounting = useRef(true);
|
|
150
|
+
var lastNonSearchCategory = useRef(activeCategory);
|
|
144
151
|
var previousEmojiProvider = useRef(emojiProvider);
|
|
145
152
|
var isProgrammaticScroll = useRef(false);
|
|
146
153
|
var pickerRef = useRef(null);
|
|
@@ -182,8 +189,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
182
189
|
}
|
|
183
190
|
if (activeCategory !== category) {
|
|
184
191
|
setActiveCategory(category);
|
|
192
|
+
if (!query && fg('platform_emoji_picker_refresh')) {
|
|
193
|
+
lastNonSearchCategory.current = category;
|
|
194
|
+
}
|
|
185
195
|
}
|
|
186
|
-
}, [activeCategory, uploading, emojiToDelete]);
|
|
196
|
+
}, [activeCategory, uploading, emojiToDelete, query]);
|
|
187
197
|
var calculateElapsedTime = function calculateElapsedTime() {
|
|
188
198
|
return Date.now() - openTime.current;
|
|
189
199
|
};
|
|
@@ -400,6 +410,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
400
410
|
source: SearchSourceTypes.PICKER
|
|
401
411
|
};
|
|
402
412
|
if (searchQuery !== query) {
|
|
413
|
+
// Capture the active category before entering search so we can keep it highlighted
|
|
414
|
+
if (!query && searchQuery && fg('platform_emoji_picker_refresh')) {
|
|
415
|
+
lastNonSearchCategory.current = activeCategory;
|
|
416
|
+
}
|
|
403
417
|
setQuery(searchQuery);
|
|
404
418
|
}
|
|
405
419
|
updateEmojis(searchQuery, options);
|
|
@@ -407,7 +421,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
407
421
|
// scroll to top when search, which is search results section
|
|
408
422
|
scrollToTopOfList();
|
|
409
423
|
}
|
|
410
|
-
}, [query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
|
|
424
|
+
}, [activeCategory, query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
|
|
411
425
|
|
|
412
426
|
// When the upload screen is open, intercept any file drag at the window level so it
|
|
413
427
|
// cannot reach underlying page drop handlers (e.g. the Confluence editor).
|
|
@@ -628,7 +642,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
628
642
|
role: "dialog",
|
|
629
643
|
"aria-label": formatMessage(messages.emojiPickerTitle),
|
|
630
644
|
"aria-modal": true,
|
|
631
|
-
className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
|
|
645
|
+
className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
|
|
632
646
|
style: {
|
|
633
647
|
"--_19dn98e": ix("".concat(emojiPickerHeight, "px")),
|
|
634
648
|
"--_gsvyy7": ix("".concat(emojiPickerWidth, "px"))
|
|
@@ -673,7 +687,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
673
687
|
onOpenUpload: onOpenUpload,
|
|
674
688
|
size: size,
|
|
675
689
|
activeCategoryId: activeCategory
|
|
676
|
-
}), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
|
|
690
|
+
}), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
|
|
677
691
|
selectedEmoji: selectedEmoji,
|
|
678
692
|
uploadEnabled: isUploadSupported && !uploading,
|
|
679
693
|
onOpenUpload: onOpenUpload
|
|
@@ -688,7 +702,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
688
702
|
onKeyPress: suppressKeyPress,
|
|
689
703
|
onKeyUp: suppressKeyPress,
|
|
690
704
|
onKeyDown: suppressKeyPress,
|
|
691
|
-
className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
|
|
705
|
+
className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
|
|
692
706
|
style: {
|
|
693
707
|
"--_19dn98e": ix("".concat(emojiPickerHeight, "px")),
|
|
694
708
|
"--_gsvyy7": ix("".concat(emojiPickerWidth, "px"))
|
|
@@ -727,7 +741,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
|
|
|
727
741
|
onOpenUpload: onOpenUpload,
|
|
728
742
|
size: size,
|
|
729
743
|
activeCategoryId: activeCategory
|
|
730
|
-
}), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
|
|
744
|
+
}), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
|
|
731
745
|
selectedEmoji: selectedEmoji,
|
|
732
746
|
uploadEnabled: isUploadSupported && !uploading,
|
|
733
747
|
onOpenUpload: onOpenUpload
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
2
2
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import { useIntl } from 'react-intl';
|
|
3
4
|
import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
4
5
|
import { fg } from '@atlaskit/platform-feature-flags';
|
|
5
6
|
import { customCategory, defaultEmojiPickerSize, frequentCategory, searchCategory, userCustomTitle, yourUploadsCategory } from '../../util/constants';
|
|
6
7
|
import { CategoryDescriptionMap, CategoryDescriptionMapNew } from './categories';
|
|
7
8
|
import CategoryTracker from './CategoryTracker';
|
|
8
9
|
import { sizes } from './EmojiPickerSizes';
|
|
9
|
-
import { CategoryHeadingItem, EmojisRowItem, LoadingItem, virtualItemRenderer } from './EmojiPickerVirtualItems';
|
|
10
|
+
import { CategoryHeadingItem, EmojisRowItem, LoadingItem, NoResultsItem, virtualItemRenderer } from './EmojiPickerVirtualItems';
|
|
10
11
|
import EmojiActions from '../common/EmojiActions';
|
|
11
12
|
import { emojiPickerHeightOffset, scrollToRow as _scrollToRow } from './utils';
|
|
12
13
|
import { VirtualList } from './VirtualList';
|
|
13
14
|
import { EmojiPickerListContextProvider } from '../../context/EmojiPickerListContext';
|
|
14
15
|
import EmojiPickerTabPanel from './EmojiPickerTabPanel';
|
|
16
|
+
import { messages } from '../i18n';
|
|
15
17
|
|
|
16
18
|
/**
|
|
17
19
|
* Test id for wrapper Emoji Picker List div
|
|
@@ -60,6 +62,8 @@ export var EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef(functi
|
|
|
60
62
|
onFileChooserClicked = props.onFileChooserClicked,
|
|
61
63
|
onOpenUpload = props.onOpenUpload,
|
|
62
64
|
activeCategoryId = props.activeCategoryId;
|
|
65
|
+
var _useIntl = useIntl(),
|
|
66
|
+
formatMessage = _useIntl.formatMessage;
|
|
63
67
|
var listRef = useRef(null);
|
|
64
68
|
var _useState = useState([]),
|
|
65
69
|
_useState2 = _slicedToArray(_useState, 2),
|
|
@@ -177,14 +181,27 @@ export var EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef(functi
|
|
|
177
181
|
items.push(new LoadingItem());
|
|
178
182
|
} else {
|
|
179
183
|
if (query) {
|
|
180
|
-
var search = CategoryDescriptionMap.SEARCH;
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
184
|
+
var search = fg('platform_emoji_picker_refresh') ? CategoryDescriptionMapNew.SEARCH : CategoryDescriptionMap.SEARCH;
|
|
185
|
+
if (emojis.length === 0 && fg('platform_emoji_picker_refresh')) {
|
|
186
|
+
// Show a "No results" category heading, then a no-results illustration below it
|
|
187
|
+
items.push(new CategoryHeadingItem({
|
|
188
|
+
id: searchCategory,
|
|
189
|
+
title: formatMessage(messages.emojiPickerNoResults),
|
|
190
|
+
className: categoryClassname
|
|
191
|
+
}));
|
|
192
|
+
items.push(new NoResultsItem({
|
|
193
|
+
onOpenUpload: onOpenUpload,
|
|
194
|
+
uploadEnabled: uploadEnabled
|
|
195
|
+
}));
|
|
196
|
+
} else {
|
|
197
|
+
// Only a single "result" category
|
|
198
|
+
items = [].concat(_toConsumableArray(items), _toConsumableArray(buildVirtualItemFromGroup({
|
|
199
|
+
category: searchCategory,
|
|
200
|
+
title: search.name,
|
|
201
|
+
emojis: emojis,
|
|
202
|
+
order: search.order
|
|
203
|
+
})));
|
|
204
|
+
}
|
|
188
205
|
} else {
|
|
189
206
|
// Group by category
|
|
190
207
|
|
|
@@ -209,7 +226,7 @@ export var EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef(functi
|
|
|
209
226
|
}
|
|
210
227
|
}
|
|
211
228
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
212
|
-
}, [allEmojiGroups, loading, query, emojis]);
|
|
229
|
+
}, [allEmojiGroups, loading, query, emojis, onOpenUpload, uploadEnabled, formatMessage]);
|
|
213
230
|
var findCategoryToActivate = function findCategoryToActivate(row) {
|
|
214
231
|
var category = null;
|
|
215
232
|
if (row instanceof CategoryHeadingItem) {
|
|
@@ -319,8 +336,12 @@ export var EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef(functi
|
|
|
319
336
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
320
337
|
}, [virtualItems, categoriesChanged]);
|
|
321
338
|
var virtualListHeight = useMemo(function () {
|
|
339
|
+
if (query && emojis.length === 0 && fg('platform_emoji_picker_refresh')) {
|
|
340
|
+
// No-results state: expand the list height to fit heading + illustration without scrolling
|
|
341
|
+
return sizes.categoryHeadingHeight + sizes.noResultsHeight + emojiPickerHeightOffset(size);
|
|
342
|
+
}
|
|
322
343
|
return fg('platform_emoji_picker_refresh') ? sizes.listHeightNew + emojiPickerHeightOffset(size) : sizes.listHeight + emojiPickerHeightOffset(size);
|
|
323
|
-
}, [size]);
|
|
344
|
+
}, [size, query, emojis.length]);
|
|
324
345
|
return /*#__PURE__*/React.createElement(EmojiPickerTabPanel, {
|
|
325
346
|
showSearchResults: !!query
|
|
326
347
|
}, /*#__PURE__*/React.createElement(EmojiActions, {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
._zulppxbi{gap:var(--ds-space-200,1pc)}._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
|
|
3
|
+
._1bah1h6o{justify-content:center}
|
|
4
|
+
._1bsb1osq{width:100%}
|
|
5
|
+
._1e0c1txw{display:flex}
|
|
6
|
+
._2lx21bp4{flex-direction:column}
|
|
7
|
+
._4cvr1h6o{align-items:center}
|
|
8
|
+
._ca0q1ejb{padding-top:var(--ds-space-300,24px)}
|
|
9
|
+
._n3td1ejb{padding-bottom:var(--ds-space-300,24px)}
|
|
10
|
+
._u5f3pxbi{padding-right:var(--ds-space-200,1pc)}
|
|
11
|
+
._vchhusvi{box-sizing:border-box}
|
|
12
|
+
._y3gn1h6o{text-align:center}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/* EmojiPickerNoResults.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
import "./EmojiPickerNoResults.compiled.css";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
5
|
+
import { useCallback } from 'react';
|
|
6
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
7
|
+
import { FormattedMessage } from 'react-intl';
|
|
8
|
+
import AkButton from '@atlaskit/button/standard-button';
|
|
9
|
+
import Image from '@atlaskit/image';
|
|
10
|
+
import { messages } from '../i18n';
|
|
11
|
+
import SearchNoResultDark from './assets/spot/search-no-result/dark.svg';
|
|
12
|
+
import SearchNoResultLight from './assets/spot/search-no-result/light.svg';
|
|
13
|
+
var noResultsContainer = null;
|
|
14
|
+
export var RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = 'render-emoji-picker-no-results';
|
|
15
|
+
var EmojiPickerNoResults = function EmojiPickerNoResults(_ref) {
|
|
16
|
+
var onOpenUpload = _ref.onOpenUpload,
|
|
17
|
+
uploadEnabled = _ref.uploadEnabled;
|
|
18
|
+
var handleOpenUpload = useCallback(function (event) {
|
|
19
|
+
if (fg('platform_emoji_keep_picker_open_on_upload')) {
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
event.stopPropagation();
|
|
22
|
+
}
|
|
23
|
+
onOpenUpload();
|
|
24
|
+
}, [onOpenUpload]);
|
|
25
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
26
|
+
"data-testid": RENDER_EMOJI_PICKER_NO_RESULTS_TESTID,
|
|
27
|
+
className: ax(["_zulppxbi _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _ca0q1ejb _u5f3pxbi _n3td1ejb _19bvpxbi _y3gn1h6o _1bsb1osq _vchhusvi"])
|
|
28
|
+
}, /*#__PURE__*/React.createElement(Image, {
|
|
29
|
+
src: SearchNoResultLight,
|
|
30
|
+
srcDark: SearchNoResultDark,
|
|
31
|
+
alt: "",
|
|
32
|
+
width: 200
|
|
33
|
+
}), uploadEnabled && /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiPickerAddCustomEmoji, function (label) {
|
|
34
|
+
return /*#__PURE__*/React.createElement(AkButton, {
|
|
35
|
+
onClick: handleOpenUpload,
|
|
36
|
+
appearance: "default",
|
|
37
|
+
tabIndex: 0
|
|
38
|
+
}, label);
|
|
39
|
+
}));
|
|
40
|
+
};
|
|
41
|
+
export default EmojiPickerNoResults;
|
|
@@ -13,6 +13,8 @@ export var sizes = {
|
|
|
13
13
|
// 32px height
|
|
14
14
|
loadingRowHeight: 150,
|
|
15
15
|
// Fills remaining space without scrolling when loading.
|
|
16
|
+
noResultsHeight: 300,
|
|
17
|
+
// illustration (200px) + button + padding + gap
|
|
16
18
|
uploadActionHeight: 40,
|
|
17
19
|
// 40px height
|
|
18
20
|
emojiPerRow: 8
|
|
@@ -14,6 +14,7 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
|
|
|
14
14
|
import Spinner from '@atlaskit/spinner';
|
|
15
15
|
import EmojiPickerCategoryHeading from './EmojiPickerCategoryHeading';
|
|
16
16
|
import EmojiPickerEmojiRow from './EmojiPickerEmojiRow';
|
|
17
|
+
import EmojiPickerNoResults from './EmojiPickerNoResults';
|
|
17
18
|
import { sizes } from './EmojiPickerSizes';
|
|
18
19
|
var emojiPickerSpinner = null;
|
|
19
20
|
export var AbstractItem = /*#__PURE__*/_createClass(function AbstractItem(props, height) {
|
|
@@ -66,6 +67,19 @@ export var CategoryHeadingItem = /*#__PURE__*/function (_AbstractItem3) {
|
|
|
66
67
|
_inherits(CategoryHeadingItem, _AbstractItem3);
|
|
67
68
|
return _createClass(CategoryHeadingItem);
|
|
68
69
|
}(AbstractItem);
|
|
70
|
+
export var NoResultsItem = /*#__PURE__*/function (_AbstractItem4) {
|
|
71
|
+
function NoResultsItem(props) {
|
|
72
|
+
var _this4;
|
|
73
|
+
_classCallCheck(this, NoResultsItem);
|
|
74
|
+
_this4 = _callSuper(this, NoResultsItem, [props, sizes.noResultsHeight]);
|
|
75
|
+
_defineProperty(_this4, "renderItem", function () {
|
|
76
|
+
return /*#__PURE__*/React.createElement(EmojiPickerNoResults, _this4.props);
|
|
77
|
+
});
|
|
78
|
+
return _this4;
|
|
79
|
+
}
|
|
80
|
+
_inherits(NoResultsItem, _AbstractItem4);
|
|
81
|
+
return _createClass(NoResultsItem);
|
|
82
|
+
}(AbstractItem);
|
|
69
83
|
export var virtualItemRenderer = function virtualItemRenderer(rows, context) {
|
|
70
84
|
var index = context.index,
|
|
71
85
|
key = context.key;
|
|
@@ -14,7 +14,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
|
|
|
14
14
|
actionSubjectId: actionSubjectId,
|
|
15
15
|
attributes: _objectSpread({
|
|
16
16
|
packageName: "@atlaskit/emoji",
|
|
17
|
-
packageVersion: "70.11.
|
|
17
|
+
packageVersion: "70.11.1"
|
|
18
18
|
}, attributes)
|
|
19
19
|
};
|
|
20
20
|
};
|
|
@@ -119,11 +119,21 @@ export declare const messages: {
|
|
|
119
119
|
description: string;
|
|
120
120
|
id: string;
|
|
121
121
|
};
|
|
122
|
+
emojiPickerAddCustomEmoji: {
|
|
123
|
+
defaultMessage: string;
|
|
124
|
+
description: string;
|
|
125
|
+
id: string;
|
|
126
|
+
};
|
|
122
127
|
emojiPickerGrid: {
|
|
123
128
|
defaultMessage: string;
|
|
124
129
|
description: string;
|
|
125
130
|
id: string;
|
|
126
131
|
};
|
|
132
|
+
emojiPickerNoResults: {
|
|
133
|
+
defaultMessage: string;
|
|
134
|
+
description: string;
|
|
135
|
+
id: string;
|
|
136
|
+
};
|
|
127
137
|
emojiPickerListPanel: {
|
|
128
138
|
defaultMessage: string;
|
|
129
139
|
description: string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = "render-emoji-picker-no-results";
|
|
2
|
+
export interface Props {
|
|
3
|
+
onOpenUpload: () => void;
|
|
4
|
+
uploadEnabled: boolean;
|
|
5
|
+
}
|
|
6
|
+
declare const EmojiPickerNoResults: ({ onOpenUpload, uploadEnabled }: Props) => JSX.Element;
|
|
7
|
+
export default EmojiPickerNoResults;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import type { ReactNode } from 'react';
|
|
6
6
|
import { type Props as CategoryHeadingProps } from './EmojiPickerCategoryHeading';
|
|
7
7
|
import { type Props as EmojiRowProps } from './EmojiPickerEmojiRow';
|
|
8
|
+
import { type Props as NoResultsProps } from './EmojiPickerNoResults';
|
|
8
9
|
import type { VirtualItem as VirtualItemContext } from '@tanstack/react-virtual';
|
|
9
10
|
export interface RenderItem {
|
|
10
11
|
(context?: VirtualItemContext): ReactNode;
|
|
@@ -32,4 +33,8 @@ export declare class CategoryHeadingItem extends AbstractItem<CategoryHeadingPro
|
|
|
32
33
|
constructor(props: CategoryHeadingProps);
|
|
33
34
|
renderItem: () => JSX.Element;
|
|
34
35
|
}
|
|
35
|
-
export declare
|
|
36
|
+
export declare class NoResultsItem extends AbstractItem<NoResultsProps> {
|
|
37
|
+
constructor(props: NoResultsProps);
|
|
38
|
+
renderItem: () => JSX.Element;
|
|
39
|
+
}
|
|
40
|
+
export declare const virtualItemRenderer: (rows: VirtualItem<CategoryHeadingProps | EmojiRowProps | NoResultsProps | {}>[], context: VirtualItemContext) => JSX.Element;
|
|
@@ -119,11 +119,21 @@ export declare const messages: {
|
|
|
119
119
|
description: string;
|
|
120
120
|
id: string;
|
|
121
121
|
};
|
|
122
|
+
emojiPickerAddCustomEmoji: {
|
|
123
|
+
defaultMessage: string;
|
|
124
|
+
description: string;
|
|
125
|
+
id: string;
|
|
126
|
+
};
|
|
122
127
|
emojiPickerGrid: {
|
|
123
128
|
defaultMessage: string;
|
|
124
129
|
description: string;
|
|
125
130
|
id: string;
|
|
126
131
|
};
|
|
132
|
+
emojiPickerNoResults: {
|
|
133
|
+
defaultMessage: string;
|
|
134
|
+
description: string;
|
|
135
|
+
id: string;
|
|
136
|
+
};
|
|
127
137
|
emojiPickerListPanel: {
|
|
128
138
|
defaultMessage: string;
|
|
129
139
|
description: string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = "render-emoji-picker-no-results";
|
|
2
|
+
export interface Props {
|
|
3
|
+
onOpenUpload: () => void;
|
|
4
|
+
uploadEnabled: boolean;
|
|
5
|
+
}
|
|
6
|
+
declare const EmojiPickerNoResults: ({ onOpenUpload, uploadEnabled }: Props) => JSX.Element;
|
|
7
|
+
export default EmojiPickerNoResults;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import type { ReactNode } from 'react';
|
|
6
6
|
import { type Props as CategoryHeadingProps } from './EmojiPickerCategoryHeading';
|
|
7
7
|
import { type Props as EmojiRowProps } from './EmojiPickerEmojiRow';
|
|
8
|
+
import { type Props as NoResultsProps } from './EmojiPickerNoResults';
|
|
8
9
|
import type { VirtualItem as VirtualItemContext } from '@tanstack/react-virtual';
|
|
9
10
|
export interface RenderItem {
|
|
10
11
|
(context?: VirtualItemContext): ReactNode;
|
|
@@ -32,4 +33,8 @@ export declare class CategoryHeadingItem extends AbstractItem<CategoryHeadingPro
|
|
|
32
33
|
constructor(props: CategoryHeadingProps);
|
|
33
34
|
renderItem: () => JSX.Element;
|
|
34
35
|
}
|
|
35
|
-
export declare
|
|
36
|
+
export declare class NoResultsItem extends AbstractItem<NoResultsProps> {
|
|
37
|
+
constructor(props: NoResultsProps);
|
|
38
|
+
renderItem: () => JSX.Element;
|
|
39
|
+
}
|
|
40
|
+
export declare const virtualItemRenderer: (rows: VirtualItem<CategoryHeadingProps | EmojiRowProps | NoResultsProps | {}>[], context: VirtualItemContext) => JSX.Element;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/emoji",
|
|
3
|
-
"version": "70.11.
|
|
3
|
+
"version": "70.11.2",
|
|
4
4
|
"description": "Fabric emoji React components",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"@atlaskit/form": "^15.5.0",
|
|
46
46
|
"@atlaskit/heading": "^5.4.0",
|
|
47
47
|
"@atlaskit/icon": "^35.3.0",
|
|
48
|
+
"@atlaskit/image": "^3.0.0",
|
|
48
49
|
"@atlaskit/media-client": "^36.3.0",
|
|
49
50
|
"@atlaskit/media-client-react": "^5.1.0",
|
|
50
51
|
"@atlaskit/platform-feature-flags": "^1.1.0",
|