@@ -322,37 +322,66 @@ mixin _MessageSequence {
322
322
_reprocessAll ();
323
323
}
324
324
325
- /// Append to [items] based on the index-th message and its content .
325
+ /// Append to [items] based on [ message] and [prevMessage] .
326
326
///
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)) {
337
344
items.add (MessageListRecipientHeaderItem (message));
338
345
canShareSender = false ;
339
346
} 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 ));
343
350
assert (prevMessageItem.isLastInBlock);
344
351
prevMessageItem.isLastInBlock = false ;
345
352
346
353
if (! messagesSameDay (prevMessageItem.message, message)) {
347
354
items.add (MessageListDateSeparatorItem (message));
348
355
canShareSender = false ;
349
356
} else {
350
- canShareSender = ( prevMessageItem.message.senderId == message.senderId) ;
357
+ canShareSender = prevMessageItem.message.senderId == message.senderId;
351
358
}
352
359
}
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 ));
356
385
}
357
386
358
387
/// Recompute [items] from scratch, based on [messages] , [contents] , and flags.
0 commit comments