@@ -549,6 +549,43 @@ void main() async {
549
549
checkNotifiedOnce ();
550
550
});
551
551
552
+ test ('showSender is maintained correctly' , () async {
553
+ // TODO(#150): This will get more complicated with message moves.
554
+ // Until then, we always compute this sequentially from oldest to newest.
555
+ // So we just need to exercise the different cases of the logic for
556
+ // whether the sender should be shown, but the difference between
557
+ // fetchInitial and maybeAddMessage etc. doesn't matter.
558
+
559
+ const timestamp = 1693602618 ;
560
+ final stream = eg.stream ();
561
+ Message streamMessage (int id, User sender) =>
562
+ eg.streamMessage (id: id, sender: sender,
563
+ stream: stream, topic: 'foo' , timestamp: timestamp);
564
+ Message dmMessage (int id, User sender) =>
565
+ eg.dmMessage (id: id, from: sender, timestamp: timestamp,
566
+ to: [sender.userId == eg.selfUser.userId ? eg.otherUser : eg.selfUser]);
567
+
568
+ prepare ();
569
+ await prepareMessages (foundOldest: true , messages: [
570
+ streamMessage (1 , eg.selfUser), // first message, so show sender
571
+ streamMessage (2 , eg.selfUser), // hide sender
572
+ streamMessage (3 , eg.otherUser), // no recipient header, but new sender
573
+ dmMessage (4 , eg.otherUser), // same sender, but recipient header
574
+ ]);
575
+
576
+ // We check showSender has the right values in [checkInvariants],
577
+ // but to make this test explicit:
578
+ check (model.items).deepEquals ([
579
+ it ()..isA <MessageListHistoryStartItem >(),
580
+ it ()..isA <MessageListRecipientHeaderItem >(),
581
+ it ()..isA <MessageListMessageItem >().showSender.isTrue (),
582
+ it ()..isA <MessageListMessageItem >().showSender.isFalse (),
583
+ it ()..isA <MessageListMessageItem >().showSender.isTrue (),
584
+ it ()..isA <MessageListRecipientHeaderItem >(),
585
+ it ()..isA <MessageListMessageItem >().showSender.isTrue (),
586
+ ]);
587
+ });
588
+
552
589
group ('canShareRecipientHeader' , () {
553
590
test ('stream messages vs DMs, no share' , () {
554
591
final dmMessage = eg.dmMessage (from: eg.selfUser, to: [eg.otherUser]);
@@ -669,15 +706,18 @@ void checkInvariants(MessageListView model) {
669
706
check (model.items[i++ ]).isA <MessageListLoadingItem >();
670
707
}
671
708
for (int j = 0 ; j < model.messages.length; j++ ) {
709
+ bool isFirstInBlock = false ;
672
710
if (j == 0
673
711
|| ! canShareRecipientHeader (model.messages[j- 1 ], model.messages[j])) {
674
712
check (model.items[i++ ]).isA <MessageListRecipientHeaderItem >()
675
713
.message.identicalTo (model.messages[j]);
714
+ isFirstInBlock = true ;
676
715
}
677
716
check (model.items[i++ ]).isA <MessageListMessageItem >()
678
717
..message.identicalTo (model.messages[j])
679
718
..content.identicalTo (model.contents[j])
680
- ..showSender.isTrue ()
719
+ ..showSender.equals (
720
+ isFirstInBlock || model.messages[j].senderId != model.messages[j- 1 ].senderId)
681
721
..isLastInBlock.equals (
682
722
i == model.items.length || model.items[i] is ! MessageListMessageItem );
683
723
}
0 commit comments