Skip to content

Commit 8f6e253

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 7e503d0 commit 8f6e253

File tree

1 file changed

+39
-17
lines changed

1 file changed

+39
-17
lines changed

lib/model/message_list.dart

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -297,36 +297,58 @@ mixin _MessageSequence {
297297
_reprocessAll();
298298
}
299299

300-
/// Append to [items] based on the index-th message and its content.
300+
/// Append to [items] based on [message] and [prevMessage].
301301
///
302-
/// The previous messages in the list must already have been processed.
303-
/// This message must already have been parsed and reflected in [contents].
304-
void _processMessage(int index) {
305-
// This will get more complicated to handle the ways that messages interact
306-
// with the display of neighboring messages: sender headings #175
307-
// and date separators #173.
308-
final message = messages[index];
309-
final content = contents[index];
310-
bool canShareSender;
311-
if (index == 0 || !haveSameRecipient(messages[index - 1], message)) {
302+
/// This appends a recipient header or a date separator to [items],
303+
/// depending on how [prevMessage] relates to [message],
304+
/// and then the result of [buildItem].
305+
///
306+
/// [prevMessage] should be the message that visually appears before [message].
307+
///
308+
/// The caller must ensure that [prevMessage] and all messages before it
309+
/// have been processed.
310+
void _addItemsForMessage(MessageBase message, {
311+
required MessageBase? prevMessage,
312+
required MessageListMessageBaseItem Function(bool canShareSender) buildItem,
313+
}) {
314+
final bool canShareSender;
315+
if (prevMessage == null || !haveSameRecipient(prevMessage, message)) {
312316
items.add(MessageListRecipientHeaderItem(message));
313317
canShareSender = false;
314318
} else {
315-
assert(items.last is MessageListMessageItem);
316-
final prevMessageItem = items.last as MessageListMessageItem;
317-
assert(identical(prevMessageItem.message, messages[index - 1]));
319+
assert(items.last is MessageListMessageBaseItem);
320+
final prevMessageItem = items.last as MessageListMessageBaseItem;
321+
assert(identical(prevMessageItem.message, prevMessage));
318322
assert(prevMessageItem.isLastInBlock);
319323
prevMessageItem.isLastInBlock = false;
320324

321325
if (!messagesSameDay(prevMessageItem.message, message)) {
322326
items.add(MessageListDateSeparatorItem(message));
323327
canShareSender = false;
324328
} else {
325-
canShareSender = (prevMessageItem.message.senderId == message.senderId);
329+
canShareSender = prevMessage.senderId == message.senderId;
326330
}
327331
}
328-
items.add(MessageListMessageItem(message, content,
329-
showSender: !canShareSender, isLastInBlock: true));
332+
final item = buildItem(canShareSender);
333+
assert(identical(item.message, message));
334+
assert(item.showSender == !canShareSender);
335+
assert(item.isLastInBlock);
336+
items.add(item);
337+
}
338+
339+
/// Append to [items] based on the index-th message and its content.
340+
///
341+
/// The previous messages in the list must already have been processed.
342+
/// This message must already have been parsed and reflected in [contents].
343+
void _processMessage(int index) {
344+
final prevMessage = index == 0 ? null : messages[index - 1];
345+
final message = messages[index];
346+
final content = contents[index];
347+
348+
_addItemsForMessage(message,
349+
prevMessage: prevMessage,
350+
buildItem: (bool canShareSender) => MessageListMessageItem(
351+
message, content, showSender: !canShareSender, isLastInBlock: true));
330352
}
331353

332354
/// Update [items] to include markers at start and end as appropriate.

0 commit comments

Comments
 (0)