Skip to content

Commit 64a12fb

Browse files
sm-sayedichrisbobbe
andcommitted
user: Add UserStore.isUserMuted, with event updates
Co-authored-by: Chris Bobbe <[email protected]>
1 parent 9293d8c commit 64a12fb

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

lib/model/store.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,10 @@ class PerAccountStore extends PerAccountStoreBase with ChangeNotifier, EmojiStor
645645
@override
646646
Iterable<User> get allUsers => _users.allUsers;
647647

648+
@override
649+
bool isUserMuted(int userId, {MutedUsersEvent? event}) =>
650+
_users.isUserMuted(userId, event: event);
651+
648652
final UserStoreImpl _users;
649653

650654
final TypingStatus typingStatus;
@@ -950,8 +954,9 @@ class PerAccountStore extends PerAccountStoreBase with ChangeNotifier, EmojiStor
950954
_messages.handleReactionEvent(event);
951955

952956
case MutedUsersEvent():
953-
// TODO handle
954-
break;
957+
assert(debugLog("server event: muted_users"));
958+
_users.handleMutedUsersEvent(event);
959+
notifyListeners();
955960

956961
case UnexpectedEvent():
957962
assert(debugLog("server event: ${jsonEncode(event.toJson())}")); // TODO log better

lib/model/user.dart

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ mixin UserStore on PerAccountStoreBase {
6666
return getUser(message.senderId)?.fullName
6767
?? message.senderFullName;
6868
}
69+
70+
/// Whether the user with [userId] is muted by the self-user.
71+
///
72+
/// Looks for [userId] in a private [Set],
73+
/// or in [event.mutedUsers] instead if event is non-null.
74+
bool isUserMuted(int userId, {MutedUsersEvent? event});
6975
}
7076

7177
/// The implementation of [UserStore] that does the work.
@@ -81,7 +87,8 @@ class UserStoreImpl extends PerAccountStoreBase with UserStore {
8187
initialSnapshot.realmUsers
8288
.followedBy(initialSnapshot.realmNonActiveUsers)
8389
.followedBy(initialSnapshot.crossRealmBots)
84-
.map((user) => MapEntry(user.userId, user)));
90+
.map((user) => MapEntry(user.userId, user))),
91+
_mutedUsers = Set.from(initialSnapshot.mutedUsers.map((item) => item.id));
8592

8693
final Map<int, User> _users;
8794

@@ -91,6 +98,13 @@ class UserStoreImpl extends PerAccountStoreBase with UserStore {
9198
@override
9299
Iterable<User> get allUsers => _users.values;
93100

101+
final Set<int> _mutedUsers;
102+
103+
@override
104+
bool isUserMuted(int userId, {MutedUsersEvent? event}) {
105+
return (event?.mutedUsers.map((item) => item.id) ?? _mutedUsers).contains(userId);
106+
}
107+
94108
void handleRealmUserEvent(RealmUserEvent event) {
95109
switch (event) {
96110
case RealmUserAddEvent():
@@ -129,4 +143,9 @@ class UserStoreImpl extends PerAccountStoreBase with UserStore {
129143
}
130144
}
131145
}
146+
147+
void handleMutedUsersEvent(MutedUsersEvent event) {
148+
_mutedUsers.clear();
149+
_mutedUsers.addAll(event.mutedUsers.map((item) => item.id));
150+
}
132151
}

test/model/user_test.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,27 @@ void main() {
7979
check(getUser()).deliveryEmail.equals('[email protected]');
8080
});
8181
});
82+
83+
testWidgets('MutedUsersEvent', (tester) async {
84+
final user1 = eg.user(userId: 1);
85+
final user2 = eg.user(userId: 2);
86+
final user3 = eg.user(userId: 3);
87+
88+
final store = eg.store(initialSnapshot: eg.initialSnapshot(
89+
realmUsers: [user1, user2, user3],
90+
mutedUsers: [MutedUserItem(id: 2), MutedUserItem(id: 1)]));
91+
check(store.isUserMuted(1)).isTrue();
92+
check(store.isUserMuted(2)).isTrue();
93+
check(store.isUserMuted(3)).isFalse();
94+
95+
await store.handleEvent(eg.mutedUsersEvent([2, 1, 3]));
96+
check(store.isUserMuted(1)).isTrue();
97+
check(store.isUserMuted(2)).isTrue();
98+
check(store.isUserMuted(3)).isTrue();
99+
100+
await store.handleEvent(eg.mutedUsersEvent([2, 3]));
101+
check(store.isUserMuted(1)).isFalse();
102+
check(store.isUserMuted(2)).isTrue();
103+
check(store.isUserMuted(3)).isTrue();
104+
});
82105
}

0 commit comments

Comments
 (0)