@@ -13,6 +13,7 @@ import 'content.dart';
1313import 'message.dart' ;
1414import 'narrow.dart' ;
1515import 'store.dart' ;
16+ import 'user.dart' ;
1617
1718export '../api/route/messages.dart' show Anchor, AnchorCode, NumericAnchor;
1819
@@ -622,10 +623,12 @@ class MessageListView with ChangeNotifier, _MessageSequence {
622623 bool _messageVisible (MessageBase message) {
623624 switch (narrow) {
624625 case CombinedFeedNarrow ():
625- return switch (message.conversation) {
626+ final conversation = message.conversation;
627+ return switch (conversation) {
626628 StreamConversation (: final streamId, : final topic) =>
627629 store.isTopicVisible (streamId, topic),
628- DmConversation () => true ,
630+ DmConversation () => ! store.shouldMuteDmConversation (
631+ DmNarrow .ofConversation (conversation, selfUserId: store.selfUserId)),
629632 };
630633
631634 case ChannelNarrow (: final streamId):
@@ -636,8 +639,14 @@ class MessageListView with ChangeNotifier, _MessageSequence {
636639
637640 case TopicNarrow ():
638641 case DmNarrow ():
642+ return true ;
643+
639644 case MentionsNarrow ():
640645 case StarredMessagesNarrow ():
646+ if (message.conversation case DmConversation (: final allRecipientIds)) {
647+ return ! store.shouldMuteDmConversation (DmNarrow (
648+ allRecipientIds: allRecipientIds, selfUserId: store.selfUserId));
649+ }
641650 return true ;
642651 }
643652 }
@@ -653,9 +662,11 @@ class MessageListView with ChangeNotifier, _MessageSequence {
653662
654663 case TopicNarrow ():
655664 case DmNarrow ():
665+ return true ;
666+
656667 case MentionsNarrow ():
657668 case StarredMessagesNarrow ():
658- return true ;
669+ return false ;
659670 }
660671 }
661672
@@ -678,6 +689,24 @@ class MessageListView with ChangeNotifier, _MessageSequence {
678689 }
679690 }
680691
692+ /// Whether this event could affect the result that [_messageVisible]
693+ /// would ever have returned for any possible message in this message list.
694+ MutedUsersVisibilityEffect _mutedUsersEventCanAffectVisibility (MutedUsersEvent event) {
695+ switch (narrow) {
696+ case CombinedFeedNarrow ():
697+ return store.mightChangeShouldMuteDmConversation (event);
698+
699+ case ChannelNarrow ():
700+ case TopicNarrow ():
701+ case DmNarrow ():
702+ return MutedUsersVisibilityEffect .none;
703+
704+ case MentionsNarrow ():
705+ case StarredMessagesNarrow ():
706+ return store.mightChangeShouldMuteDmConversation (event);
707+ }
708+ }
709+
681710 void _setStatus (FetchingStatus value, {FetchingStatus ? was}) {
682711 assert (was == null || _status == was);
683712 _status = value;
@@ -981,6 +1010,34 @@ class MessageListView with ChangeNotifier, _MessageSequence {
9811010 }
9821011 }
9831012
1013+ void handleMutedUsersEvent (MutedUsersEvent event) {
1014+ switch (_mutedUsersEventCanAffectVisibility (event)) {
1015+ case MutedUsersVisibilityEffect .none:
1016+ return ;
1017+
1018+ case MutedUsersVisibilityEffect .muted:
1019+ final anyRemoved = _removeMessagesWhere ((message) {
1020+ if (message is ! DmMessage ) return false ;
1021+ final narrow = DmNarrow .ofMessage (message, selfUserId: store.selfUserId);
1022+ return store.shouldMuteDmConversation (narrow, event: event);
1023+ });
1024+ if (anyRemoved) {
1025+ notifyListeners ();
1026+ }
1027+
1028+ case MutedUsersVisibilityEffect .mixed:
1029+ case MutedUsersVisibilityEffect .unmuted:
1030+ // TODO get the newly-unmuted messages from the message store
1031+ // For now, we simplify the task by just refetching this message list
1032+ // from scratch.
1033+ if (fetched) {
1034+ _reset ();
1035+ notifyListeners ();
1036+ fetchInitial ();
1037+ }
1038+ }
1039+ }
1040+
9841041 void handleDeleteMessageEvent (DeleteMessageEvent event) {
9851042 if (_removeMessagesById (event.messageIds)) {
9861043 notifyListeners ();
0 commit comments