Skip to content

Commit 661fa53

Browse files
gnpricechrisbobbe
authored andcommitted
emoji: Exclude deactivated realm emoji from autocomplete
Fixes #1113.
1 parent 73b9ef5 commit 661fa53

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

lib/model/emoji.dart

+12-5
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,16 @@ class EmojiStoreImpl with EmojiStore {
135135
/// including deactivated emoji not available for new uses.
136136
///
137137
/// These are the emoji that can have [ReactionType.realmEmoji].
138-
// TODO(#1113) limit to active realm emoji where appropriate
138+
///
139+
/// For emoji available to be newly used, see [activeRealmEmoji].
139140
Map<String, RealmEmojiItem> allRealmEmoji;
140141

142+
/// The realm's custom emoji that are available for new uses
143+
/// in messages and reactions.
144+
Iterable<RealmEmojiItem> get activeRealmEmoji {
145+
return allRealmEmoji.values.where((emoji) => !emoji.deactivated);
146+
}
147+
141148
/// The realm-relative URL of the unique "Zulip extra emoji", :zulip:.
142149
static const kZulipEmojiUrl = '/static/generated/emoji/images/emoji/unicode/zulip.png';
143150

@@ -218,7 +225,7 @@ class EmojiStoreImpl with EmojiStore {
218225
final results = <EmojiCandidate>[];
219226

220227
final namesOverridden = {
221-
for (final emoji in allRealmEmoji.values) emoji.name,
228+
for (final emoji in activeRealmEmoji) emoji.name,
222229
'zulip',
223230
};
224231
// TODO(log) if _serverEmojiData missing
@@ -242,16 +249,16 @@ class EmojiStoreImpl with EmojiStore {
242249
aliases: aliases));
243250
}
244251

245-
for (final entry in allRealmEmoji.entries) {
246-
final emojiName = entry.value.name;
252+
for (final emoji in activeRealmEmoji) {
253+
final emojiName = emoji.name;
247254
if (emojiName == 'zulip') {
248255
// TODO does 'zulip' really override realm emoji?
249256
// (This is copied from zulip-mobile's behavior.)
250257
continue;
251258
}
252259
results.add(_emojiCandidateFor(
253260
emojiType: ReactionType.realmEmoji,
254-
emojiCode: entry.key, emojiName: emojiName,
261+
emojiCode: emoji.emojiCode, emojiName: emojiName,
255262
aliases: null));
256263
}
257264

test/model/emoji_test.dart

+37
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,31 @@ void main() {
123123
return store;
124124
}
125125

126+
test('realm emoji included only when active', () {
127+
final store = prepare(realmEmoji: {
128+
'1': eg.realmEmojiItem(emojiCode: '1', emojiName: 'abc', deactivated: true),
129+
'2': eg.realmEmojiItem(emojiCode: '2', emojiName: 'abcd'),
130+
});
131+
check(store.allEmojiCandidates()).deepEquals([
132+
isRealmCandidate(emojiCode: '2', emojiName: 'abcd'),
133+
isZulipCandidate(),
134+
]);
135+
});
136+
137+
test('realm emoji tolerate name collisions', () {
138+
final store = prepare(realmEmoji: {
139+
'1': eg.realmEmojiItem(emojiCode: '1', emojiName: 'test', deactivated: true),
140+
'2': eg.realmEmojiItem(emojiCode: '2', emojiName: 'try', deactivated: true),
141+
'3': eg.realmEmojiItem(emojiCode: '3', emojiName: 'try', deactivated: true),
142+
'4': eg.realmEmojiItem(emojiCode: '4', emojiName: 'try'),
143+
'5': eg.realmEmojiItem(emojiCode: '5', emojiName: 'test', deactivated: true),
144+
});
145+
check(store.allEmojiCandidates()).deepEquals([
146+
isRealmCandidate(emojiCode: '4', emojiName: 'try'),
147+
isZulipCandidate(),
148+
]);
149+
});
150+
126151
test('realm emoji overrides Unicode emoji', () {
127152
final store = prepare(realmEmoji: {
128153
'1': eg.realmEmojiItem(emojiCode: '1', emojiName: 'smiley'),
@@ -137,6 +162,18 @@ void main() {
137162
]);
138163
});
139164

165+
test('deactivated realm emoji cause no override of Unicode emoji', () {
166+
final store = prepare(realmEmoji: {
167+
'1': eg.realmEmojiItem(emojiCode: '1', emojiName: 'ant', deactivated: true),
168+
}, unicodeEmoji: {
169+
'1f41c': ['ant'],
170+
});
171+
check(store.allEmojiCandidates()).deepEquals([
172+
isUnicodeCandidate('1f41c', ['ant']),
173+
isZulipCandidate(),
174+
]);
175+
});
176+
140177
test('Unicode emoji with overridden aliases survives with remaining names', () {
141178
final store = prepare(realmEmoji: {
142179
'1': eg.realmEmojiItem(emojiCode: '1', emojiName: 'tangerine'),

0 commit comments

Comments
 (0)