Skip to content

Commit 018b659

Browse files
committed
msglist [nfc]: Extract MessageListMessageBaseItem
This is an NFC because MessageListMessageItem is still the only subclass of it.
1 parent 83b721a commit 018b659

File tree

2 files changed

+46
-26
lines changed

2 files changed

+46
-26
lines changed

lib/model/message_list.dart

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,29 @@ class MessageListDateSeparatorItem extends MessageListItem {
3737
}
3838

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

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

@@ -289,14 +301,15 @@ mixin _MessageSequence {
289301
///
290302
/// Returns whether an item has been appended or not.
291303
///
292-
/// The caller must append a [MessageListMessageItem] after this.
293-
bool _maybeAppendAuxillaryItem(Message message, {required Message? prevMessage}) {
304+
/// The caller must append a [MessageListMessageBaseItem] after this.
305+
bool _maybeAppendAuxillaryItem(MessageBase message, {
306+
required MessageBase? prevMessage,
307+
}) {
294308
if (prevMessage == null || !haveSameRecipient(prevMessage, message)) {
295309
items.add(MessageListRecipientHeaderItem(message));
296310
return true;
297311
} else {
298-
assert(items.last is MessageListMessageItem);
299-
final prevMessageItem = items.last as MessageListMessageItem;
312+
final prevMessageItem = items.last as MessageListMessageBaseItem;
300313
assert(identical(prevMessageItem.message, prevMessage));
301314
assert(prevMessageItem.isLastInBlock);
302315
prevMessageItem.isLastInBlock = false;
@@ -360,12 +373,14 @@ mixin _MessageSequence {
360373
}
361374

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

386401
@visibleForTesting
387-
bool messagesSameDay(Message prevMessage, Message message) {
402+
bool messagesSameDay(MessageBase prevMessage, MessageBase message) {
388403
// TODO memoize [DateTime]s... also use memoized for showing date/time in msglist
389404
final prevTime = DateTime.fromMillisecondsSinceEpoch(prevMessage.timestamp * 1000);
390405
final time = DateTime.fromMillisecondsSinceEpoch(message.timestamp * 1000);
@@ -449,19 +464,20 @@ class MessageListView with ChangeNotifier, _MessageSequence {
449464
/// one way or another.
450465
///
451466
/// See also [_allMessagesVisible].
452-
bool _messageVisible(Message message) {
467+
bool _messageVisible(MessageBase message) {
453468
switch (narrow) {
454469
case CombinedFeedNarrow():
455-
return switch (message) {
456-
StreamMessage() =>
457-
store.isTopicVisible(message.streamId, message.topic),
458-
DmMessage() => true,
470+
return switch (message.conversation) {
471+
StreamConversation(:final streamId, :final topic) =>
472+
store.isTopicVisible(streamId, topic),
473+
DmConversation() => true,
459474
};
460475

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

466482
case TopicNarrow():
467483
case DmNarrow():

test/model/message_list_test.dart

Lines changed: 6 additions & 2 deletions
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)