Skip to content

Commit 0d28448

Browse files
committed
autocomplete: Add "recent activity in current stream" criterion
In @-mention autocomplete, users are suggested based on: 1. Recent activity in the current stream. 2. Recent DM conversations. Fixes part of: #228
1 parent e52532b commit 0d28448

File tree

3 files changed

+247
-14
lines changed

3 files changed

+247
-14
lines changed

lib/model/autocomplete.dart

+66-1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,10 @@ class AutocompleteViewManager {
152152
_refreshStaleUserResults();
153153
}
154154

155+
void handleOlderMessages() {
156+
_refreshStaleUserResults();
157+
}
158+
155159
/// Called when the app is reassembled during debugging, e.g. for hot reload.
156160
///
157161
/// Calls [MentionAutocompleteView.reassemble] for all that are registered.
@@ -276,6 +280,42 @@ class MentionAutocompleteView extends ChangeNotifier {
276280
_ => 0,
277281
};
278282

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+
279319
/// Determines which of the two users is more recent in DM conversations.
280320
///
281321
/// Returns a negative number if [userA] is more recent than [userB],
@@ -293,7 +333,20 @@ class MentionAutocompleteView extends ChangeNotifier {
293333
int compareByRelevance({
294334
required User userA,
295335
required User userB,
336+
required int? streamId,
337+
required String? topic,
296338
}) {
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+
297350
final dmPrecedence = compareByDms(userA, userB);
298351
return dmPrecedence;
299352
}
@@ -304,11 +357,23 @@ class MentionAutocompleteView extends ChangeNotifier {
304357
}) {
305358
switch (narrow) {
306359
case StreamNarrow():
360+
users.sort((userA, userB) => compareByRelevance(
361+
userA: userA,
362+
userB: userB,
363+
streamId: narrow.streamId,
364+
topic: null));
307365
case TopicNarrow():
366+
users.sort((userA, userB) => compareByRelevance(
367+
userA: userA,
368+
userB: userB,
369+
streamId: narrow.streamId,
370+
topic: narrow.topic));
308371
case DmNarrow():
309372
users.sort((userA, userB) => compareByRelevance(
310373
userA: userA,
311-
userB: userB));
374+
userB: userB,
375+
streamId: null,
376+
topic: null));
312377
case CombinedFeedNarrow():
313378
// do nothing in this case for now
314379
}

lib/model/message_list.dart

+6
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.recentSenders.handleMessage(message);
385386
}
386387
_fetched = true;
387388
_haveOldest = result.foundOldest;
@@ -417,6 +418,11 @@ class MessageListView with ChangeNotifier, _MessageSequence {
417418
? result.messages // Avoid unnecessarily copying the list.
418419
: result.messages.where(_messageVisible);
419420

421+
for (final message in fetchedMessages) {
422+
store.recentSenders.handleMessage(message);
423+
}
424+
store.autocompleteViewManager.handleOlderMessages();
425+
420426
_insertAllMessages(0, fetchedMessages);
421427
_haveOldest = result.foundOldest;
422428
} finally {

0 commit comments

Comments
 (0)