@@ -297,36 +297,58 @@ mixin _MessageSequence {
297
297
_reprocessAll ();
298
298
}
299
299
300
- /// Append to [items] based on the index-th message and its content .
300
+ /// Append to [items] based on [ message] and [prevMessage] .
301
301
///
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)) {
312
316
items.add (MessageListRecipientHeaderItem (message));
313
317
canShareSender = false ;
314
318
} 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 ));
318
322
assert (prevMessageItem.isLastInBlock);
319
323
prevMessageItem.isLastInBlock = false ;
320
324
321
325
if (! messagesSameDay (prevMessageItem.message, message)) {
322
326
items.add (MessageListDateSeparatorItem (message));
323
327
canShareSender = false ;
324
328
} else {
325
- canShareSender = (prevMessageItem.message. senderId == message.senderId) ;
329
+ canShareSender = prevMessage. senderId == message.senderId;
326
330
}
327
331
}
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 ));
330
352
}
331
353
332
354
/// Update [items] to include markers at start and end as appropriate.
0 commit comments