Skip to content

Commit 19a630c

Browse files
sm-sayedignprice
andcommitted
autocomplete [nfc]: Introduce a field for sorted users
This field will be used to maintain a list of sorted users based on the most relevant autocomplete criteria in the upcoming commits. Co-authored-by: Greg Price <[email protected]>
1 parent 03fe9fb commit 19a630c

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

lib/model/autocomplete.dart

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,14 @@ class AutocompleteViewManager {
148148
autocompleteDataCache.invalidateUser(event.userId);
149149
}
150150

151+
void handleMessageEvent(MessageEvent event) {
152+
_refreshStaleUserResults();
153+
}
154+
155+
void handleOlderMessages() {
156+
_refreshStaleUserResults();
157+
}
158+
151159
/// Called when the app is reassembled during debugging, e.g. for hot reload.
152160
///
153161
/// Calls [MentionAutocompleteView.reassemble] for all that are registered.
@@ -193,6 +201,7 @@ class MentionAutocompleteView extends ChangeNotifier {
193201
@override
194202
void dispose() {
195203
store.autocompleteViewManager.unregisterMentionAutocomplete(this);
204+
_sortedUsers = null;
196205
// We cancel in-progress computations by checking [hasListeners] between tasks.
197206
// After [super.dispose] is called, [hasListeners] returns false.
198207
// TODO test that logic (may involve detecting an unhandled Future rejection; how?)
@@ -216,6 +225,7 @@ class MentionAutocompleteView extends ChangeNotifier {
216225
/// Called in particular when we get a [RealmUserEvent].
217226
void refreshStaleUserResults() {
218227
if (_query != null) {
228+
_sortedUsers = null;
219229
_startSearch(_query!);
220230
}
221231
}
@@ -225,6 +235,7 @@ class MentionAutocompleteView extends ChangeNotifier {
225235
/// This will redo the search from scratch for the current query, if any.
226236
void reassemble() {
227237
if (_query != null) {
238+
_sortedUsers = null;
228239
_startSearch(_query!);
229240
}
230241
}
@@ -254,22 +265,43 @@ class MentionAutocompleteView extends ChangeNotifier {
254265
notifyListeners();
255266
}
256267

268+
List<User>? _sortedUsers;
269+
270+
List<User> sortByRelevance({required List<User> users}) {
271+
return users;
272+
}
273+
274+
void _sortUsers() {
275+
final users = store.users.values.toList();
276+
_sortedUsers = sortByRelevance(users: users);
277+
}
278+
257279
Future<List<MentionAutocompleteResult>?> _computeResults(MentionAutocompleteQuery query) async {
258280
final List<MentionAutocompleteResult> results = [];
259-
final Iterable<User> users = store.users.values;
260281

261-
final iterator = users.iterator;
282+
if (_sortedUsers == null) {
283+
_sortUsers();
284+
}
285+
286+
final sortedUsers = _sortedUsers!;
287+
final iterator = sortedUsers.iterator;
262288
bool isDone = false;
263289
while (!isDone) {
264290
// CPU perf: End this task; enqueue a new one for resuming this work
265291
await Future(() {});
266292

293+
if (_sortedUsers != sortedUsers) {
294+
// The list of users this loop has been working from has become stale.
295+
// Abort so _startSearch can retry with the new list.
296+
throw ConcurrentModificationError();
297+
}
298+
267299
if (query != _query || !hasListeners) { // false if [dispose] has been called.
268300
return null;
269301
}
270302

271303
for (int i = 0; i < 1000; i++) {
272-
if (!iterator.moveNext()) { // Can throw ConcurrentModificationError
304+
if (!iterator.moveNext()) {
273305
isDone = true;
274306
break;
275307
}
@@ -280,7 +312,7 @@ class MentionAutocompleteView extends ChangeNotifier {
280312
}
281313
}
282314
}
283-
return results; // TODO(#228) sort for most relevant first
315+
return results;
284316
}
285317
}
286318

lib/model/message_list.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,8 @@ class MessageListView with ChangeNotifier, _MessageSequence {
417417
? result.messages // Avoid unnecessarily copying the list.
418418
: result.messages.where(_messageVisible);
419419

420+
store.autocompleteViewManager.handleOlderMessages();
421+
420422
_insertAllMessages(0, fetchedMessages);
421423
_haveOldest = result.foundOldest;
422424
} finally {

lib/model/store.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ class PerAccountStore extends ChangeNotifier with StreamStore {
437437
} else if (event is MessageEvent) {
438438
assert(debugLog("server event: message ${jsonEncode(event.message.toJson())}"));
439439
recentDmConversationsView.handleMessageEvent(event);
440+
autocompleteViewManager.handleMessageEvent(event);
440441
for (final view in _messageListViews) {
441442
view.maybeAddMessage(event.message);
442443
}

0 commit comments

Comments
 (0)