Skip to content

Commit 33fb619

Browse files
committed
unreads [nfc]: Factor out isUnread helper
And make it public, with dartdoc and tests, while we're at it.
1 parent dad2f97 commit 33fb619

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

lib/model/unreads.dart

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,18 @@ class Unreads extends ChangeNotifier {
214214
}
215215
}
216216

217+
/// The unread state for [messageId], or null if unknown.
218+
///
219+
/// May be unknown only if [oldUnreadsMissing].
220+
///
221+
/// This is inefficient; it iterates through [dms] and [channels].
222+
// TODO implement efficiently
223+
bool? isUnread(int messageId) {
224+
final isPresent = _slowIsPresentInDms(messageId) || _slowIsPresentInStreams(messageId);
225+
if (oldUnreadsMissing && !isPresent) return null;
226+
return isPresent;
227+
}
228+
217229
void handleMessageEvent(MessageEvent event) {
218230
final message = event.message;
219231
if (message.flags.contains(MessageFlag.read)) {
@@ -327,10 +339,7 @@ class Unreads extends ChangeNotifier {
327339
switch (event) {
328340
case UpdateMessageFlagsAddEvent():
329341
mentions.addAll(
330-
event.messages.where(
331-
(messageId) => _slowIsPresentInStreams(messageId) || _slowIsPresentInDms(messageId),
332-
),
333-
);
342+
event.messages.where((messageId) => isUnread(messageId) == true));
334343

335344
case UpdateMessageFlagsRemoveEvent():
336345
mentions.removeAll(event.messages);

test/model/unreads_test.dart

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,49 @@ void main() {
240240
});
241241
});
242242

243+
group('isUnread', () {
244+
final unreadDmMessage = eg.dmMessage(
245+
from: eg.otherUser, to: [eg.selfUser], flags: []);
246+
final readDmMessage = eg.dmMessage(
247+
from: eg.otherUser, to: [eg.selfUser], flags: [MessageFlag.read]);
248+
final unreadChannelMessage = eg.streamMessage(flags: []);
249+
final readChannelMessage = eg.streamMessage(flags: [MessageFlag.read]);
250+
251+
final allMessages = [
252+
unreadDmMessage, unreadChannelMessage,
253+
readDmMessage, readChannelMessage,
254+
];
255+
256+
void doTestCommon(String description, int messageId, bool expected) {
257+
test(description, () {
258+
prepare();
259+
model.oldUnreadsMissing = false;
260+
fillWithMessages(allMessages);
261+
check(model.isUnread(messageId)).equals(expected);
262+
});
263+
}
264+
265+
void doTestOldUnreadsMissing(String description, int messageId, bool? expected) {
266+
assert(expected == true || expected == null);
267+
test('oldUnreadsMissing; $description', () {
268+
prepare();
269+
model.oldUnreadsMissing = true;
270+
fillWithMessages(allMessages);
271+
check(model.isUnread(messageId)).equals(expected);
272+
});
273+
}
274+
275+
doTestCommon('unread DM message', unreadDmMessage.id, true);
276+
doTestCommon('read DM message', readDmMessage.id, false);
277+
doTestCommon('unread channel message', unreadChannelMessage.id, true);
278+
doTestCommon('read channel message', readChannelMessage.id, false);
279+
280+
doTestOldUnreadsMissing('unread DM message', unreadDmMessage.id, true);
281+
doTestOldUnreadsMissing('read DM message', readDmMessage.id, null);
282+
doTestOldUnreadsMissing('unread channel message', unreadChannelMessage.id, true);
283+
doTestOldUnreadsMissing('read channel message', readChannelMessage.id, null);
284+
});
285+
243286
group('handleMessageEvent', () {
244287
for (final (isUnread, isStream, isDirectMentioned, isWildcardMentioned) in [
245288
(true, true, true, true ),

0 commit comments

Comments
 (0)