@@ -148,6 +148,14 @@ class AutocompleteViewManager {
148
148
autocompleteDataCache.invalidateUser (event.userId);
149
149
}
150
150
151
+ void handleMessageEvent (MessageEvent event) {
152
+ _refreshStaleUserResults ();
153
+ }
154
+
155
+ void handleOlderMessages () {
156
+ _refreshStaleUserResults ();
157
+ }
158
+
151
159
/// Called when the app is reassembled during debugging, e.g. for hot reload.
152
160
///
153
161
/// Calls [MentionAutocompleteView.reassemble] for all that are registered.
@@ -193,6 +201,7 @@ class MentionAutocompleteView extends ChangeNotifier {
193
201
@override
194
202
void dispose () {
195
203
store.autocompleteViewManager.unregisterMentionAutocomplete (this );
204
+ _sortedUsers = null ;
196
205
// We cancel in-progress computations by checking [hasListeners] between tasks.
197
206
// After [super.dispose] is called, [hasListeners] returns false.
198
207
// TODO test that logic (may involve detecting an unhandled Future rejection; how?)
@@ -216,6 +225,7 @@ class MentionAutocompleteView extends ChangeNotifier {
216
225
/// Called in particular when we get a [RealmUserEvent] .
217
226
void refreshStaleUserResults () {
218
227
if (_query != null ) {
228
+ _sortedUsers = null ;
219
229
_startSearch (_query! );
220
230
}
221
231
}
@@ -225,6 +235,7 @@ class MentionAutocompleteView extends ChangeNotifier {
225
235
/// This will redo the search from scratch for the current query, if any.
226
236
void reassemble () {
227
237
if (_query != null ) {
238
+ _sortedUsers = null ;
228
239
_startSearch (_query! );
229
240
}
230
241
}
@@ -254,22 +265,43 @@ class MentionAutocompleteView extends ChangeNotifier {
254
265
notifyListeners ();
255
266
}
256
267
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
+
257
279
Future <List <MentionAutocompleteResult >?> _computeResults (MentionAutocompleteQuery query) async {
258
280
final List <MentionAutocompleteResult > results = [];
259
- final Iterable <User > users = store.users.values;
260
281
261
- final iterator = users.iterator;
282
+ if (_sortedUsers == null ) {
283
+ _sortUsers ();
284
+ }
285
+
286
+ final sortedUsers = _sortedUsers! ;
287
+ final iterator = sortedUsers.iterator;
262
288
bool isDone = false ;
263
289
while (! isDone) {
264
290
// CPU perf: End this task; enqueue a new one for resuming this work
265
291
await Future (() {});
266
292
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
+
267
299
if (query != _query || ! hasListeners) { // false if [dispose] has been called.
268
300
return null ;
269
301
}
270
302
271
303
for (int i = 0 ; i < 1000 ; i++ ) {
272
- if (! iterator.moveNext ()) { // Can throw ConcurrentModificationError
304
+ if (! iterator.moveNext ()) {
273
305
isDone = true ;
274
306
break ;
275
307
}
@@ -280,7 +312,7 @@ class MentionAutocompleteView extends ChangeNotifier {
280
312
}
281
313
}
282
314
}
283
- return results; // TODO(#228) sort for most relevant first
315
+ return results;
284
316
}
285
317
}
286
318
0 commit comments