@atlaskit/emoji 69.3.4 → 69.3.5
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 +9 -0
- package/dist/cjs/components/common/EmojiDeletePreview.js +4 -18
- package/dist/cjs/components/common/LoadingEmojiComponent.js +2 -12
- package/dist/cjs/components/picker/EmojiPickerComponent.js +2 -31
- package/dist/cjs/components/picker/EmojiPickerList.js +3 -351
- package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +8 -26
- package/dist/cjs/components/typeahead/EmojiTypeAheadList.js +11 -37
- package/dist/cjs/util/analytics/analytics.js +1 -1
- package/dist/es2019/components/common/EmojiDeletePreview.js +4 -16
- package/dist/es2019/components/common/LoadingEmojiComponent.js +2 -10
- package/dist/es2019/components/picker/EmojiPickerComponent.js +3 -32
- package/dist/es2019/components/picker/EmojiPickerList.js +2 -323
- package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +7 -23
- package/dist/es2019/components/typeahead/EmojiTypeAheadList.js +13 -41
- package/dist/es2019/util/analytics/analytics.js +1 -1
- package/dist/esm/components/common/EmojiDeletePreview.js +4 -18
- package/dist/esm/components/common/LoadingEmojiComponent.js +2 -12
- package/dist/esm/components/picker/EmojiPickerComponent.js +3 -32
- package/dist/esm/components/picker/EmojiPickerList.js +3 -351
- package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +8 -26
- package/dist/esm/components/typeahead/EmojiTypeAheadList.js +11 -37
- package/dist/esm/util/analytics/analytics.js +1 -1
- package/dist/types/components/common/LoadingEmojiComponent.d.ts +0 -1
- package/dist/types/components/picker/EmojiPickerList.d.ts +2 -52
- package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +0 -1
- package/dist/types/components/typeahead/EmojiTypeAheadList.d.ts +0 -1
- package/dist/types-ts4.5/components/common/LoadingEmojiComponent.d.ts +0 -1
- package/dist/types-ts4.5/components/picker/EmojiPickerList.d.ts +2 -52
- package/dist/types-ts4.5/components/typeahead/EmojiTypeAheadComponent.d.ts +0 -1
- package/dist/types-ts4.5/components/typeahead/EmojiTypeAheadList.d.ts +0 -1
- package/package.json +1 -7
|
@@ -15,7 +15,6 @@ import CachingEmoji from './CachingEmoji';
|
|
|
15
15
|
import EmojiErrorMessage, { emojiErrorScreenreaderTestId } from './EmojiErrorMessage';
|
|
16
16
|
import RetryableButton from './RetryableButton';
|
|
17
17
|
import VisuallyHidden from '@atlaskit/visually-hidden';
|
|
18
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
19
18
|
const deleteFooter = null;
|
|
20
19
|
const deletePreview = null;
|
|
21
20
|
const deleteText = null;
|
|
@@ -55,22 +54,11 @@ class EmojiDeletePreview extends Component {
|
|
|
55
54
|
error: false
|
|
56
55
|
};
|
|
57
56
|
}
|
|
58
|
-
UNSAFE_componentWillUpdate(nextProps) {
|
|
59
|
-
if (!fg('platform_editor_react18_elements_emoji') || !fg('platform_editor_react18_elements_emoji_jira_bb')) {
|
|
60
|
-
if (nextProps.emoji.id !== this.props.emoji.id) {
|
|
61
|
-
this.setState({
|
|
62
|
-
error: false
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
57
|
componentDidUpdate(prevProps) {
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
});
|
|
73
|
-
}
|
|
58
|
+
if (prevProps.emoji.id !== this.props.emoji.id) {
|
|
59
|
+
this.setState({
|
|
60
|
+
error: false
|
|
61
|
+
});
|
|
74
62
|
}
|
|
75
63
|
}
|
|
76
64
|
render() {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
2
|
import { Component } from 'react';
|
|
3
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
4
3
|
/**
|
|
5
4
|
* A base class for components that don't want to start rendering
|
|
6
5
|
* until the EmojiProvider is resolved.
|
|
@@ -26,16 +25,9 @@ export default class LoadingEmojiComponent extends Component {
|
|
|
26
25
|
this.asyncLoadComponent();
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
|
-
UNSAFE_componentWillReceiveProps(nextProps) {
|
|
30
|
-
if (!fg('platform_editor_react18_elements_emoji') || !fg('platform_editor_react18_elements_emoji_jira_bb')) {
|
|
31
|
-
this.loadEmojiProvider(nextProps.emojiProvider);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
28
|
componentDidUpdate(prevProps) {
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
this.loadEmojiProvider(this.props.emojiProvider);
|
|
38
|
-
}
|
|
29
|
+
if (this.props !== prevProps) {
|
|
30
|
+
this.loadEmojiProvider(this.props.emojiProvider);
|
|
39
31
|
}
|
|
40
32
|
}
|
|
41
33
|
componentWillUnmount() {
|
|
@@ -16,12 +16,11 @@ import { uploadEmoji } from '../common/UploadEmoji';
|
|
|
16
16
|
import { createRecordSelectionDefault } from '../common/RecordSelectionDefault';
|
|
17
17
|
import CategorySelector from './CategorySelector';
|
|
18
18
|
import EmojiPickerFooter from './EmojiPickerFooter';
|
|
19
|
-
import {
|
|
19
|
+
import { EmojiPickerVirtualListInternal as EmojiPickerList } from './EmojiPickerList';
|
|
20
20
|
import { createAndFireEventInElementsChannel, categoryClickedEvent, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, selectedFileEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, toneSelectorClosedEvent, ufoExperiences } from '../../util/analytics';
|
|
21
21
|
import { useEmoji } from '../../hooks/useEmoji';
|
|
22
22
|
import { useIsMounted } from '../../hooks/useIsMounted';
|
|
23
23
|
import { messages } from '../i18n';
|
|
24
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
25
24
|
const emojiPickerBoxShadow = "var(--ds-shadow-overlay, 0 3px 6px rgba(0, 0, 0, 0.2))";
|
|
26
25
|
const emojiPickerHeight = 295;
|
|
27
26
|
const emojiPickerHeightWithPreview = 349; // emojiPickerHeight + emojiPickerPreviewHeight;
|
|
@@ -68,7 +67,7 @@ const EmojiPickerComponent = ({
|
|
|
68
67
|
const [uploadErrorMessage, setUploadErrorMessage] = useState();
|
|
69
68
|
const [emojiToDelete, setEmojiToDelete] = useState();
|
|
70
69
|
const [toneEmoji, setToneEmoji] = useState();
|
|
71
|
-
const emojiPickerList = useMemo(() =>
|
|
70
|
+
const emojiPickerList = useMemo(() => /*#__PURE__*/createRef(), []);
|
|
72
71
|
const openTime = useRef(0);
|
|
73
72
|
const isMounting = useRef(true);
|
|
74
73
|
const previousEmojiProvider = useRef(emojiProvider);
|
|
@@ -443,35 +442,7 @@ const EmojiPickerComponent = ({
|
|
|
443
442
|
dynamicCategories: dynamicCategories,
|
|
444
443
|
disableCategories: disableCategories,
|
|
445
444
|
onCategorySelected: onCategorySelected
|
|
446
|
-
}),
|
|
447
|
-
emojis: filteredEmojis,
|
|
448
|
-
currentUser: currentUser,
|
|
449
|
-
onEmojiSelected: recordUsageOnSelection,
|
|
450
|
-
onEmojiActive: onEmojiActive,
|
|
451
|
-
onEmojiDelete: onTriggerDelete,
|
|
452
|
-
onCategoryActivated: onCategoryActivated,
|
|
453
|
-
onSearch: onSearch,
|
|
454
|
-
query: query,
|
|
455
|
-
selectedTone: selectedTone,
|
|
456
|
-
loading: loading,
|
|
457
|
-
ref: emojiPickerList,
|
|
458
|
-
initialUploadName: query,
|
|
459
|
-
onToneSelected: onToneSelected,
|
|
460
|
-
onToneSelectorCancelled: onToneSelectorCancelled,
|
|
461
|
-
toneEmoji: toneEmoji,
|
|
462
|
-
uploading: uploading,
|
|
463
|
-
emojiToDelete: emojiToDelete,
|
|
464
|
-
uploadErrorMessage: formattedErrorMessage,
|
|
465
|
-
uploadEnabled: isUploadSupported && !uploading,
|
|
466
|
-
onUploadEmoji: onUploadEmoji,
|
|
467
|
-
onUploadCancelled: onUploadCancelled,
|
|
468
|
-
onDeleteEmoji: onDeleteEmoji,
|
|
469
|
-
onCloseDelete: onCloseDelete,
|
|
470
|
-
onFileChooserClicked: onFileChooserClicked,
|
|
471
|
-
onOpenUpload: onOpenUpload,
|
|
472
|
-
size: size,
|
|
473
|
-
activeCategoryId: activeCategory
|
|
474
|
-
}) : /*#__PURE__*/React.createElement(EmojiPickerListOld, {
|
|
445
|
+
}), /*#__PURE__*/React.createElement(EmojiPickerList, {
|
|
475
446
|
emojis: filteredEmojis,
|
|
476
447
|
currentUser: currentUser,
|
|
477
448
|
onEmojiSelected: recordUsageOnSelection,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import React, { createRef, PureComponent, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
1
|
+
import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
3
2
|
import { customCategory, defaultEmojiPickerSize, frequentCategory, searchCategory, userCustomTitle, yourUploadsCategory } from '../../util/constants';
|
|
4
3
|
import { CategoryDescriptionMap } from './categories';
|
|
5
4
|
import CategoryTracker from './CategoryTracker';
|
|
@@ -22,327 +21,7 @@ const categoryClassname = 'emoji-category';
|
|
|
22
21
|
*/
|
|
23
22
|
|
|
24
23
|
const byOrder = (orderableA, orderableB) => (orderableA.order || 0) - (orderableB.order || 0);
|
|
25
|
-
export
|
|
26
|
-
constructor(_props) {
|
|
27
|
-
super(_props);
|
|
28
|
-
_defineProperty(this, "virtualItems", []);
|
|
29
|
-
_defineProperty(this, "categoryTracker", new CategoryTracker());
|
|
30
|
-
_defineProperty(this, "listRef", /*#__PURE__*/createRef());
|
|
31
|
-
_defineProperty(this, "onEmojiActive", (emojiId, emoji) => {
|
|
32
|
-
if (this.props.onEmojiActive) {
|
|
33
|
-
this.props.onEmojiActive(emojiId, emoji);
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
_defineProperty(this, "onSearch", value => {
|
|
37
|
-
if (this.props.onSearch) {
|
|
38
|
-
this.props.onSearch(value);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
_defineProperty(this, "findEmojiRowAndColumnById", emojiId => {
|
|
42
|
-
let columnIndex = -1;
|
|
43
|
-
// for most of cases, it'd be in first emoji row, so should be quite fast to find in real world
|
|
44
|
-
let rowIndex = this.virtualItems.findIndex(rowItem => {
|
|
45
|
-
if (rowItem instanceof EmojisRowItem) {
|
|
46
|
-
// find uploaded emoji in each emoji row
|
|
47
|
-
columnIndex = rowItem.props.emojis.findIndex(emoji => emoji.id === emojiId);
|
|
48
|
-
return columnIndex !== -1;
|
|
49
|
-
}
|
|
50
|
-
return false;
|
|
51
|
-
});
|
|
52
|
-
return {
|
|
53
|
-
rowIndex,
|
|
54
|
-
columnIndex
|
|
55
|
-
};
|
|
56
|
-
});
|
|
57
|
-
_defineProperty(this, "buildVirtualItemFromGroup", group => {
|
|
58
|
-
const {
|
|
59
|
-
onEmojiSelected,
|
|
60
|
-
onEmojiDelete
|
|
61
|
-
} = this.props;
|
|
62
|
-
const items = [];
|
|
63
|
-
items.push(new CategoryHeadingItem({
|
|
64
|
-
id: group.category,
|
|
65
|
-
title: group.title,
|
|
66
|
-
className: categoryClassname
|
|
67
|
-
}));
|
|
68
|
-
let remainingEmojis = group.emojis;
|
|
69
|
-
while (remainingEmojis.length > 0) {
|
|
70
|
-
const rowEmojis = remainingEmojis.slice(0, sizes.emojiPerRow);
|
|
71
|
-
remainingEmojis = remainingEmojis.slice(sizes.emojiPerRow);
|
|
72
|
-
items.push(new EmojisRowItem({
|
|
73
|
-
category: group.category,
|
|
74
|
-
emojis: rowEmojis,
|
|
75
|
-
title: group.title,
|
|
76
|
-
showDelete: group.title === userCustomTitle,
|
|
77
|
-
onSelected: onEmojiSelected,
|
|
78
|
-
onDelete: onEmojiDelete,
|
|
79
|
-
onMouseMove: this.onEmojiActive,
|
|
80
|
-
onFocus: this.onEmojiActive
|
|
81
|
-
}));
|
|
82
|
-
}
|
|
83
|
-
return items;
|
|
84
|
-
});
|
|
85
|
-
_defineProperty(this, "buildVirtualItems", (props, _state) => {
|
|
86
|
-
const {
|
|
87
|
-
emojis,
|
|
88
|
-
loading,
|
|
89
|
-
query
|
|
90
|
-
} = props;
|
|
91
|
-
let items = [];
|
|
92
|
-
const prevFirstCategory = this.categoryTracker.getFirstCategory();
|
|
93
|
-
this.categoryTracker.reset();
|
|
94
|
-
if (loading) {
|
|
95
|
-
items.push(new LoadingItem());
|
|
96
|
-
} else {
|
|
97
|
-
if (query) {
|
|
98
|
-
const search = CategoryDescriptionMap.SEARCH;
|
|
99
|
-
// Only a single "result" category
|
|
100
|
-
items = [...items, ...this.buildVirtualItemFromGroup({
|
|
101
|
-
category: searchCategory,
|
|
102
|
-
title: search.name,
|
|
103
|
-
emojis,
|
|
104
|
-
order: search.order
|
|
105
|
-
})];
|
|
106
|
-
} else {
|
|
107
|
-
// Group by category
|
|
108
|
-
|
|
109
|
-
// Not searching show in categories.
|
|
110
|
-
this.allEmojiGroups.forEach(group => {
|
|
111
|
-
// Optimisation - avoid re-rendering unaffected groups for the current selectedShortcut
|
|
112
|
-
// by not passing it to irrelevant groups
|
|
113
|
-
this.categoryTracker.add(group.emojis[0].category, items.length);
|
|
114
|
-
items = [...items, ...this.buildVirtualItemFromGroup(group)];
|
|
115
|
-
if (group.category === yourUploadsCategory) {
|
|
116
|
-
this.lastYourUploadsRow = items.length - 1;
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// make sure virtualItems is up-to-date before calling onRowsRendered
|
|
123
|
-
this.virtualItems = items;
|
|
124
|
-
if (!loading && !query) {
|
|
125
|
-
if (this.categoryTracker.getFirstCategory() !== prevFirstCategory) {
|
|
126
|
-
this.onRowsRendered({
|
|
127
|
-
startIndex: 0
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
_defineProperty(this, "addToCategoryMap", (categoryToGroupMap, emoji, category) => {
|
|
133
|
-
if (!categoryToGroupMap[category]) {
|
|
134
|
-
const categoryDefinition = CategoryDescriptionMap[category];
|
|
135
|
-
categoryToGroupMap[category] = {
|
|
136
|
-
emojis: [],
|
|
137
|
-
title: categoryDefinition.name,
|
|
138
|
-
category,
|
|
139
|
-
order: categoryDefinition.order
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
categoryToGroupMap[category].emojis.push(emoji);
|
|
143
|
-
return categoryToGroupMap;
|
|
144
|
-
});
|
|
145
|
-
_defineProperty(this, "groupByCategory", currentUser => (categoryToGroupMap, emoji) => {
|
|
146
|
-
this.addToCategoryMap(categoryToGroupMap, emoji, emoji.category);
|
|
147
|
-
// separate user emojis
|
|
148
|
-
if (emoji.category === customCategory && currentUser && emoji.creatorUserId === currentUser.id) {
|
|
149
|
-
this.addToCategoryMap(categoryToGroupMap, emoji, yourUploadsCategory);
|
|
150
|
-
}
|
|
151
|
-
return categoryToGroupMap;
|
|
152
|
-
});
|
|
153
|
-
_defineProperty(this, "buildEmojiGroupedByCategory", (emojis, currentUser) => {
|
|
154
|
-
const categoryToGroupMap = emojis.reduce(this.groupByCategory(currentUser), {});
|
|
155
|
-
this.allEmojiGroups = Object.keys(categoryToGroupMap).map(key => categoryToGroupMap[key]).map(group => {
|
|
156
|
-
if (group.category !== frequentCategory) {
|
|
157
|
-
group.emojis.sort(byOrder);
|
|
158
|
-
}
|
|
159
|
-
return group;
|
|
160
|
-
}).sort(byOrder);
|
|
161
|
-
});
|
|
162
|
-
_defineProperty(this, "findCategoryToActivate", row => {
|
|
163
|
-
let category = null;
|
|
164
|
-
if (row instanceof CategoryHeadingItem) {
|
|
165
|
-
category = row.props.id;
|
|
166
|
-
} else if (row instanceof EmojisRowItem) {
|
|
167
|
-
category = row.props.category;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// your uploads is rendered, take it as upload category, so could be highlighted in category selector
|
|
171
|
-
if (category === yourUploadsCategory) {
|
|
172
|
-
return customCategory;
|
|
173
|
-
// search results is rendered, return null so won't be highlighted for category selector
|
|
174
|
-
} else if (category === searchCategory) {
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
return category;
|
|
178
|
-
});
|
|
179
|
-
/**
|
|
180
|
-
* onRowsRendered callback function
|
|
181
|
-
*
|
|
182
|
-
* Check the category of top of rendered row and inform category selector to change active category
|
|
183
|
-
* Rove index of emoji picker list
|
|
184
|
-
*/
|
|
185
|
-
_defineProperty(this, "onRowsRendered", indexes => {
|
|
186
|
-
const {
|
|
187
|
-
startIndex
|
|
188
|
-
} = indexes;
|
|
189
|
-
const rowItem = this.virtualItems[startIndex];
|
|
190
|
-
const list = this.listRef.current;
|
|
191
|
-
|
|
192
|
-
// update tabIndex manually, startIndex is not 0 based here
|
|
193
|
-
if (rowItem instanceof CategoryHeadingItem) {
|
|
194
|
-
// if top of row rendered is category heading, update tabIndex for the next emoji row
|
|
195
|
-
list === null || list === void 0 ? void 0 : list.updateFocusIndex(startIndex + 1);
|
|
196
|
-
} else if (rowItem instanceof EmojisRowItem) {
|
|
197
|
-
// if top of row rendered is emoji row, update it's tabIndex.
|
|
198
|
-
list === null || list === void 0 ? void 0 : list.updateFocusIndex(startIndex);
|
|
199
|
-
}
|
|
200
|
-
if (!this.props.query) {
|
|
201
|
-
// Calculate category in view - only relevant if categories shown, i.e. no query
|
|
202
|
-
const currentCategory = this.findCategoryToActivate(rowItem);
|
|
203
|
-
if (currentCategory !== null && this.props.activeCategoryId !== currentCategory) {
|
|
204
|
-
if (this.props.onCategoryActivated) {
|
|
205
|
-
this.props.onCategoryActivated(currentCategory);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
_defineProperty(this, "rowSize", index => {
|
|
211
|
-
var _this$virtualItems$in;
|
|
212
|
-
return ((_this$virtualItems$in = this.virtualItems[index]) === null || _this$virtualItems$in === void 0 ? void 0 : _this$virtualItems$in.height) || sizes.categoryHeadingHeight;
|
|
213
|
-
});
|
|
214
|
-
_defineProperty(this, "renderRow", context => {
|
|
215
|
-
return virtualItemRenderer(this.virtualItems, context);
|
|
216
|
-
});
|
|
217
|
-
/**
|
|
218
|
-
* After deleting emoji, we'll update the focus index to the first emoji of last row of your uploads, so when user navigate back focus will still work
|
|
219
|
-
* if last emoji in your uploads is deleted, the updated focus index will be outdated, as there will be no your uploads section
|
|
220
|
-
* however, it'll trigger onChange from VirtualList, which will update focus index automatically for us
|
|
221
|
-
*/
|
|
222
|
-
_defineProperty(this, "handleOnCloseDelete", () => {
|
|
223
|
-
const list = this.listRef.current;
|
|
224
|
-
list === null || list === void 0 ? void 0 : list.updateFocusIndex(this.lastYourUploadsRow);
|
|
225
|
-
this.props.onCloseDelete();
|
|
226
|
-
});
|
|
227
|
-
this.lastYourUploadsRow = 0;
|
|
228
|
-
this.buildEmojiGroupedByCategory(_props.emojis, _props.currentUser);
|
|
229
|
-
this.buildVirtualItems(_props, this.state);
|
|
230
|
-
}
|
|
231
|
-
UNSAFE_componentWillUpdate(nextProps, nextState) {
|
|
232
|
-
if (this.props.emojis !== nextProps.emojis || this.props.selectedTone !== nextProps.selectedTone || this.props.loading !== nextProps.loading || this.props.query !== nextProps.query) {
|
|
233
|
-
if (!nextProps.query) {
|
|
234
|
-
// Only refresh if no query
|
|
235
|
-
this.buildEmojiGroupedByCategory(nextProps.emojis, nextProps.currentUser);
|
|
236
|
-
}
|
|
237
|
-
this.buildVirtualItems(nextProps, nextState);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Scrolls to a category in the list view
|
|
242
|
-
*/
|
|
243
|
-
reveal(category) {
|
|
244
|
-
const row = this.categoryTracker.getRow(category);
|
|
245
|
-
this.scrollToRow(row);
|
|
246
|
-
}
|
|
247
|
-
scrollToBottom() {
|
|
248
|
-
this.scrollToRow(this.virtualItems.length);
|
|
249
|
-
}
|
|
250
|
-
scrollToTop() {
|
|
251
|
-
this.scrollToRow(0);
|
|
252
|
-
}
|
|
253
|
-
scrollToRow(index) {
|
|
254
|
-
var _this$listRef$current;
|
|
255
|
-
(_this$listRef$current = this.listRef.current) === null || _this$listRef$current === void 0 ? void 0 : _this$listRef$current.scrollToRow(index);
|
|
256
|
-
}
|
|
257
|
-
scrollToRecentlyUploaded(uploadedEmoji) {
|
|
258
|
-
// when search results is shown
|
|
259
|
-
if (this.props.query) {
|
|
260
|
-
const {
|
|
261
|
-
rowIndex,
|
|
262
|
-
columnIndex
|
|
263
|
-
} = this.findEmojiRowAndColumnById(uploadedEmoji.id);
|
|
264
|
-
if (rowIndex !== -1) {
|
|
265
|
-
var _this$listRef$current2;
|
|
266
|
-
(_this$listRef$current2 = this.listRef.current) === null || _this$listRef$current2 === void 0 ? void 0 : _this$listRef$current2.scrollToEmojiAndFocus(rowIndex, columnIndex);
|
|
267
|
-
}
|
|
268
|
-
} else {
|
|
269
|
-
// when seeing all emojis
|
|
270
|
-
const row = this.lastYourUploadsRow;
|
|
271
|
-
if (row > 0) {
|
|
272
|
-
var _this$listRef$current3;
|
|
273
|
-
(_this$listRef$current3 = this.listRef.current) === null || _this$listRef$current3 === void 0 ? void 0 : _this$listRef$current3.scrollToRowAndFocusLastEmoji(this.lastYourUploadsRow);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
render() {
|
|
278
|
-
const {
|
|
279
|
-
query,
|
|
280
|
-
selectedTone,
|
|
281
|
-
onToneSelected,
|
|
282
|
-
onToneSelectorCancelled,
|
|
283
|
-
toneEmoji,
|
|
284
|
-
uploading,
|
|
285
|
-
uploadEnabled,
|
|
286
|
-
emojiToDelete,
|
|
287
|
-
initialUploadName,
|
|
288
|
-
uploadErrorMessage,
|
|
289
|
-
onUploadCancelled,
|
|
290
|
-
onUploadEmoji,
|
|
291
|
-
onDeleteEmoji,
|
|
292
|
-
onFileChooserClicked,
|
|
293
|
-
onOpenUpload,
|
|
294
|
-
size = defaultEmojiPickerSize,
|
|
295
|
-
emojis
|
|
296
|
-
} = this.props;
|
|
297
|
-
const virtualListHeight = sizes.listHeight + emojiPickerHeightOffset(size);
|
|
298
|
-
return /*#__PURE__*/React.createElement(EmojiPickerTabPanel, {
|
|
299
|
-
showSearchResults: !!query
|
|
300
|
-
}, /*#__PURE__*/React.createElement(EmojiActions, {
|
|
301
|
-
selectedTone: selectedTone,
|
|
302
|
-
onToneSelected: onToneSelected,
|
|
303
|
-
onToneSelectorCancelled: onToneSelectorCancelled,
|
|
304
|
-
toneEmoji: toneEmoji,
|
|
305
|
-
uploading: uploading,
|
|
306
|
-
uploadEnabled: uploadEnabled,
|
|
307
|
-
emojiToDelete: emojiToDelete,
|
|
308
|
-
initialUploadName: initialUploadName,
|
|
309
|
-
uploadErrorMessage: uploadErrorMessage,
|
|
310
|
-
onUploadCancelled: onUploadCancelled,
|
|
311
|
-
onUploadEmoji: onUploadEmoji,
|
|
312
|
-
onCloseDelete: this.handleOnCloseDelete,
|
|
313
|
-
onDeleteEmoji: onDeleteEmoji,
|
|
314
|
-
onFileChooserClicked: onFileChooserClicked,
|
|
315
|
-
onOpenUpload: onOpenUpload,
|
|
316
|
-
query: query,
|
|
317
|
-
onChange: this.onSearch,
|
|
318
|
-
resultsCount: emojis.length
|
|
319
|
-
}), /*#__PURE__*/React.createElement(EmojiPickerListContextProvider, {
|
|
320
|
-
initialEmojisFocus: {
|
|
321
|
-
rowIndex: 1,
|
|
322
|
-
columnIndex: 0
|
|
323
|
-
}
|
|
324
|
-
}, /*#__PURE__*/React.createElement(VirtualList, {
|
|
325
|
-
ref: this.listRef,
|
|
326
|
-
height: virtualListHeight,
|
|
327
|
-
overscanRowCount: 10,
|
|
328
|
-
rowCount: this.virtualItems.length,
|
|
329
|
-
rowHeight: this.rowSize,
|
|
330
|
-
rowRenderer: this.renderRow,
|
|
331
|
-
scrollToAlignment: "start",
|
|
332
|
-
width: sizes.listWidth,
|
|
333
|
-
onRowsRendered: this.onRowsRendered
|
|
334
|
-
})));
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
_defineProperty(EmojiPickerVirtualListInternalOld, "defaultProps", {
|
|
338
|
-
onEmojiSelected: () => {},
|
|
339
|
-
onEmojiActive: () => {},
|
|
340
|
-
onEmojiDelete: () => {},
|
|
341
|
-
onCategoryActivated: () => {},
|
|
342
|
-
onSearch: () => {},
|
|
343
|
-
size: defaultEmojiPickerSize
|
|
344
|
-
});
|
|
345
|
-
export const EmojiPickerVirtualListInternalNew = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
24
|
+
export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
346
25
|
const {
|
|
347
26
|
emojis,
|
|
348
27
|
currentUser,
|
|
@@ -12,7 +12,6 @@ import { toEmojiId } from '../../util/type-helpers';
|
|
|
12
12
|
import { createRecordSelectionDefault } from '../common/RecordSelectionDefault';
|
|
13
13
|
import EmojiList from './EmojiTypeAheadList';
|
|
14
14
|
import { emojiTypeAhead } from './styles';
|
|
15
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
16
15
|
const isFullShortName = query => query && query.length > 1 && query.charAt(0) === ':' && query.charAt(query.length - 1) === ':';
|
|
17
16
|
const uniqueExactShortNameMatchIndex = (searchResult, query) => {
|
|
18
17
|
if (!query) {
|
|
@@ -160,31 +159,16 @@ export default class EmojiTypeAheadComponent extends PureComponent {
|
|
|
160
159
|
this.sessionId = uuid();
|
|
161
160
|
this.selected = false;
|
|
162
161
|
}
|
|
163
|
-
|
|
164
|
-
if (
|
|
165
|
-
const prevEmojiProvider =
|
|
166
|
-
const nextEmojiProvider =
|
|
162
|
+
componentDidUpdate(prevProps) {
|
|
163
|
+
if (prevProps !== this.props) {
|
|
164
|
+
const prevEmojiProvider = prevProps.emojiProvider;
|
|
165
|
+
const nextEmojiProvider = this.props.emojiProvider;
|
|
167
166
|
if (prevEmojiProvider !== nextEmojiProvider) {
|
|
168
167
|
prevEmojiProvider.unsubscribe(this.onProviderChange);
|
|
169
168
|
nextEmojiProvider.subscribe(this.onProviderChange);
|
|
170
|
-
this.onSearch(
|
|
171
|
-
} else if (
|
|
172
|
-
this.onSearch(
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
componentDidUpdate(prevProps) {
|
|
177
|
-
if (fg('platform_editor_react18_elements_emoji') || fg('platform_editor_react18_elements_emoji_jira_bb')) {
|
|
178
|
-
if (prevProps !== this.props) {
|
|
179
|
-
const prevEmojiProvider = prevProps.emojiProvider;
|
|
180
|
-
const nextEmojiProvider = this.props.emojiProvider;
|
|
181
|
-
if (prevEmojiProvider !== nextEmojiProvider) {
|
|
182
|
-
prevEmojiProvider.unsubscribe(this.onProviderChange);
|
|
183
|
-
nextEmojiProvider.subscribe(this.onProviderChange);
|
|
184
|
-
this.onSearch(this.props.query);
|
|
185
|
-
} else if (prevProps.query !== this.props.query) {
|
|
186
|
-
this.onSearch(this.props.query);
|
|
187
|
-
}
|
|
169
|
+
this.onSearch(this.props.query);
|
|
170
|
+
} else if (prevProps.query !== this.props.query) {
|
|
171
|
+
this.onSearch(this.props.query);
|
|
188
172
|
}
|
|
189
173
|
}
|
|
190
174
|
}
|
|
@@ -6,7 +6,6 @@ import debug from '../../util/logger';
|
|
|
6
6
|
import { actualMouseMove, mouseLocation } from '../../util/mouse';
|
|
7
7
|
import Scrollable from '../common/Scrollable';
|
|
8
8
|
import EmojiItem from './EmojiTypeAheadItem';
|
|
9
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
10
9
|
import { EmojiTypeAheadListContainer } from './EmojiTypeAheadListContainer';
|
|
11
10
|
import { EmojiTypeAheadSpinner } from './EmojiTypeAheadSpinner';
|
|
12
11
|
function wrapIndex(emojis, index) {
|
|
@@ -77,31 +76,6 @@ export default class EmojiTypeAheadList extends PureComponent {
|
|
|
77
76
|
selectedIndex: 0
|
|
78
77
|
};
|
|
79
78
|
}
|
|
80
|
-
UNSAFE_componentWillReceiveProps(nextProps) {
|
|
81
|
-
if (!fg('platform_editor_react18_elements_emoji') || !fg('platform_editor_react18_elements_emoji_jira_bb')) {
|
|
82
|
-
// adjust selection
|
|
83
|
-
const {
|
|
84
|
-
emojis
|
|
85
|
-
} = nextProps;
|
|
86
|
-
const {
|
|
87
|
-
selectedKey
|
|
88
|
-
} = this.state;
|
|
89
|
-
if (!selectedKey) {
|
|
90
|
-
// go with default of selecting first item
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
for (let i = 0; i < emojis.length; i++) {
|
|
94
|
-
if (selectedKey === emojis[i].id) {
|
|
95
|
-
this.setState({
|
|
96
|
-
selectedIndex: i
|
|
97
|
-
});
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// existing selection not in results, pick first
|
|
102
|
-
this.selectIndexNewEmoji(0, emojis);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
79
|
componentDidUpdate(prevProps) {
|
|
106
80
|
const {
|
|
107
81
|
emojis
|
|
@@ -114,24 +88,22 @@ export default class EmojiTypeAheadList extends PureComponent {
|
|
|
114
88
|
const selectedEmoji = emojis[selectedIndex];
|
|
115
89
|
this.revealItem(selectedEmoji.id || selectedEmoji.shortName);
|
|
116
90
|
}
|
|
117
|
-
if (
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
91
|
+
if (prevProps !== this.props) {
|
|
92
|
+
// adjust selection
|
|
93
|
+
if (!selectedKey) {
|
|
94
|
+
// go with default of selecting first item
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
for (let i = 0; i < emojis.length; i++) {
|
|
98
|
+
if (selectedKey === emojis[i].id) {
|
|
99
|
+
this.setState({
|
|
100
|
+
selectedIndex: i
|
|
101
|
+
});
|
|
122
102
|
return;
|
|
123
103
|
}
|
|
124
|
-
for (let i = 0; i < emojis.length; i++) {
|
|
125
|
-
if (selectedKey === emojis[i].id) {
|
|
126
|
-
this.setState({
|
|
127
|
-
selectedIndex: i
|
|
128
|
-
});
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// existing selection not in results, pick first
|
|
133
|
-
this.selectIndexNewEmoji(0, emojis);
|
|
134
104
|
}
|
|
105
|
+
// existing selection not in results, pick first
|
|
106
|
+
this.selectIndexNewEmoji(0, emojis);
|
|
135
107
|
}
|
|
136
108
|
}
|
|
137
109
|
// Internal
|
|
@@ -22,7 +22,6 @@ import CachingEmoji from './CachingEmoji';
|
|
|
22
22
|
import EmojiErrorMessage, { emojiErrorScreenreaderTestId } from './EmojiErrorMessage';
|
|
23
23
|
import RetryableButton from './RetryableButton';
|
|
24
24
|
import VisuallyHidden from '@atlaskit/visually-hidden';
|
|
25
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
26
25
|
var deleteFooter = null;
|
|
27
26
|
var deletePreview = null;
|
|
28
27
|
var deleteText = null;
|
|
@@ -66,25 +65,12 @@ var EmojiDeletePreview = /*#__PURE__*/function (_Component) {
|
|
|
66
65
|
}
|
|
67
66
|
_inherits(EmojiDeletePreview, _Component);
|
|
68
67
|
return _createClass(EmojiDeletePreview, [{
|
|
69
|
-
key: "UNSAFE_componentWillUpdate",
|
|
70
|
-
value: function UNSAFE_componentWillUpdate(nextProps) {
|
|
71
|
-
if (!fg('platform_editor_react18_elements_emoji') || !fg('platform_editor_react18_elements_emoji_jira_bb')) {
|
|
72
|
-
if (nextProps.emoji.id !== this.props.emoji.id) {
|
|
73
|
-
this.setState({
|
|
74
|
-
error: false
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}, {
|
|
80
68
|
key: "componentDidUpdate",
|
|
81
69
|
value: function componentDidUpdate(prevProps) {
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
87
|
-
}
|
|
70
|
+
if (prevProps.emoji.id !== this.props.emoji.id) {
|
|
71
|
+
this.setState({
|
|
72
|
+
error: false
|
|
73
|
+
});
|
|
88
74
|
}
|
|
89
75
|
}
|
|
90
76
|
}, {
|
|
@@ -7,7 +7,6 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
|
7
7
|
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
8
8
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
9
9
|
import { Component } from 'react';
|
|
10
|
-
import { fg } from '@atlaskit/platform-feature-flags';
|
|
11
10
|
/**
|
|
12
11
|
* A base class for components that don't want to start rendering
|
|
13
12
|
* until the EmojiProvider is resolved.
|
|
@@ -41,20 +40,11 @@ var LoadingEmojiComponent = /*#__PURE__*/function (_Component) {
|
|
|
41
40
|
this.asyncLoadComponent();
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
|
-
}, {
|
|
45
|
-
key: "UNSAFE_componentWillReceiveProps",
|
|
46
|
-
value: function UNSAFE_componentWillReceiveProps(nextProps) {
|
|
47
|
-
if (!fg('platform_editor_react18_elements_emoji') || !fg('platform_editor_react18_elements_emoji_jira_bb')) {
|
|
48
|
-
this.loadEmojiProvider(nextProps.emojiProvider);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
43
|
}, {
|
|
52
44
|
key: "componentDidUpdate",
|
|
53
45
|
value: function componentDidUpdate(prevProps) {
|
|
54
|
-
if (
|
|
55
|
-
|
|
56
|
-
this.loadEmojiProvider(this.props.emojiProvider);
|
|
57
|
-
}
|
|
46
|
+
if (this.props !== prevProps) {
|
|
47
|
+
this.loadEmojiProvider(this.props.emojiProvider);
|
|
58
48
|
}
|
|
59
49
|
}
|
|
60
50
|
}, {
|