@@ -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,45 +639,71 @@ 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 }
644653
654+ /// Whether [_messageVisible] is true for all possible messages.
655+ ///
656+ /// This is useful for an optimization.
657+ bool get _allMessagesVisible {
658+ switch (narrow) {
659+ case CombinedFeedNarrow ():
660+ case ChannelNarrow ():
661+ return false ;
662+
663+ case TopicNarrow ():
664+ case DmNarrow ():
665+ return true ;
666+
667+ case MentionsNarrow ():
668+ case StarredMessagesNarrow ():
669+ return false ;
670+ }
671+ }
672+
645673 /// Whether this event could affect the result that [_messageVisible]
646674 /// would ever have returned for any possible message in this message list.
647- VisibilityEffect _canAffectVisibility (UserTopicEvent event) {
675+ UserTopicVisibilityEffect _userTopicEventCanAffectVisibility (UserTopicEvent event) {
648676 switch (narrow) {
649677 case CombinedFeedNarrow ():
650678 return store.willChangeIfTopicVisible (event);
651679
652680 case ChannelNarrow (: final streamId):
653- if (event.streamId != streamId) return VisibilityEffect .none;
681+ if (event.streamId != streamId) return UserTopicVisibilityEffect .none;
654682 return store.willChangeIfTopicVisibleInStream (event);
655683
656684 case TopicNarrow ():
657685 case DmNarrow ():
658686 case MentionsNarrow ():
659687 case StarredMessagesNarrow ():
660- return VisibilityEffect .none;
688+ return UserTopicVisibilityEffect .none;
661689 }
662690 }
663691
664- /// Whether [_messageVisible] is true for all possible messages.
665- ///
666- /// This is useful for an optimization.
667- bool get _allMessagesVisible {
668- switch (narrow) {
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) {
669696 case CombinedFeedNarrow ():
670- case ChannelNarrow ():
671- return false ;
697+ return store.mightChangeShouldMuteDmConversation (event);
672698
699+ case ChannelNarrow ():
673700 case TopicNarrow ():
674701 case DmNarrow ():
702+ return MutedUsersVisibilityEffect .none;
703+
675704 case MentionsNarrow ():
676705 case StarredMessagesNarrow ():
677- return true ;
706+ return store. mightChangeShouldMuteDmConversation (event) ;
678707 }
679708 }
680709
@@ -950,11 +979,11 @@ class MessageListView with ChangeNotifier, _MessageSequence {
950979 }
951980
952981 void handleUserTopicEvent (UserTopicEvent event) {
953- switch (_canAffectVisibility (event)) {
954- case VisibilityEffect .none:
982+ switch (_userTopicEventCanAffectVisibility (event)) {
983+ case UserTopicVisibilityEffect .none:
955984 return ;
956985
957- case VisibilityEffect .muted:
986+ case UserTopicVisibilityEffect .muted:
958987 bool removed = _removeMessagesWhere ((message) =>
959988 message is StreamMessage
960989 && message.streamId == event.streamId
@@ -969,7 +998,35 @@ class MessageListView with ChangeNotifier, _MessageSequence {
969998 notifyListeners ();
970999 }
9711000
972- case VisibilityEffect .unmuted:
1001+ case UserTopicVisibilityEffect .unmuted:
1002+ // TODO get the newly-unmuted messages from the message store
1003+ // For now, we simplify the task by just refetching this message list
1004+ // from scratch.
1005+ if (fetched) {
1006+ _reset ();
1007+ notifyListeners ();
1008+ fetchInitial ();
1009+ }
1010+ }
1011+ }
1012+
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:
9731030 // TODO get the newly-unmuted messages from the message store
9741031 // For now, we simplify the task by just refetching this message list
9751032 // from scratch.
0 commit comments