Skip to content

Commit cefaf97

Browse files
committed
autocomplete: Sort user-mention autocomplete results
Fixes: #228
1 parent 43561bf commit cefaf97

File tree

3 files changed

+44
-3
lines changed

3 files changed

+44
-3
lines changed

lib/model/autocomplete.dart

+20-3
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,23 @@ class MentionAutocompleteView extends ChangeNotifier {
246246

247247
Future<List<MentionAutocompleteResult>?> _computeResults(MentionAutocompleteQuery query) async {
248248
final List<MentionAutocompleteResult> results = [];
249-
final Iterable<User> users = store.users.values;
249+
final Set<int> userIds;
250+
251+
switch (narrow) {
252+
case AllMessagesNarrow():
253+
userIds = {};
254+
case StreamNarrow():
255+
userIds = store.dmUserIds;
256+
userIds.addAll(store.streamUserIds[(narrow as StreamNarrow).streamId] ?? {});
257+
case TopicNarrow():
258+
userIds = store.dmUserIds;
259+
userIds.addAll(store.streamUserIds[(narrow as TopicNarrow).streamId] ?? {});
260+
case DmNarrow():
261+
userIds = store.dmUserIds;
262+
}
263+
264+
final users = Set.from(userIds.map((id) => store.users[id]!));
265+
users.addAll(store.users.values);
250266

251267
final iterator = users.iterator;
252268
bool isDone = false;
@@ -266,7 +282,7 @@ class MentionAutocompleteView extends ChangeNotifier {
266282

267283
final User user = iterator.current;
268284
if (query.testUser(user, store.autocompleteViewManager.autocompleteDataCache)) {
269-
results.add(UserMentionAutocompleteResult(userId: user.userId));
285+
results.add(UserMentionAutocompleteResult(userId: user.userId, fullName: user.fullName));
270286
}
271287
}
272288
}
@@ -344,9 +360,10 @@ class AutocompleteDataCache {
344360
sealed class MentionAutocompleteResult {}
345361

346362
class UserMentionAutocompleteResult extends MentionAutocompleteResult {
347-
UserMentionAutocompleteResult({required this.userId});
363+
UserMentionAutocompleteResult({required this.userId, required this.fullName});
348364

349365
final int userId;
366+
final String fullName;
350367
}
351368

352369
// TODO(#233): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult {

lib/model/message_list.dart

+1
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
382382
if (_messageVisible(message)) {
383383
_addMessage(message);
384384
}
385+
store.getMessageUsers(message);
385386
}
386387
_fetched = true;
387388
_haveOldest = result.foundOldest;

lib/model/store.dart

+23
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,12 @@ class PerAccountStore extends ChangeNotifier with StreamStore {
287287

288288
final Map<int, User> users;
289289

290+
Map<int, Set<int>> get streamUserIds => {..._streamUserIds};
291+
final Map<int, Set<int>> _streamUserIds = {};
292+
293+
Set<int> get dmUserIds => {..._dmUserIds};
294+
Set<int> _dmUserIds = {};
295+
290296
////////////////////////////////
291297
// Streams, topics, and stuff about them.
292298

@@ -353,6 +359,22 @@ class PerAccountStore extends ChangeNotifier with StreamStore {
353359
super.dispose();
354360
}
355361

362+
void getMessageUsers(Message message) {
363+
if (message is StreamMessage) {
364+
Set<int> userIds = _streamUserIds[message.streamId] ?? {};
365+
if (message.senderId == selfUserId) return;
366+
userIds = {message.senderId}..addAll(userIds);
367+
_streamUserIds[message.streamId] = userIds;
368+
} else {
369+
final desiredId = message.senderId == selfUserId
370+
? message.recipientId
371+
: message.senderId;
372+
_dmUserIds = {desiredId}..addAll(_dmUserIds);
373+
}
374+
debugLog('streamUsers: $_streamUserIds');
375+
debugLog('dmUsers: $_dmUserIds');
376+
}
377+
356378
void handleEvent(Event event) {
357379
if (event is HeartbeatEvent) {
358380
assert(debugLog("server event: heartbeat"));
@@ -436,6 +458,7 @@ class PerAccountStore extends ChangeNotifier with StreamStore {
436458
notifyListeners();
437459
} else if (event is MessageEvent) {
438460
assert(debugLog("server event: message ${jsonEncode(event.message.toJson())}"));
461+
getMessageUsers(event.message);
439462
recentDmConversationsView.handleMessageEvent(event);
440463
for (final view in _messageListViews) {
441464
view.maybeAddMessage(event.message);

0 commit comments

Comments
 (0)