Skip to content

Commit 5ca846f

Browse files
committed
msglist [nfc]: Extract _addItemsForMessage
Also removed a stale comment that refers to resolved issues (zulip#173 and zulip#175). We will reuse this helper when processing items for outbox messages.
1 parent e2a68c0 commit 5ca846f

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

lib/model/message_list.dart

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -339,37 +339,61 @@ mixin _MessageSequence {
339339
_reprocessAll();
340340
}
341341

342-
/// Append to [items] based on the index-th message and its content.
342+
/// Append to [items] based on [message] and [prevMessage].
343343
///
344-
/// The previous messages in the list must already have been processed.
345-
/// This message must already have been parsed and reflected in [contents].
346-
void _processMessage(int index) {
347-
// This will get more complicated to handle the ways that messages interact
348-
// with the display of neighboring messages: sender headings #175
349-
// and date separators #173.
350-
final message = messages[index];
351-
final content = contents[index];
352-
bool canShareSender;
353-
if (index == 0 || !haveSameRecipient(messages[index - 1], message)) {
344+
/// This appends a recipient header or a date separator to [items],
345+
/// depending on how [prevMessage] relates to [message],
346+
/// and then the result of [buildItem].
347+
///
348+
/// [prevMessage] should be the message that visually appears before [message].
349+
///
350+
/// The caller must ensure that [prevMessage] and all messages before it
351+
/// have been processed.
352+
void _addItemsForMessage(MessageBase message, {
353+
required MessageBase? prevMessage,
354+
required MessageListMessageBaseItem Function(bool canShareSender) buildItem,
355+
}) {
356+
final bool canShareSender;
357+
if (prevMessage == null || !haveSameRecipient(prevMessage, message)) {
354358
items.add(MessageListRecipientHeaderItem(message));
355359
canShareSender = false;
356360
} else {
357-
assert(items.last is MessageListMessageItem);
358-
final prevMessageItem = items.last as MessageListMessageItem;
359-
assert(identical(prevMessageItem.message, messages[index - 1]));
361+
assert(items.last is MessageListMessageBaseItem);
362+
final prevMessageItem = items.last as MessageListMessageBaseItem;
363+
assert(identical(prevMessageItem.message, prevMessage));
360364
assert(prevMessageItem.isLastInBlock);
361365
prevMessageItem.isLastInBlock = false;
362366

363367
if (!messagesSameDay(prevMessageItem.message, message)) {
364368
items.add(MessageListDateSeparatorItem(message));
365369
canShareSender = false;
366370
} else {
367-
canShareSender = (prevMessageItem.message.senderId == message.senderId);
371+
canShareSender = prevMessage.senderId == message.senderId;
368372
}
369373
}
370-
if (index == middleMessage) middleItem = items.length;
371-
items.add(MessageListMessageItem(message, content,
372-
showSender: !canShareSender, isLastInBlock: true));
374+
final item = buildItem(canShareSender);
375+
assert(identical(item.message, message));
376+
assert(item.showSender == !canShareSender);
377+
assert(item.isLastInBlock);
378+
items.add(item);
379+
}
380+
381+
/// Append to [items] based on the index-th message and its content.
382+
///
383+
/// The previous messages in the list must already have been processed.
384+
/// This message must already have been parsed and reflected in [contents].
385+
void _processMessage(int index) {
386+
final prevMessage = index == 0 ? null : messages[index - 1];
387+
final message = messages[index];
388+
final content = contents[index];
389+
390+
_addItemsForMessage(message,
391+
prevMessage: prevMessage,
392+
buildItem: (bool canShareSender) {
393+
if (index == middleMessage) middleItem = items.length;
394+
return MessageListMessageItem(
395+
message, content, showSender: !canShareSender, isLastInBlock: true)
396+
});
373397
}
374398

375399
/// Recompute [items] from scratch, based on [messages], [contents], and flags.

0 commit comments

Comments
 (0)