@@ -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
@@ -633,10 +634,12 @@ class MessageListView with ChangeNotifier, _MessageSequence {
633634 bool _messageVisible (MessageBase message) {
634635 switch (narrow) {
635636 case CombinedFeedNarrow ():
636- return switch (message.conversation) {
637+ final conversation = message.conversation;
638+ return switch (conversation) {
637639 StreamConversation (: final streamId, : final topic) =>
638640 store.isTopicVisible (streamId, topic),
639- DmConversation () => true ,
641+ DmConversation () => ! store.shouldMuteDmConversation (
642+ DmNarrow .ofConversation (conversation, selfUserId: store.selfUserId)),
640643 };
641644
642645 case ChannelNarrow (: final streamId):
@@ -647,45 +650,71 @@ class MessageListView with ChangeNotifier, _MessageSequence {
647650
648651 case TopicNarrow ():
649652 case DmNarrow ():
653+ return true ;
654+
650655 case MentionsNarrow ():
651656 case StarredMessagesNarrow ():
657+ if (message.conversation case DmConversation (: final allRecipientIds)) {
658+ return ! store.shouldMuteDmConversation (DmNarrow (
659+ allRecipientIds: allRecipientIds, selfUserId: store.selfUserId));
660+ }
652661 return true ;
653662 }
654663 }
655664
665+ /// Whether [_messageVisible] is true for all possible messages.
666+ ///
667+ /// This is useful for an optimization.
668+ bool get _allMessagesVisible {
669+ switch (narrow) {
670+ case CombinedFeedNarrow ():
671+ case ChannelNarrow ():
672+ return false ;
673+
674+ case TopicNarrow ():
675+ case DmNarrow ():
676+ return true ;
677+
678+ case MentionsNarrow ():
679+ case StarredMessagesNarrow ():
680+ return false ;
681+ }
682+ }
683+
656684 /// Whether this event could affect the result that [_messageVisible]
657685 /// would ever have returned for any possible message in this message list.
658- VisibilityEffect _canAffectVisibility (UserTopicEvent event) {
686+ UserTopicVisibilityEffect _userTopicEventCanAffectVisibility (UserTopicEvent event) {
659687 switch (narrow) {
660688 case CombinedFeedNarrow ():
661689 return store.willChangeIfTopicVisible (event);
662690
663691 case ChannelNarrow (: final streamId):
664- if (event.streamId != streamId) return VisibilityEffect .none;
692+ if (event.streamId != streamId) return UserTopicVisibilityEffect .none;
665693 return store.willChangeIfTopicVisibleInStream (event);
666694
667695 case TopicNarrow ():
668696 case DmNarrow ():
669697 case MentionsNarrow ():
670698 case StarredMessagesNarrow ():
671- return VisibilityEffect .none;
699+ return UserTopicVisibilityEffect .none;
672700 }
673701 }
674702
675- /// Whether [_messageVisible] is true for all possible messages.
676- ///
677- /// This is useful for an optimization.
678- bool get _allMessagesVisible {
679- switch (narrow) {
703+ /// Whether this event could affect the result that [_messageVisible]
704+ /// would ever have returned for any possible message in this message list.
705+ MutedUsersVisibilityEffect _mutedUsersEventCanAffectVisibility (MutedUsersEvent event) {
706+ switch (narrow) {
680707 case CombinedFeedNarrow ():
681- case ChannelNarrow ():
682- return false ;
708+ return store.mightChangeShouldMuteDmConversation (event);
683709
710+ case ChannelNarrow ():
684711 case TopicNarrow ():
685712 case DmNarrow ():
713+ return MutedUsersVisibilityEffect .none;
714+
686715 case MentionsNarrow ():
687716 case StarredMessagesNarrow ():
688- return true ;
717+ return store. mightChangeShouldMuteDmConversation (event) ;
689718 }
690719 }
691720
@@ -961,11 +990,11 @@ class MessageListView with ChangeNotifier, _MessageSequence {
961990 }
962991
963992 void handleUserTopicEvent (UserTopicEvent event) {
964- switch (_canAffectVisibility (event)) {
965- case VisibilityEffect .none:
993+ switch (_userTopicEventCanAffectVisibility (event)) {
994+ case UserTopicVisibilityEffect .none:
966995 return ;
967996
968- case VisibilityEffect .muted:
997+ case UserTopicVisibilityEffect .muted:
969998 bool removed = _removeMessagesWhere ((message) =>
970999 message is StreamMessage
9711000 && message.streamId == event.streamId
@@ -980,7 +1009,35 @@ class MessageListView with ChangeNotifier, _MessageSequence {
9801009 notifyListeners ();
9811010 }
9821011
983- case VisibilityEffect .unmuted:
1012+ case UserTopicVisibilityEffect .unmuted:
1013+ // TODO get the newly-unmuted messages from the message store
1014+ // For now, we simplify the task by just refetching this message list
1015+ // from scratch.
1016+ if (fetched) {
1017+ _reset ();
1018+ notifyListeners ();
1019+ fetchInitial ();
1020+ }
1021+ }
1022+ }
1023+
1024+ void handleMutedUsersEvent (MutedUsersEvent event) {
1025+ switch (_mutedUsersEventCanAffectVisibility (event)) {
1026+ case MutedUsersVisibilityEffect .none:
1027+ return ;
1028+
1029+ case MutedUsersVisibilityEffect .muted:
1030+ final anyRemoved = _removeMessagesWhere ((message) {
1031+ if (message is ! DmMessage ) return false ;
1032+ final narrow = DmNarrow .ofMessage (message, selfUserId: store.selfUserId);
1033+ return store.shouldMuteDmConversation (narrow, event: event);
1034+ });
1035+ if (anyRemoved) {
1036+ notifyListeners ();
1037+ }
1038+
1039+ case MutedUsersVisibilityEffect .mixed:
1040+ case MutedUsersVisibilityEffect .unmuted:
9841041 // TODO get the newly-unmuted messages from the message store
9851042 // For now, we simplify the task by just refetching this message list
9861043 // from scratch.
0 commit comments