@@ -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
@@ -658,10 +659,12 @@ class MessageListView with ChangeNotifier, _MessageSequence {
658659 bool _messageVisible (MessageBase message) {
659660 switch (narrow) {
660661 case CombinedFeedNarrow ():
661- return switch (message.conversation) {
662+ final conversation = message.conversation;
663+ return switch (conversation) {
662664 StreamConversation (: final streamId, : final topic) =>
663665 store.isTopicVisible (streamId, topic),
664- DmConversation () => true ,
666+ DmConversation () => ! store.shouldMuteDmConversation (
667+ DmNarrow .ofConversation (conversation, selfUserId: store.selfUserId)),
665668 };
666669
667670 case ChannelNarrow (: final streamId):
@@ -672,8 +675,14 @@ class MessageListView with ChangeNotifier, _MessageSequence {
672675
673676 case TopicNarrow ():
674677 case DmNarrow ():
678+ return true ;
679+
675680 case MentionsNarrow ():
676681 case StarredMessagesNarrow ():
682+ if (message.conversation case DmConversation (: final allRecipientIds)) {
683+ return ! store.shouldMuteDmConversation (DmNarrow (
684+ allRecipientIds: allRecipientIds, selfUserId: store.selfUserId));
685+ }
677686 return true ;
678687 }
679688 }
@@ -689,9 +698,11 @@ class MessageListView with ChangeNotifier, _MessageSequence {
689698
690699 case TopicNarrow ():
691700 case DmNarrow ():
701+ return true ;
702+
692703 case MentionsNarrow ():
693704 case StarredMessagesNarrow ():
694- return true ;
705+ return false ;
695706 }
696707 }
697708
@@ -714,6 +725,24 @@ class MessageListView with ChangeNotifier, _MessageSequence {
714725 }
715726 }
716727
728+ /// Whether this event could affect the result that [_messageVisible]
729+ /// would ever have returned for any possible message in this message list.
730+ MutedUsersVisibilityEffect _mutedUsersEventCanAffectVisibility (MutedUsersEvent event) {
731+ switch (narrow) {
732+ case CombinedFeedNarrow ():
733+ return store.mightChangeShouldMuteDmConversation (event);
734+
735+ case ChannelNarrow ():
736+ case TopicNarrow ():
737+ case DmNarrow ():
738+ return MutedUsersVisibilityEffect .none;
739+
740+ case MentionsNarrow ():
741+ case StarredMessagesNarrow ():
742+ return store.mightChangeShouldMuteDmConversation (event);
743+ }
744+ }
745+
717746 void _setStatus (FetchingStatus value, {FetchingStatus ? was}) {
718747 assert (was == null || _status == was);
719748 _status = value;
@@ -1017,6 +1046,34 @@ class MessageListView with ChangeNotifier, _MessageSequence {
10171046 }
10181047 }
10191048
1049+ void handleMutedUsersEvent (MutedUsersEvent event) {
1050+ switch (_mutedUsersEventCanAffectVisibility (event)) {
1051+ case MutedUsersVisibilityEffect .none:
1052+ return ;
1053+
1054+ case MutedUsersVisibilityEffect .muted:
1055+ final anyRemoved = _removeMessagesWhere ((message) {
1056+ if (message is ! DmMessage ) return false ;
1057+ final narrow = DmNarrow .ofMessage (message, selfUserId: store.selfUserId);
1058+ return store.shouldMuteDmConversation (narrow, event: event);
1059+ });
1060+ if (anyRemoved) {
1061+ notifyListeners ();
1062+ }
1063+
1064+ case MutedUsersVisibilityEffect .mixed:
1065+ case MutedUsersVisibilityEffect .unmuted:
1066+ // TODO get the newly-unmuted messages from the message store
1067+ // For now, we simplify the task by just refetching this message list
1068+ // from scratch.
1069+ if (fetched) {
1070+ _reset ();
1071+ notifyListeners ();
1072+ fetchInitial ();
1073+ }
1074+ }
1075+ }
1076+
10201077 void handleDeleteMessageEvent (DeleteMessageEvent event) {
10211078 if (_removeMessagesById (event.messageIds)) {
10221079 notifyListeners ();
0 commit comments