Skip to content

Commit e67a8bb

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 bb98002 commit e67a8bb

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
@@ -277,36 +277,58 @@ mixin _MessageSequence {
277277
_reprocessAll();
278278
}
279279

280-
/// Append to [items] based on the index-th message and its content.
280+
/// Append to [items] based on [message] and [prevMessage].
281281
///
282-
/// The previous messages in the list must already have been processed.
283-
/// This message must already have been parsed and reflected in [contents].
284-
void _processMessage(int index) {
285-
// This will get more complicated to handle the ways that messages interact
286-
// with the display of neighboring messages: sender headings #175
287-
// and date separators #173.
288-
final message = messages[index];
289-
final content = contents[index];
290-
bool canShareSender;
291-
if (index == 0 || !haveSameRecipient(messages[index - 1], message)) {
282+
/// This appends a recipient header or a date separator to [items],
283+
/// depending on how [prevMessage] relates to [message],
284+
/// and then the result of [buildItem].
285+
///
286+
/// [prevMessage] should be the message that visually appears before [message].
287+
///
288+
/// The caller must ensure that [prevMessage] and all messages before it
289+
/// have been processed.
290+
void _addItemsForMessage(MessageBase message, {
291+
required MessageBase? prevMessage,
292+
required MessageListMessageBaseItem Function(bool canShareSender) buildItem,
293+
}) {
294+
final bool canShareSender;
295+
if (prevMessage == null || !haveSameRecipient(prevMessage, message)) {
292296
items.add(MessageListRecipientHeaderItem(message));
293297
canShareSender = false;
294298
} else {
295-
assert(items.last is MessageListMessageItem);
296-
final prevMessageItem = items.last as MessageListMessageItem;
297-
assert(identical(prevMessageItem.message, messages[index - 1]));
299+
assert(items.last is MessageListMessageBaseItem);
300+
final prevMessageItem = items.last as MessageListMessageBaseItem;
301+
assert(identical(prevMessageItem.message, prevMessage));
298302
assert(prevMessageItem.isLastInBlock);
299303
prevMessageItem.isLastInBlock = false;
300304

301305
if (!messagesSameDay(prevMessageItem.message, message)) {
302306
items.add(MessageListDateSeparatorItem(message));
303307
canShareSender = false;
304308
} else {
305-
canShareSender = (prevMessageItem.message.senderId == message.senderId);
309+
canShareSender = prevMessage.senderId == message.senderId;
306310
}
307311
}
308-
items.add(MessageListMessageItem(message, content,
309-
showSender: !canShareSender, isLastInBlock: true));
312+
final item = buildItem(canShareSender);
313+
assert(identical(item.message, message));
314+
assert(item.showSender == !canShareSender);
315+
assert(item.isLastInBlock);
316+
items.add(item);
317+
}
318+
319+
/// Append to [items] based on the index-th message and its content.
320+
///
321+
/// The previous messages in the list must already have been processed.
322+
/// This message must already have been parsed and reflected in [contents].
323+
void _processMessage(int index) {
324+
final prevMessage = index == 0 ? null : messages[index - 1];
325+
final message = messages[index];
326+
final content = contents[index];
327+
328+
_addItemsForMessage(message,
329+
prevMessage: prevMessage,
330+
buildItem: (bool canShareSender) => MessageListMessageItem(
331+
message, content, showSender: !canShareSender, isLastInBlock: true));
310332
}
311333

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

0 commit comments

Comments
 (0)