diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index f11ba8c1..f0ee6485 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,5 +1,10 @@ ## Upcoming +🐞 Fixed + +- Fixed streamWatchers. Before it was always new, now it is possible to follow the watchers of a channel. +## Upcoming + 🔄 Changed - Cancelling a attachment upload now removes the attachment from the message. diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 888780f3..528a0fee 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1628,6 +1628,10 @@ class ChannelClientState { _listenMemberUnbanned(); + _listenUserStartWatching(); + + _listenUserStopWatching(); + _startCleaningStaleTypingEvents(); _startCleaningStalePinnedMessages(); @@ -1769,6 +1773,39 @@ class ChannelClientState { )); } + void _listenUserStartWatching() { + _subscriptions.add( + _channel.on(EventType.userWatchingStart).listen((event) { + final watcher = event.user; + if (watcher != null) { + final existingWatchers = channelState.watchers; + updateChannelState(channelState.copyWith( + watchers: [ + ...?existingWatchers, + watcher, + ], + )); + } + }), + ); + } + + void _listenUserStopWatching() { + _subscriptions.add( + _channel.on(EventType.userWatchingStop).listen((event) { + final watcher = event.user; + if (watcher != null) { + final existingWatchers = channelState.watchers; + updateChannelState(channelState.copyWith( + watchers: existingWatchers + ?.where((user) => user.id != watcher.id) + .toList(growable: false), + )); + } + }), + ); + } + void _listenMemberUnbanned() { _subscriptions.add(_channel .on(EventType.userUnbanned) @@ -2098,7 +2135,7 @@ class ChannelClientState { channelStateStream.map((cs) => cs.watchers), _channel.client.state.usersStream, (watchers, users) => watchers!.map((e) => users[e.id] ?? e).toList(), - ); + ).distinct(const ListEquality().equals); /// Channel member for the current user. Member? get currentUserMember => members.firstWhereOrNull( diff --git a/packages/stream_chat/lib/src/event_type.dart b/packages/stream_chat/lib/src/event_type.dart index b553943e..f8fb7ed7 100644 --- a/packages/stream_chat/lib/src/event_type.dart +++ b/packages/stream_chat/lib/src/event_type.dart @@ -36,6 +36,12 @@ class EventType { /// Event sent when updating a message static const String messageUpdated = 'message.updated'; + /// Event sent when a user starts watching a channel + static const String userWatchingStart = 'user.watching.start'; + + /// Event sent when a user stops watching a channel + static const String userWatchingStop = 'user.watching.stop'; + /// Event sent when reading a message static const String messageRead = 'message.read';