@@ -13,6 +13,7 @@ import 'content.dart';
13
13
import 'message.dart' ;
14
14
import 'narrow.dart' ;
15
15
import 'store.dart' ;
16
+ import 'user.dart' ;
16
17
17
18
/// The number of messages to fetch in each request.
18
19
const kMessageListFetchBatchSize = 100 ; // TODO tune
@@ -461,7 +462,9 @@ class MessageListView with ChangeNotifier, _MessageSequence {
461
462
return switch (message.conversation) {
462
463
StreamConversation (: final streamId, : final topic) =>
463
464
store.isTopicVisible (streamId, topic),
464
- DmConversation () => true ,
465
+ DmConversation (: final allRecipientIds) =>
466
+ ! store.shouldMuteDmConversation (DmNarrow (
467
+ allRecipientIds: allRecipientIds, selfUserId: store.selfUserId)),
465
468
};
466
469
467
470
case ChannelNarrow (: final streamId):
@@ -472,8 +475,14 @@ class MessageListView with ChangeNotifier, _MessageSequence {
472
475
473
476
case TopicNarrow ():
474
477
case DmNarrow ():
478
+ return true ;
479
+
475
480
case MentionsNarrow ():
476
481
case StarredMessagesNarrow ():
482
+ if (message.conversation case DmConversation (: final allRecipientIds)) {
483
+ return ! store.shouldMuteDmConversation (DmNarrow (
484
+ allRecipientIds: allRecipientIds, selfUserId: store.selfUserId));
485
+ }
477
486
return true ;
478
487
}
479
488
}
@@ -485,12 +494,12 @@ class MessageListView with ChangeNotifier, _MessageSequence {
485
494
switch (narrow) {
486
495
case CombinedFeedNarrow ():
487
496
case ChannelNarrow ():
497
+ case MentionsNarrow ():
498
+ case StarredMessagesNarrow ():
488
499
return false ;
489
500
490
501
case TopicNarrow ():
491
502
case DmNarrow ():
492
- case MentionsNarrow ():
493
- case StarredMessagesNarrow ():
494
503
return true ;
495
504
}
496
505
}
@@ -514,6 +523,22 @@ class MessageListView with ChangeNotifier, _MessageSequence {
514
523
}
515
524
}
516
525
526
+ /// Whether this event could affect the result that [_messageVisible]
527
+ /// would ever have returned for any possible message in this message list.
528
+ MutedUsersVisibilityEffect _mutedUsersEventCanAffectVisibility (MutedUsersEvent event) {
529
+ switch (narrow) {
530
+ case CombinedFeedNarrow ():
531
+ case MentionsNarrow ():
532
+ case StarredMessagesNarrow ():
533
+ return store.mightChangeShouldMuteDmConversation (event);
534
+
535
+ case ChannelNarrow ():
536
+ case TopicNarrow ():
537
+ case DmNarrow ():
538
+ return MutedUsersVisibilityEffect .none;
539
+ }
540
+ }
541
+
517
542
/// Fetch messages, starting from scratch.
518
543
Future <void > fetchInitial () async {
519
544
// TODO(#80): fetch from anchor firstUnread, instead of newest
@@ -685,6 +710,36 @@ class MessageListView with ChangeNotifier, _MessageSequence {
685
710
}
686
711
}
687
712
713
+ void handleMutedUsersEvent (MutedUsersEvent event) {
714
+ final newMutedUsers = {...event.mutedUsers.map ((e) => e.id)};
715
+
716
+ switch (_mutedUsersEventCanAffectVisibility (event)) {
717
+ case MutedUsersVisibilityEffect .none:
718
+ return ;
719
+
720
+ case MutedUsersVisibilityEffect .muted:
721
+ final anyRemoved = _removeMessagesWhere ((message) {
722
+ if (message is ! DmMessage ) return false ;
723
+ final narrow = DmNarrow .ofMessage (message, selfUserId: store.selfUserId);
724
+ return store.shouldMuteDmConversation (narrow, mutedUsers: newMutedUsers);
725
+ });
726
+ if (anyRemoved) {
727
+ notifyListeners ();
728
+ }
729
+
730
+ case MutedUsersVisibilityEffect .mixed:
731
+ case MutedUsersVisibilityEffect .unmuted:
732
+ // TODO get the newly-unmuted messages from the message store
733
+ // For now, we simplify the task by just refetching this message list
734
+ // from scratch.
735
+ if (fetched) {
736
+ _reset ();
737
+ notifyListeners ();
738
+ fetchInitial ();
739
+ }
740
+ }
741
+ }
742
+
688
743
void handleDeleteMessageEvent (DeleteMessageEvent event) {
689
744
if (_removeMessagesById (event.messageIds)) {
690
745
notifyListeners ();
0 commit comments