@@ -152,6 +152,10 @@ class AutocompleteViewManager {
152
152
_refreshStaleUserResults ();
153
153
}
154
154
155
+ void handleOlderMessages () {
156
+ _refreshStaleUserResults ();
157
+ }
158
+
155
159
/// Called when the app is reassembled during debugging, e.g. for hot reload.
156
160
///
157
161
/// Calls [MentionAutocompleteView.reassemble] for all that are registered.
@@ -276,6 +280,42 @@ class MentionAutocompleteView extends ChangeNotifier {
276
280
_ => 0 ,
277
281
};
278
282
283
+ /// Determines which of the two users has more recent activity.
284
+ ///
285
+ /// First checks for the activity in [topic] if provided.
286
+ ///
287
+ /// If no [topic] is provided, or the activity in the topic is the same (which
288
+ /// is extremely rare) or there is no activity in the topic at all, then
289
+ /// checks for the activity in the stream with [streamId] .
290
+ ///
291
+ /// Returns a negative number if [userA] has more recent activity than [userB] ,
292
+ /// returns a positive number if [userB] has more recent activity than [userA] ,
293
+ /// and returns `0` if both [userA] and [userB] have the same recent activity
294
+ /// (which is extremely rare) or has no activity at all.
295
+ int compareByRecency (
296
+ User userA,
297
+ User userB, {
298
+ required int streamId,
299
+ required String ? topic,
300
+ }) {
301
+ final recentSenders = store.recentSenders;
302
+ if (topic != null ) {
303
+ final aMessageId = recentSenders.latestMessageIdOfSenderInTopic (
304
+ streamId: streamId, topic: topic, senderId: userA.userId);
305
+ final bMessageId = recentSenders.latestMessageIdOfSenderInTopic (
306
+ streamId: streamId, topic: topic, senderId: userB.userId);
307
+
308
+ final result = - compareNullable (aMessageId, bMessageId);
309
+ if (result != 0 ) return result;
310
+ }
311
+
312
+ final aMessageId =
313
+ recentSenders.latestMessageIdOfSenderInStream (streamId: streamId, senderId: userA.userId);
314
+ final bMessageId =
315
+ recentSenders.latestMessageIdOfSenderInStream (streamId: streamId, senderId: userB.userId);
316
+ return - compareNullable (aMessageId, bMessageId);
317
+ }
318
+
279
319
/// Determines which of the two users is more recent in DM conversations.
280
320
///
281
321
/// Returns a negative number if [userA] is more recent than [userB] ,
@@ -293,7 +333,20 @@ class MentionAutocompleteView extends ChangeNotifier {
293
333
int compareByRelevance ({
294
334
required User userA,
295
335
required User userB,
336
+ required int ? streamId,
337
+ required String ? topic,
296
338
}) {
339
+ if (streamId != null ) {
340
+ final conversationPrecedence = compareByRecency (
341
+ userA,
342
+ userB,
343
+ streamId: streamId,
344
+ topic: topic);
345
+ if (conversationPrecedence != 0 ) {
346
+ return conversationPrecedence;
347
+ }
348
+ }
349
+
297
350
final dmPrecedence = compareByDms (userA, userB);
298
351
return dmPrecedence;
299
352
}
@@ -304,11 +357,23 @@ class MentionAutocompleteView extends ChangeNotifier {
304
357
}) {
305
358
switch (narrow) {
306
359
case StreamNarrow ():
360
+ users.sort ((userA, userB) => compareByRelevance (
361
+ userA: userA,
362
+ userB: userB,
363
+ streamId: narrow.streamId,
364
+ topic: null ));
307
365
case TopicNarrow ():
366
+ users.sort ((userA, userB) => compareByRelevance (
367
+ userA: userA,
368
+ userB: userB,
369
+ streamId: narrow.streamId,
370
+ topic: narrow.topic));
308
371
case DmNarrow ():
309
372
users.sort ((userA, userB) => compareByRelevance (
310
373
userA: userA,
311
- userB: userB));
374
+ userB: userB,
375
+ streamId: null ,
376
+ topic: null ));
312
377
case CombinedFeedNarrow ():
313
378
// do nothing in this case for now
314
379
}
0 commit comments