@@ -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
@@ -626,7 +627,9 @@ class MessageListView with ChangeNotifier, _MessageSequence {
626627 return switch (message.conversation) {
627628 StreamConversation (: final streamId, : final topic) =>
628629 store.isTopicVisible (streamId, topic),
629- DmConversation () => true ,
630+ DmConversation (: final allRecipientIds) =>
631+ ! store.shouldMuteDmConversation (DmNarrow (
632+ allRecipientIds: allRecipientIds, selfUserId: store.selfUserId)),
630633 };
631634
632635 case ChannelNarrow (: final streamId):
@@ -637,45 +640,67 @@ class MessageListView with ChangeNotifier, _MessageSequence {
637640
638641 case TopicNarrow ():
639642 case DmNarrow ():
643+ return true ;
644+
645+ case MentionsNarrow ():
646+ case StarredMessagesNarrow ():
647+ if (message.conversation case DmConversation (: final allRecipientIds)) {
648+ return ! store.shouldMuteDmConversation (DmNarrow (
649+ allRecipientIds: allRecipientIds, selfUserId: store.selfUserId));
650+ }
651+ return true ;
652+ }
653+ }
654+
655+ /// Whether [_messageVisible] is true for all possible messages.
656+ ///
657+ /// This is useful for an optimization.
658+ bool get _allMessagesVisible {
659+ switch (narrow) {
660+ case CombinedFeedNarrow ():
661+ case ChannelNarrow ():
640662 case MentionsNarrow ():
641663 case StarredMessagesNarrow ():
664+ return false ;
665+
666+ case TopicNarrow ():
667+ case DmNarrow ():
642668 return true ;
643669 }
644670 }
645671
646672 /// Whether this event could affect the result that [_messageVisible]
647673 /// would ever have returned for any possible message in this message list.
648- VisibilityEffect _canAffectVisibility (UserTopicEvent event) {
674+ UserTopicVisibilityEffect _userTopicEventCanAffectVisibility (UserTopicEvent event) {
649675 switch (narrow) {
650676 case CombinedFeedNarrow ():
651677 return store.willChangeIfTopicVisible (event);
652678
653679 case ChannelNarrow (: final streamId):
654- if (event.streamId != streamId) return VisibilityEffect .none;
680+ if (event.streamId != streamId) return UserTopicVisibilityEffect .none;
655681 return store.willChangeIfTopicVisibleInStream (event);
656682
657683 case TopicNarrow ():
658684 case DmNarrow ():
659685 case MentionsNarrow ():
660686 case StarredMessagesNarrow ():
661- return VisibilityEffect .none;
687+ return UserTopicVisibilityEffect .none;
662688 }
663689 }
664690
665- /// Whether [_messageVisible] is true for all possible messages.
666- ///
667- /// This is useful for an optimization.
668- bool get _allMessagesVisible {
669- switch (narrow) {
691+ /// Whether this event could affect the result that [_messageVisible]
692+ /// would ever have returned for any possible message in this message list.
693+ MutedUsersVisibilityEffect _mutedUsersEventCanAffectVisibility (MutedUsersEvent event) {
694+ switch (narrow) {
670695 case CombinedFeedNarrow ():
671- case ChannelNarrow ():
672- return false ;
696+ case MentionsNarrow ():
697+ case StarredMessagesNarrow ():
698+ return store.mightChangeShouldMuteDmConversation (event);
673699
700+ case ChannelNarrow ():
674701 case TopicNarrow ():
675702 case DmNarrow ():
676- case MentionsNarrow ():
677- case StarredMessagesNarrow ():
678- return true ;
703+ return MutedUsersVisibilityEffect .none;
679704 }
680705 }
681706
@@ -944,26 +969,26 @@ class MessageListView with ChangeNotifier, _MessageSequence {
944969 }
945970
946971 void handleUserTopicEvent (UserTopicEvent event) {
947- switch (_canAffectVisibility (event)) {
948- case VisibilityEffect .none:
972+ switch (_userTopicEventCanAffectVisibility (event)) {
973+ case UserTopicVisibilityEffect .none:
949974 return ;
950975
951- case VisibilityEffect .muted:
976+ case UserTopicVisibilityEffect .muted:
952977 bool removed = _removeOutboxMessagesWhere ((message) =>
953978 message is StreamOutboxMessage
954979 && message.conversation.streamId == event.streamId
955980 && message.conversation.topic == event.topicName);
956981
957982 removed | = _removeMessagesWhere ((message) =>
958983 message is StreamMessage
959- && message.streamId == event.streamId
984+ && message.streamId == event.streamId
960985 && message.topic == event.topicName);
961986
962987 if (removed) {
963988 notifyListeners ();
964989 }
965990
966- case VisibilityEffect .unmuted:
991+ case UserTopicVisibilityEffect .unmuted:
967992 // TODO get the newly-unmuted messages from the message store
968993 // For now, we simplify the task by just refetching this message list
969994 // from scratch.
@@ -987,6 +1012,36 @@ class MessageListView with ChangeNotifier, _MessageSequence {
9871012 }
9881013 }
9891014
1015+ void handleMutedUsersEvent (MutedUsersEvent event) {
1016+ final newMutedUsers = {...event.mutedUsers.map ((e) => e.id)};
1017+
1018+ switch (_mutedUsersEventCanAffectVisibility (event)) {
1019+ case MutedUsersVisibilityEffect .none:
1020+ return ;
1021+
1022+ case MutedUsersVisibilityEffect .muted:
1023+ final anyRemoved = _removeMessagesWhere ((message) {
1024+ if (message is ! DmMessage ) return false ;
1025+ final narrow = DmNarrow .ofMessage (message, selfUserId: store.selfUserId);
1026+ return store.shouldMuteDmConversation (narrow, mutedUsers: newMutedUsers);
1027+ });
1028+ if (anyRemoved) {
1029+ notifyListeners ();
1030+ }
1031+
1032+ case MutedUsersVisibilityEffect .mixed:
1033+ case MutedUsersVisibilityEffect .unmuted:
1034+ // TODO get the newly-unmuted messages from the message store
1035+ // For now, we simplify the task by just refetching this message list
1036+ // from scratch.
1037+ if (fetched) {
1038+ _reset ();
1039+ notifyListeners ();
1040+ fetchInitial ();
1041+ }
1042+ }
1043+ }
1044+
9901045 void handleDeleteMessageEvent (DeleteMessageEvent event) {
9911046 if (_removeMessagesById (event.messageIds)) {
9921047 notifyListeners ();
0 commit comments