Skip to content

Commit 0ca1423

Browse files
committed
msglist: Add message to mentions if mentioned
1 parent 046ceab commit 0ca1423

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

lib/model/message_list.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,25 @@ class MessageListView with ChangeNotifier, _MessageSequence {
666666
}
667667
}
668668

669+
void _addMessageToMentionsIfMentioned(Message message) {
670+
if (message.flags.contains(MessageFlag.read)) return;
671+
if (!message.flags.contains(MessageFlag.mentioned)) return;
672+
673+
store.unreads.mentions.add(message.id);
674+
}
675+
676+
@override
677+
void _addMessage(Message message) {
678+
super._addMessage(message);
679+
_addMessageToMentionsIfMentioned(message);
680+
}
681+
682+
@override
683+
void _insertAllMessages(int index, Iterable<Message> toInsert) {
684+
super._insertAllMessages(index, toInsert);
685+
toInsert.forEach(_addMessageToMentionsIfMentioned);
686+
}
687+
669688
// Repeal the `@protected` annotation that applies on the base implementation,
670689
// so we can call this method from [MessageStoreImpl].
671690
@override

lib/model/unreads.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ import 'channel.dart';
3333
// TODO handle moved messages
3434
// TODO When [oldUnreadsMissing], if you load a message list with very old unreads,
3535
// sync to those unreads, because the user has shown an interest in them.
36-
// TODO When loading a message list with stream messages, check all the stream
37-
// messages and refresh [mentions] (see [mentions] dartdoc).
3836
class Unreads extends ChangeNotifier {
3937
factory Unreads({
4038
required UnreadMessagesSnapshot initial,
@@ -104,7 +102,7 @@ class Unreads extends ChangeNotifier {
104102
/// a) the message is edited at all ([UpdateMessageEvent]),
105103
/// assuming it still has a direct or wildcard mention after the edit, or
106104
/// b) the message gains a direct @-mention ([UpdateMessageFlagsEvent]), or
107-
/// c) TODO unimplemented: the user loads the message in the message list
105+
/// c) the user loads the message in the message list
108106
/// But otherwise, assume its unread state remains unknown to [mentions].
109107
///
110108
/// [1] This item applies verbatim at Server 8.0+. For older servers, the

test/model/message_list_test.dart

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,6 +1665,40 @@ void main() {
16651665
}
16661666
}
16671667
});
1668+
1669+
group('_addMessageToMentionsIfMentioned', () {
1670+
test('is called by fetchInitial', () async {
1671+
await prepare();
1672+
final message = eg.streamMessage(flags: [MessageFlag.mentioned]);
1673+
check(store.unreads.mentions.contains(message.id)).isFalse();
1674+
await prepareMessages(foundOldest: true, messages: [message]);
1675+
check(store.unreads.mentions.contains(message.id)).isTrue();
1676+
});
1677+
1678+
test('is called by fetchOlder', () async {
1679+
final olderMessage = eg.streamMessage(flags: [MessageFlag.mentioned]);
1680+
await prepare();
1681+
await prepareMessages(foundOldest: false, messages: [eg.streamMessage()]);
1682+
connection.prepare(json: olderResult(
1683+
anchor: 1000, foundOldest: true,
1684+
messages: [olderMessage],
1685+
).toJson());
1686+
1687+
check(store.unreads.mentions.contains(olderMessage.id)).isFalse();
1688+
await model.fetchOlder();
1689+
check(store.unreads.mentions.contains(olderMessage.id)).isTrue();
1690+
});
1691+
1692+
test('is called by MessageEvent', () async {
1693+
final newMessage = eg.streamMessage(flags: [MessageFlag.mentioned]);
1694+
await prepare();
1695+
await prepareMessages(foundOldest: false, messages: []);
1696+
1697+
check(store.unreads.mentions.contains(newMessage.id)).isFalse();
1698+
await store.handleEvent(MessageEvent(id: 1, message: newMessage));
1699+
check(store.unreads.mentions.contains(newMessage.id)).isTrue();
1700+
});
1701+
});
16681702
}
16691703

16701704
void checkInvariants(MessageListView model) {

0 commit comments

Comments
 (0)