Skip to content

Commit 93d89a6

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

File tree

1 file changed

+47
-18
lines changed

1 file changed

+47
-18
lines changed

lib/model/message_list.dart

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -322,37 +322,66 @@ mixin _MessageSequence {
322322
_reprocessAll();
323323
}
324324

325-
/// Append to [items] based on the index-th message and its content.
325+
/// Append to [items] based on [message] and [prevMessage].
326326
///
327-
/// The previous messages in the list must already have been processed.
328-
/// This message must already have been parsed and reflected in [contents].
329-
void _processMessage(int index) {
330-
// This will get more complicated to handle the ways that messages interact
331-
// with the display of neighboring messages: sender headings #175
332-
// and date separators #173.
333-
final message = messages[index];
334-
final content = contents[index];
335-
bool canShareSender;
336-
if (index == 0 || !haveSameRecipient(messages[index - 1], message)) {
327+
/// This appends a recipient header or a date separator to [items],
328+
/// depending on how [prevMessage] relates to [message],
329+
/// and then the result of [buildItem], updating [middleItem] if desired.
330+
///
331+
/// See [middleItem] to determine the value of [shouldSetMiddleItem].
332+
///
333+
/// [prevMessage] should be the message that visually appears before [message].
334+
///
335+
/// The caller must ensure that [prevMessage] and all messages before it
336+
/// have been processed.
337+
void _addItemsForMessage(MessageBase message, {
338+
required bool shouldSetMiddleItem,
339+
required MessageBase? prevMessage,
340+
required MessageListMessageBaseItem Function(bool canShareSender) buildItem,
341+
}) {
342+
final bool canShareSender;
343+
if (prevMessage == null || !haveSameRecipient(prevMessage, message)) {
337344
items.add(MessageListRecipientHeaderItem(message));
338345
canShareSender = false;
339346
} else {
340-
assert(items.last is MessageListMessageItem);
341-
final prevMessageItem = items.last as MessageListMessageItem;
342-
assert(identical(prevMessageItem.message, messages[index - 1]));
347+
assert(items.last is MessageListMessageBaseItem);
348+
final prevMessageItem = items.last as MessageListMessageBaseItem;
349+
assert(identical(prevMessageItem.message, prevMessage));
343350
assert(prevMessageItem.isLastInBlock);
344351
prevMessageItem.isLastInBlock = false;
345352

346353
if (!messagesSameDay(prevMessageItem.message, message)) {
347354
items.add(MessageListDateSeparatorItem(message));
348355
canShareSender = false;
349356
} else {
350-
canShareSender = (prevMessageItem.message.senderId == message.senderId);
357+
canShareSender = prevMessageItem.message.senderId == message.senderId;
351358
}
352359
}
353-
if (index == middleMessage) middleItem = items.length;
354-
items.add(MessageListMessageItem(message, content,
355-
showSender: !canShareSender, isLastInBlock: true));
360+
final item = buildItem(canShareSender);
361+
assert(identical(item.message, message));
362+
assert(item.showSender == !canShareSender);
363+
assert(item.isLastInBlock);
364+
if (shouldSetMiddleItem) {
365+
assert(item is MessageListMessageItem);
366+
middleItem = items.length;
367+
}
368+
items.add(item);
369+
}
370+
371+
/// Append to [items] based on the index-th message and its content.
372+
///
373+
/// The previous messages in the list must already have been processed.
374+
/// This message must already have been parsed and reflected in [contents].
375+
void _processMessage(int index) {
376+
final prevMessage = index == 0 ? null : messages[index - 1];
377+
final message = messages[index];
378+
final content = contents[index];
379+
380+
_addItemsForMessage(message,
381+
shouldSetMiddleItem: index == middleMessage,
382+
prevMessage: prevMessage,
383+
buildItem: (bool canShareSender) => MessageListMessageItem(
384+
message, content, showSender: !canShareSender, isLastInBlock: true));
356385
}
357386

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

0 commit comments

Comments
 (0)