Skip to content

Commit be02a05

Browse files
committed
narrow [nfc]: Make containsMessage support DisplayableMessage
For some narrows, this is in the way of the message handling hot path. This refactor takes care to make sure that calling containsMessage with StreamMessage or DmMessage remains about as efficient as before.
1 parent 9b9265b commit be02a05

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

lib/model/narrow.dart

+27-13
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ sealed class Narrow {
1919
/// This does not necessarily mean the message list would show this message
2020
/// when navigated to this narrow; in particular it does not address the
2121
/// question of whether the stream or topic, or the sending user, is muted.
22-
bool containsMessage(Message message);
22+
bool containsMessage(DisplayableMessage message);
2323

2424
/// This narrow, expressed as an [ApiNarrow].
2525
ApiNarrow apiEncode();
@@ -47,7 +47,7 @@ class CombinedFeedNarrow extends Narrow {
4747
const CombinedFeedNarrow();
4848

4949
@override
50-
bool containsMessage(Message message) {
50+
bool containsMessage(DisplayableMessage message) {
5151
return true;
5252
}
5353

@@ -71,8 +71,12 @@ class ChannelNarrow extends Narrow {
7171
final int streamId;
7272

7373
@override
74-
bool containsMessage(Message message) {
75-
return message is StreamMessage && message.streamId == streamId;
74+
bool containsMessage(DisplayableMessage message) {
75+
if (message is StreamMessage) {
76+
return message.streamId == streamId;
77+
}
78+
return message is DisplayableMessage<StreamDestination>
79+
&& message.destination.streamId == streamId;
7680
}
7781

7882
@override
@@ -105,9 +109,15 @@ class TopicNarrow extends Narrow implements SendableNarrow {
105109
TopicNarrow sansWith() => TopicNarrow(streamId, topic);
106110

107111
@override
108-
bool containsMessage(Message message) {
109-
return (message is StreamMessage
110-
&& message.streamId == streamId && message.topic == topic);
112+
bool containsMessage(DisplayableMessage message) {
113+
if (message is StreamMessage) {
114+
return message.streamId == streamId && message.topic == topic;
115+
}
116+
if (message case DisplayableMessage<StreamDestination>(:final destination)
117+
when destination.streamId == streamId && destination.topic == topic) {
118+
return true;
119+
}
120+
return false;
111121
}
112122

113123
@override
@@ -260,11 +270,13 @@ class DmNarrow extends Narrow implements SendableNarrow {
260270
late final String _key = otherRecipientIds.join(',');
261271

262272
@override
263-
bool containsMessage(Message message) {
264-
if (message is! DmMessage) return false;
265-
if (message.allRecipientIds.length != allRecipientIds.length) return false;
273+
bool containsMessage(DisplayableMessage message) {
274+
if (message is! DisplayableMessage<DmDestination>) return false;
275+
final messageUserIds = message is DmMessage
276+
? message.allRecipientIds : message.destination.userIds;
277+
if (messageUserIds.length != allRecipientIds.length) return false;
266278
int i = 0;
267-
for (final userId in message.allRecipientIds) {
279+
for (final userId in messageUserIds) {
268280
if (userId != allRecipientIds[i]) return false;
269281
i++;
270282
}
@@ -304,7 +316,8 @@ class MentionsNarrow extends Narrow {
304316
const MentionsNarrow();
305317

306318
@override
307-
bool containsMessage(Message message) {
319+
bool containsMessage(DisplayableMessage message) {
320+
if (message is! Message) return false;
308321
return message.flags.any((flag) {
309322
switch (flag) {
310323
case MessageFlag.mentioned:
@@ -343,7 +356,8 @@ class StarredMessagesNarrow extends Narrow {
343356
ApiNarrow apiEncode() => [ApiNarrowIs(IsOperand.starred)];
344357

345358
@override
346-
bool containsMessage(Message message) {
359+
bool containsMessage(DisplayableMessage message) {
360+
if (message is! Message) return false;
347361
return message.flags.contains(MessageFlag.starred);
348362
}
349363

0 commit comments

Comments
 (0)