@@ -277,36 +277,58 @@ mixin _MessageSequence {
277
277
_reprocessAll ();
278
278
}
279
279
280
- /// Append to [items] based on the index-th message and its content .
280
+ /// Append to [items] based on [ message] and [prevMessage] .
281
281
///
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)) {
292
296
items.add (MessageListRecipientHeaderItem (message));
293
297
canShareSender = false ;
294
298
} 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 ));
298
302
assert (prevMessageItem.isLastInBlock);
299
303
prevMessageItem.isLastInBlock = false ;
300
304
301
305
if (! messagesSameDay (prevMessageItem.message, message)) {
302
306
items.add (MessageListDateSeparatorItem (message));
303
307
canShareSender = false ;
304
308
} else {
305
- canShareSender = (prevMessageItem.message. senderId == message.senderId) ;
309
+ canShareSender = prevMessage. senderId == message.senderId;
306
310
}
307
311
}
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 ));
310
332
}
311
333
312
334
/// Recompute [items] from scratch, based on [messages] , [contents] , and flags.
0 commit comments