From 1782eb3bea8311c0820667ae61d7e653db7c29d1 Mon Sep 17 00:00:00 2001 From: Leandro Borges Ferreira Date: Mon, 30 Jan 2023 12:55:12 +0100 Subject: [PATCH 1/7] Adding start/stop watching event --- .../stream_chat/lib/src/client/channel.dart | 33 +++++++++++++++++++ packages/stream_chat/lib/src/event_type.dart | 6 ++++ 2 files changed, 39 insertions(+) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index bfaae76a..8b132f02 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1754,6 +1754,26 @@ class ChannelClientState { )); } + void _listenUserStartWatching() { + _subscriptions.add( + _channel.on(EventType.userWatchingStart).listen((event) { + if (event.user != null) { + _incrementWatcher(event.user!); + } + }), + ); + } + + void _listenUserStopWatching() { + _subscriptions.add( + _channel.on(EventType.userWatchingStop).listen((event) { + if (event.user != null) { + channelState.watchers?.remove(event.user); + } + }), + ); + } + void _listenMemberUnbanned() { _subscriptions.add(_channel .on(EventType.userUnbanned) @@ -1770,6 +1790,19 @@ class ChannelClientState { )); } + void _incrementWatcher(User user) { + List newWatchers; + + if (channelState.watchers == null) { + channelState.watchers!.add(user); + newWatchers = channelState.watchers!; + } else { + newWatchers = [user]; + } + + channelState.copyWith(watchers: newWatchers); + } + void _updateMember(Member member) { final currentMembers = [...members]; final memberIndex = currentMembers.indexWhere( 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'; From 46f09e706703254988229e5d04538361e937a602 Mon Sep 17 00:00:00 2001 From: Leandro Borges Ferreira Date: Mon, 30 Jan 2023 17:41:09 +0100 Subject: [PATCH 2/7] Listening for watchers --- packages/stream_chat/lib/src/client/channel.dart | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 8b132f02..15f093e5 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1613,6 +1613,10 @@ class ChannelClientState { _listenMemberUnbanned(); + _listenUserStartWatching(); + + _listenUserStopWatching(); + _startCleaningStaleTypingEvents(); _startCleaningStalePinnedMessages(); @@ -1793,7 +1797,7 @@ class ChannelClientState { void _incrementWatcher(User user) { List newWatchers; - if (channelState.watchers == null) { + if (channelState.watchers != null) { channelState.watchers!.add(user); newWatchers = channelState.watchers!; } else { @@ -2113,9 +2117,13 @@ class ChannelClientState { /// Channel watchers list as a stream. Stream> get watchersStream => CombineLatestStream.combine2< List?, Map, List>( - channelStateStream.map((cs) => cs.watchers), + channelStateStream + .map((cs) => cs.watchers) + .where((watchers) => watchers != null), _channel.client.state.usersStream, - (watchers, users) => watchers!.map((e) => users[e.id] ?? e).toList(), + (watchers, users) { + return watchers!.map((e) => users[e.id] ?? e).toList(); + } , ); /// Channel member for the current user. From 1b9110a03442cbd6c2eedc3a2ad16efcc049c997 Mon Sep 17 00:00:00 2001 From: Leandro Borges Ferreira Date: Mon, 30 Jan 2023 17:58:30 +0100 Subject: [PATCH 3/7] Simply watchers logic --- packages/stream_chat/lib/src/client/channel.dart | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 15f093e5..a05f9922 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -2115,16 +2115,9 @@ class ChannelClientState { .toList(); /// Channel watchers list as a stream. - Stream> get watchersStream => CombineLatestStream.combine2< - List?, Map, List>( - channelStateStream - .map((cs) => cs.watchers) - .where((watchers) => watchers != null), - _channel.client.state.usersStream, - (watchers, users) { - return watchers!.map((e) => users[e.id] ?? e).toList(); - } , - ); + Stream?> get watchersStream => channelStateStream + .map((cs) => cs.watchers) + .where((watchers) => watchers != null); /// Channel member for the current user. Member? get currentUserMember => members.firstWhereOrNull( From c37c2827418e9e0c1f368fabed04c44833dcfbd8 Mon Sep 17 00:00:00 2001 From: Leandro Borges Ferreira Date: Mon, 30 Jan 2023 18:16:41 +0100 Subject: [PATCH 4/7] Update CHANGELOG.md --- packages/stream_chat/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 15a9a9b2..b394f1eb 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,9 @@ +## To come + +🐞 Fixed + +- Fixed streamWatchers. Before it was always new, now it is possible to follow the watchers of a channel. + ## 5.3.0 🔄 Changed From a34ac516528ac899086b96bb2c9bd3bf76480f5a Mon Sep 17 00:00:00 2001 From: Leandro Borges Ferreira Date: Tue, 31 Jan 2023 14:16:58 +0100 Subject: [PATCH 5/7] Emmiting changes instead of applying on place --- .../stream_chat/lib/src/client/channel.dart | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index a05f9922..e9635caa 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1762,7 +1762,14 @@ class ChannelClientState { _subscriptions.add( _channel.on(EventType.userWatchingStart).listen((event) { if (event.user != null) { - _incrementWatcher(event.user!); + final watcher = event.user; + final existingWatchers = channelState.watchers ?? []; + updateChannelState(channelState.copyWith( + watchers: [ + ...existingWatchers, + watcher!, + ], + )); } }), ); @@ -1772,7 +1779,14 @@ class ChannelClientState { _subscriptions.add( _channel.on(EventType.userWatchingStop).listen((event) { if (event.user != null) { - channelState.watchers?.remove(event.user); + final watcher = event.user; + final existingWatchers = channelState.watchers ?? []; + + updateChannelState(channelState.copyWith( + watchers: existingWatchers + .where((user) => user.id != watcher!.id) + .toList(growable: false), + )); } }), ); From 41391dd3373e9788933e3c7d49de985c1121a4fb Mon Sep 17 00:00:00 2001 From: Leandro Borges Ferreira Date: Tue, 31 Jan 2023 14:22:11 +0100 Subject: [PATCH 6/7] Removing unused code --- packages/stream_chat/lib/src/client/channel.dart | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index e9635caa..68ce9717 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1808,19 +1808,6 @@ class ChannelClientState { )); } - void _incrementWatcher(User user) { - List newWatchers; - - if (channelState.watchers != null) { - channelState.watchers!.add(user); - newWatchers = channelState.watchers!; - } else { - newWatchers = [user]; - } - - channelState.copyWith(watchers: newWatchers); - } - void _updateMember(Member member) { final currentMembers = [...members]; final memberIndex = currentMembers.indexWhere( From b1e71a28c6bf8b85209ca158b191ebc68988f886 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 9 Feb 2023 15:17:39 +0530 Subject: [PATCH 7/7] chore(llc): minor changes Signed-off-by: xsahil03x --- .../stream_chat/lib/src/client/channel.dart | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 68ce9717..7abcf1d0 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1761,13 +1761,13 @@ class ChannelClientState { void _listenUserStartWatching() { _subscriptions.add( _channel.on(EventType.userWatchingStart).listen((event) { - if (event.user != null) { - final watcher = event.user; - final existingWatchers = channelState.watchers ?? []; + final watcher = event.user; + if (watcher != null) { + final existingWatchers = channelState.watchers; updateChannelState(channelState.copyWith( watchers: [ - ...existingWatchers, - watcher!, + ...?existingWatchers, + watcher, ], )); } @@ -1778,13 +1778,12 @@ class ChannelClientState { void _listenUserStopWatching() { _subscriptions.add( _channel.on(EventType.userWatchingStop).listen((event) { - if (event.user != null) { - final watcher = event.user; - final existingWatchers = channelState.watchers ?? []; - + final watcher = event.user; + if (watcher != null) { + final existingWatchers = channelState.watchers; updateChannelState(channelState.copyWith( watchers: existingWatchers - .where((user) => user.id != watcher!.id) + ?.where((user) => user.id != watcher.id) .toList(growable: false), )); } @@ -2116,9 +2115,12 @@ class ChannelClientState { .toList(); /// Channel watchers list as a stream. - Stream?> get watchersStream => channelStateStream - .map((cs) => cs.watchers) - .where((watchers) => watchers != null); + Stream> get watchersStream => CombineLatestStream.combine2< + List?, Map, List>( + 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(