@@ -339,37 +339,61 @@ mixin _MessageSequence {
339
339
_reprocessAll ();
340
340
}
341
341
342
- /// Append to [items] based on the index-th message and its content .
342
+ /// Append to [items] based on [ message] and [prevMessage] .
343
343
///
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)) {
354
358
items.add (MessageListRecipientHeaderItem (message));
355
359
canShareSender = false ;
356
360
} 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 ));
360
364
assert (prevMessageItem.isLastInBlock);
361
365
prevMessageItem.isLastInBlock = false ;
362
366
363
367
if (! messagesSameDay (prevMessageItem.message, message)) {
364
368
items.add (MessageListDateSeparatorItem (message));
365
369
canShareSender = false ;
366
370
} else {
367
- canShareSender = (prevMessageItem.message. senderId == message.senderId) ;
371
+ canShareSender = prevMessage. senderId == message.senderId;
368
372
}
369
373
}
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
+ });
373
397
}
374
398
375
399
/// Recompute [items] from scratch, based on [messages] , [contents] , and flags.
0 commit comments