Skip to content

Commit 32c7efa

Browse files
committed
msglist [nfc]: Extract MessageListMessageBaseItem
This is an NFC because MessageListMessageItem is still the only subclass of it.
1 parent edb1d6f commit 32c7efa

File tree

2 files changed

+46
-26
lines changed

2 files changed

+46
-26
lines changed

lib/model/message_list.dart

+40-24
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,29 @@ class MessageListDateSeparatorItem extends MessageListItem {
3636
}
3737

3838
/// A message to show in the message list.
39-
class MessageListMessageItem extends MessageListItem {
40-
final Message message;
41-
ZulipMessageContent content;
39+
sealed class MessageListMessageBaseItem extends MessageListItem {
40+
MessageBase get message;
41+
ZulipMessageContent get content;
4242
bool showSender;
4343
bool isLastInBlock;
4444

45+
MessageListMessageBaseItem({
46+
required this.showSender,
47+
required this.isLastInBlock,
48+
});
49+
}
50+
51+
class MessageListMessageItem extends MessageListMessageBaseItem {
52+
@override
53+
final Message message;
54+
@override
55+
ZulipMessageContent content;
56+
4557
MessageListMessageItem(
4658
this.message,
4759
this.content, {
48-
required this.showSender,
49-
required this.isLastInBlock,
60+
required super.showSender,
61+
required super.isLastInBlock,
5062
});
5163
}
5264

@@ -288,14 +300,15 @@ mixin _MessageSequence {
288300
///
289301
/// Returns whether an item has been appended or not.
290302
///
291-
/// The caller must append a [MessageListMessageItem] after this.
292-
bool _maybeAppendAuxillaryItem(Message message, {required Message? prevMessage}) {
303+
/// The caller must append a [MessageListMessageBaseItem] after this.
304+
bool _maybeAppendAuxillaryItem(MessageBase message, {
305+
required MessageBase? prevMessage,
306+
}) {
293307
if (prevMessage == null || !haveSameRecipient(prevMessage, message)) {
294308
items.add(MessageListRecipientHeaderItem(message));
295309
return true;
296310
} else {
297-
assert(items.last is MessageListMessageItem);
298-
final prevMessageItem = items.last as MessageListMessageItem;
311+
final prevMessageItem = items.last as MessageListMessageBaseItem;
299312
assert(identical(prevMessageItem.message, prevMessage));
300313
assert(prevMessageItem.isLastInBlock);
301314
prevMessageItem.isLastInBlock = false;
@@ -359,12 +372,14 @@ mixin _MessageSequence {
359372
}
360373

361374
@visibleForTesting
362-
bool haveSameRecipient(Message prevMessage, Message message) {
363-
if (prevMessage is StreamMessage && message is StreamMessage) {
364-
if (prevMessage.streamId != message.streamId) return false;
365-
if (prevMessage.topic.canonicalize() != message.topic.canonicalize()) return false;
366-
} else if (prevMessage is DmMessage && message is DmMessage) {
367-
if (!_equalIdSequences(prevMessage.allRecipientIds, message.allRecipientIds)) {
375+
bool haveSameRecipient(MessageBase prevMessage, MessageBase message) {
376+
final prevConversation = prevMessage.conversation;
377+
final conversation = message.conversation;
378+
if (prevConversation is StreamConversation && conversation is StreamConversation) {
379+
if (prevConversation.streamId != conversation.streamId) return false;
380+
if (prevConversation.topic.canonicalize() != conversation.topic.canonicalize()) return false;
381+
} else if (prevConversation is DmConversation && conversation is DmConversation) {
382+
if (!_equalIdSequences(prevConversation.allRecipientIds, conversation.allRecipientIds)) {
368383
return false;
369384
}
370385
} else {
@@ -383,7 +398,7 @@ bool haveSameRecipient(Message prevMessage, Message message) {
383398
}
384399

385400
@visibleForTesting
386-
bool messagesSameDay(Message prevMessage, Message message) {
401+
bool messagesSameDay(MessageBase prevMessage, MessageBase message) {
387402
// TODO memoize [DateTime]s... also use memoized for showing date/time in msglist
388403
final prevTime = DateTime.fromMillisecondsSinceEpoch(prevMessage.timestamp * 1000);
389404
final time = DateTime.fromMillisecondsSinceEpoch(message.timestamp * 1000);
@@ -448,19 +463,20 @@ class MessageListView with ChangeNotifier, _MessageSequence {
448463
/// one way or another.
449464
///
450465
/// See also [_allMessagesVisible].
451-
bool _messageVisible(Message message) {
466+
bool _messageVisible(MessageBase message) {
452467
switch (narrow) {
453468
case CombinedFeedNarrow():
454-
return switch (message) {
455-
StreamMessage() =>
456-
store.isTopicVisible(message.streamId, message.topic),
457-
DmMessage() => true,
469+
return switch (message.conversation) {
470+
StreamConversation(:final streamId, :final topic) =>
471+
store.isTopicVisible(streamId, topic),
472+
DmConversation() => true,
458473
};
459474

460475
case ChannelNarrow(:final streamId):
461-
assert(message is StreamMessage && message.streamId == streamId);
462-
if (message is! StreamMessage) return false;
463-
return store.isTopicVisibleInStream(streamId, message.topic);
476+
assert(message is MessageBase<StreamConversation>
477+
&& message.conversation.streamId == streamId);
478+
if (message is! MessageBase<StreamConversation>) return false;
479+
return store.isTopicVisibleInStream(streamId, message.conversation.topic);
464480

465481
case TopicNarrow():
466482
case DmNarrow():

test/model/message_list_test.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -2001,13 +2001,17 @@ extension MessageListDateSeparatorItemChecks on Subject<MessageListDateSeparator
20012001
Subject<MessageBase> get message => has((x) => x.message, 'message');
20022002
}
20032003

2004-
extension MessageListMessageItemChecks on Subject<MessageListMessageItem> {
2005-
Subject<Message> get message => has((x) => x.message, 'message');
2004+
extension MessageListMessageBaseItemChecks on Subject<MessageListMessageBaseItem> {
2005+
Subject<MessageBase> get message => has((x) => x.message, 'message');
20062006
Subject<ZulipMessageContent> get content => has((x) => x.content, 'content');
20072007
Subject<bool> get showSender => has((x) => x.showSender, 'showSender');
20082008
Subject<bool> get isLastInBlock => has((x) => x.isLastInBlock, 'isLastInBlock');
20092009
}
20102010

2011+
extension MessageListMessageItemChecks on Subject<MessageListMessageItem> {
2012+
Subject<Message> get message => has((x) => x.message, 'message');
2013+
}
2014+
20112015
extension MessageListViewChecks on Subject<MessageListView> {
20122016
Subject<PerAccountStore> get store => has((x) => x.store, 'store');
20132017
Subject<Narrow> get narrow => has((x) => x.narrow, 'narrow');

0 commit comments

Comments
 (0)