From 1782eb3bea8311c0820667ae61d7e653db7c29d1 Mon Sep 17 00:00:00 2001 From: Leandro Borges Ferreira Date: Mon, 30 Jan 2023 12:55:12 +0100 Subject: [PATCH 01/11] 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 02/11] 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 03/11] 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 04/11] 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 05/11] 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 06/11] 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 8cc6fa941cbde0ed42a4653fffbf31277a67d612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Adasiewicz?= Date: Thu, 2 Feb 2023 10:30:49 +0100 Subject: [PATCH 07/11] chore(ui): update share_plus dependency --- packages/stream_chat_flutter/CHANGELOG.md | 4 ++++ packages/stream_chat_flutter/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 20c9cd51..7d7b1498 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## Upcoming + +- Updated `share_plus` dependency to `^6.3.0` + ## 5.3.0 🔄 Changed diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index ae24dbe5..8bc6e544 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: photo_manager: ^2.5.2 photo_view: ^0.14.0 rxdart: ^0.27.0 - share_plus: ^4.5.0 + share_plus: ^6.3.0 shimmer: ^2.0.0 stream_chat_flutter_core: ^5.3.0 synchronized: ^3.0.0 From cf45b4476fb7688a5bc455983593e975a18e799d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Adasiewicz?= Date: Thu, 2 Feb 2023 10:37:56 +0100 Subject: [PATCH 08/11] remove import --- packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart b/packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart index e46ec3bc..c5cfad78 100644 --- a/packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart +++ b/packages/stream_chat_flutter/lib/src/gallery/gallery_footer.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; -import 'package:file_selector/file_selector.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; From b656c8b7d8082fb95c42506d32af38cfd87b2e28 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 8 Feb 2023 19:08:21 +0530 Subject: [PATCH 09/11] fix(llc): cancelling attachments now removes it from the message. Signed-off-by: xsahil03x --- .../stream_chat/lib/src/client/channel.dart | 19 +++++++++++++++++-- .../lib/src/core/error/stream_chat_error.dart | 6 ++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index bfaae76a..888780f3 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -463,12 +463,19 @@ class Channel { client.logger.info('Found ${attachments.length} attachments'); - void updateAttachment(Attachment attachment) { + void updateAttachment(Attachment attachment, {bool remove = false}) { final index = message!.attachments.indexWhere( (it) => it.id == attachment.id, ); if (index != -1) { - final newAttachments = [...message!.attachments]..[index] = attachment; + // update or remove attachment from message. + final List newAttachments; + if (remove) { + newAttachments = [...message!.attachments]..removeAt(index); + } else { + newAttachments = [...message!.attachments]..[index] = attachment; + } + final updatedMessage = message!.copyWith(attachments: newAttachments); state?.updateMessage(updatedMessage); // updating original message for next iteration @@ -533,6 +540,14 @@ class Channel { ); } }).catchError((e, stk) { + if (e is StreamChatNetworkError && e.isRequestCancelledError) { + client.logger.info('Attachment ${it.id} upload cancelled'); + + // remove attachment from message if cancelled. + updateAttachment(it, remove: true); + return; + } + client.logger.severe('error uploading the attachment', e, stk); updateAttachment( it.copyWith(uploadState: UploadState.failed(error: e.toString())), diff --git a/packages/stream_chat/lib/src/core/error/stream_chat_error.dart b/packages/stream_chat/lib/src/core/error/stream_chat_error.dart index 80e83079..fc069a90 100644 --- a/packages/stream_chat/lib/src/core/error/stream_chat_error.dart +++ b/packages/stream_chat/lib/src/core/error/stream_chat_error.dart @@ -74,6 +74,7 @@ class StreamChatNetworkError extends StreamChatError { ChatErrorCode errorCode, { int? statusCode, this.data, + this.isRequestCancelledError = false, }) : code = errorCode.code, statusCode = statusCode ?? data?.statusCode, super(errorCode.message); @@ -84,6 +85,7 @@ class StreamChatNetworkError extends StreamChatError { required String message, this.statusCode, this.data, + this.isRequestCancelledError = false, }) : super(message); /// @@ -100,6 +102,7 @@ class StreamChatNetworkError extends StreamChatError { errorResponse?.message ?? response?.statusMessage ?? error.message, statusCode: errorResponse?.statusCode ?? response?.statusCode, data: errorResponse, + isRequestCancelledError: error.type == DioErrorType.cancel, )..stackTrace = error.stackTrace; } @@ -112,6 +115,9 @@ class StreamChatNetworkError extends StreamChatError { /// Response body. please refer to [ErrorResponse]. final ErrorResponse? data; + /// True, in case the error is due to a cancelled network request. + final bool isRequestCancelledError; + StackTrace? _stackTrace; /// From 065bbbc8f320a5e3c9d3ae34f6d763eee4f4b560 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 8 Feb 2023 19:09:32 +0530 Subject: [PATCH 10/11] chore(llc): update CHANGELOG.md Signed-off-by: xsahil03x --- 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..f11ba8c1 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,9 @@ +## Upcoming + +🔄 Changed + +- Cancelling a attachment upload now removes the attachment from the message. + ## 5.3.0 🔄 Changed From b1e71a28c6bf8b85209ca158b191ebc68988f886 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 9 Feb 2023 15:17:39 +0530 Subject: [PATCH 11/11] 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(