From 5f93867657ee3c7610fdf367459d2cde9d249bad Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Tue, 22 Mar 2022 15:09:00 +0530 Subject: [PATCH 01/33] feat(ui): Calculate slidable extentRatio in case of custom actions Signed-off-by: xsahil03x --- .../stream_chat_flutter/lib/src/channel_list_view.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/channel_list_view.dart b/packages/stream_chat_flutter/lib/src/channel_list_view.dart index 7280d826..819ed40f 100644 --- a/packages/stream_chat_flutter/lib/src/channel_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/channel_list_view.dart @@ -513,13 +513,19 @@ class _ChannelListViewState extends State { final canDeleteChannel = channel.ownCapabilities.contains(PermissionType.deleteChannel); + final actionPaneChildren = + widget.swipeActions?.length ?? (canDeleteChannel ? 2 : 1); + final actionPaneExtentRatio = actionPaneChildren > 5 + ? 1 / actionPaneChildren + : actionPaneChildren * 0.2; + return StreamChannel( key: ValueKey('CHANNEL-${channel.cid}'), channel: channel, child: Slidable( enabled: widget.swipeToAction, endActionPane: ActionPane( - extentRatio: canDeleteChannel ? 0.4 : 0.2, + extentRatio: actionPaneExtentRatio, motion: const BehindMotion(), children: widget.swipeActions ?.map((e) => CustomSlidableAction( From 5f12802799e2c49cb42d2ebe5e6dfc4d42597cb8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 22 Mar 2022 16:34:06 +0100 Subject: [PATCH 02/33] fix reconnection event --- .../stream_chat/lib/src/client/client.dart | 11 ++++++---- .../example/android/app/build.gradle | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 21 ++++++++++++++----- .../src/stream_channel_list_controller.dart | 5 +---- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/packages/stream_chat/lib/src/client/client.dart b/packages/stream_chat/lib/src/client/client.dart index cab864b9..a3daa653 100644 --- a/packages/stream_chat/lib/src/client/client.dart +++ b/packages/stream_chat/lib/src/client/client.dart @@ -417,6 +417,7 @@ class StreamChatClient { } void _connectionStatusHandler(ConnectionStatus status) async { + final previousState = wsConnectionStatus; final currentState = _wsConnectionStatus = status; handleEvent(Event( @@ -436,10 +437,12 @@ class StreamChatClient { await sync(cids: cids, lastSyncAt: _lastSyncedAt); } } - handleEvent(Event( - type: EventType.connectionRecovered, - online: true, - )); + if (previousState != ConnectionStatus.connected) { + handleEvent(Event( + type: EventType.connectionRecovered, + online: true, + )); + } } } diff --git a/packages/stream_chat_flutter/example/android/app/build.gradle b/packages/stream_chat_flutter/example/android/app/build.gradle index 3974f949..6576512a 100644 --- a/packages/stream_chat_flutter/example/android/app/build.gradle +++ b/packages/stream_chat_flutter/example/android/app/build.gradle @@ -40,7 +40,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.example" - minSdkVersion 21 + minSdkVersion 22 targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/packages/stream_chat_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/stream_chat_flutter/example/ios/Runner.xcodeproj/project.pbxproj index 4b1a8d5d..2550e7a5 100644 --- a/packages/stream_chat_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/stream_chat_flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ @@ -68,7 +68,6 @@ 59062C6EC2CCFE110AC70AB8 /* Pods-Runner.release.xcconfig */, 4684439012E1DB1A82103E26 /* Pods-Runner.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -356,13 +355,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = EHV7XZLAHA; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -488,13 +491,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = EHV7XZLAHA; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -515,13 +522,17 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = EHV7XZLAHA; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", diff --git a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart index 7d3a281f..3b7342e5 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart @@ -221,6 +221,7 @@ class StreamChannelListController extends PagedValueNotifier { } _channelEventSubscription = client.on().listen((event) { + print('event.type: ${event.type}'); // Returns early if the event is already handled by the listener. if (eventListener?.call(event) ?? false) return; @@ -237,10 +238,6 @@ class StreamChannelListController extends PagedValueNotifier { _eventHandler.onChannelVisible(event, this); } else if (eventType == EventType.connectionRecovered) { _eventHandler.onConnectionRecovered(event, this); - } else if (eventType == EventType.connectionChanged) { - if (event.online != null) { - _eventHandler.onConnectionRecovered(event, this); - } } else if (eventType == EventType.messageNew) { _eventHandler.onMessageNew(event, this); } else if (eventType == EventType.notificationAddedToChannel) { From 2c2b6bdac24925a86c2194af27d5647f3f04db3c Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Mar 2022 09:59:24 +0100 Subject: [PATCH 03/33] fix reconnection event --- packages/stream_chat/lib/src/client/client.dart | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/stream_chat/lib/src/client/client.dart b/packages/stream_chat/lib/src/client/client.dart index a3daa653..76a72c93 100644 --- a/packages/stream_chat/lib/src/client/client.dart +++ b/packages/stream_chat/lib/src/client/client.dart @@ -425,7 +425,8 @@ class StreamChatClient { online: status == ConnectionStatus.connected, )); - if (currentState == ConnectionStatus.connected) { + if (currentState == ConnectionStatus.connected && + previousState != ConnectionStatus.connected) { // connection recovered final cids = state.channels.keys.toList(growable: false); if (cids.isNotEmpty) { @@ -437,12 +438,10 @@ class StreamChatClient { await sync(cids: cids, lastSyncAt: _lastSyncedAt); } } - if (previousState != ConnectionStatus.connected) { - handleEvent(Event( - type: EventType.connectionRecovered, - online: true, - )); - } + handleEvent(Event( + type: EventType.connectionRecovered, + online: true, + )); } } From d387ae260ff398bbd26bc768d270607ee7a89e61 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Mar 2022 11:02:46 +0100 Subject: [PATCH 04/33] update pubspec and changelogs --- packages/stream_chat/CHANGELOG.md | 10 ++++++++++ packages/stream_chat/lib/version.dart | 2 +- packages/stream_chat/pubspec.yaml | 2 +- packages/stream_chat_flutter/CHANGELOG.md | 19 +++++++++++++++++++ .../stream_chat_flutter/example/lib/main.dart | 3 ++- .../example/lib/tutorial_part_1.dart | 3 ++- .../example/lib/tutorial_part_2.dart | 3 ++- .../example/lib/tutorial_part_3.dart | 7 ++++--- .../example/lib/tutorial_part_4.dart | 6 ++++-- .../lib/src/attachment_actions_modal.dart | 3 ++- .../lib/src/localization/translations.dart | 5 +++-- .../lib/src/message_widget.dart | 3 ++- .../src/theme/channel_list_header_theme.dart | 6 ++++-- .../src/theme/channel_list_view_theme.dart | 6 ++++-- .../lib/src/theme/channel_preview_theme.dart | 3 ++- .../lib/src/theme/message_input_theme.dart | 6 ++++-- .../src/theme/message_list_view_theme.dart | 6 ++++-- .../theme/message_search_list_view_theme.dart | 4 ++-- .../stream_channel_list_tile.dart | 9 --------- .../message_input/countdown_button.dart | 0 .../message_input/simple_safe_area.dart | 0 .../stream_attachment_picker.dart | 2 +- .../message_input/stream_message_input.dart} | 7 ++++--- .../stream_message_send_button.dart | 0 .../stream_message_text_field.dart | 0 .../lib/src/{ => v4}/message_input/tld.dart | 0 .../lib/stream_chat_flutter.dart | 11 +++++------ packages/stream_chat_flutter/pubspec.yaml | 2 +- .../stream_chat_flutter_core/CHANGELOG.md | 15 +++++++++++---- .../stream_chat_flutter_core/pubspec.yaml | 4 ++-- .../stream_chat_localizations/CHANGELOG.md | 4 ++++ .../stream_chat_localizations/pubspec.yaml | 4 ++-- packages/stream_chat_persistence/CHANGELOG.md | 4 ++++ packages/stream_chat_persistence/pubspec.yaml | 4 ++-- 34 files changed, 108 insertions(+), 55 deletions(-) rename packages/stream_chat_flutter/lib/src/{ => v4}/message_input/countdown_button.dart (100%) rename packages/stream_chat_flutter/lib/src/{ => v4}/message_input/simple_safe_area.dart (100%) rename packages/stream_chat_flutter/lib/src/{ => v4}/message_input/stream_attachment_picker.dart (99%) rename packages/stream_chat_flutter/lib/src/{message_input/message_input.dart => v4/message_input/stream_message_input.dart} (99%) rename packages/stream_chat_flutter/lib/src/{ => v4}/message_input/stream_message_send_button.dart (100%) rename packages/stream_chat_flutter/lib/src/{ => v4}/message_input/stream_message_text_field.dart (100%) rename packages/stream_chat_flutter/lib/src/{ => v4}/message_input/tld.dart (100%) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index a74b920e..9b048e2a 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,13 @@ +## 4.0.0-beta.0 + +βœ… Added + +- Added support for ownCapabilities. + +🐞 Fixed + +- Minor fixes and improvements. + ## 3.5.1 🐞 Fixed diff --git a/packages/stream_chat/lib/version.dart b/packages/stream_chat/lib/version.dart index 8d0584a0..533df1ce 100644 --- a/packages/stream_chat/lib/version.dart +++ b/packages/stream_chat/lib/version.dart @@ -3,4 +3,4 @@ import 'package:stream_chat/src/client/client.dart'; /// Current package version /// Used in [StreamChatClient] to build the `x-stream-client` header // ignore: constant_identifier_names -const PACKAGE_VERSION = '3.5.1'; +const PACKAGE_VERSION = '4.0.0-beta.0'; diff --git a/packages/stream_chat/pubspec.yaml b/packages/stream_chat/pubspec.yaml index 2e195f6b..bf2c84e6 100644 --- a/packages/stream_chat/pubspec.yaml +++ b/packages/stream_chat/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat homepage: https://getstream.io/ description: The official Dart client for Stream Chat, a service for building chat applications. -version: 3.5.1 +version: 4.0.0-beta.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index fe8d6cd1..d116d50d 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,22 @@ +## 4.0.0-beta.0 + +βœ… Added + +- Deprecated old widgets in favor of Stream-prefixed ones. +- Use channel capabilities to show/hide actions. +- Deprecated `ChannelListView` in favor of `StreamChannelListView`. +- Deprecated `ChannelPreview` in favor of `StreamChannelListTile`. +- Deprecated `ChannelAvatar` in favor of `StreamChannelAvatar`. +- Deprecated `ChannelName` in favor of `StreamChannelName`. +- Deprecated `MessageInput` in favor of `StreamMessageInput`. +- Separated `MessageInput` widget in smaller components. (For example `CountDownButton`, `StreamAttachmentPicker`...) +- Updated `stream_chat_flutter_core` dependency to [`4.0.0-beta.0`](https://pub.dev/packages/stream_chat_flutter_core/changelog). +- Added OpenGraph preview support for links in `StreamMessageInput`. + +🐞 Fixed + +- Minor fixes and improvements + ## 3.5.1 πŸ›‘οΈ Breaking Changes diff --git a/packages/stream_chat_flutter/example/lib/main.dart b/packages/stream_chat_flutter/example/lib/main.dart index 4a7eabf4..7b015689 100644 --- a/packages/stream_chat_flutter/example/lib/main.dart +++ b/packages/stream_chat_flutter/example/lib/main.dart @@ -87,7 +87,8 @@ class MyApp extends StatelessWidget { /// A list of messages sent in the current channel. /// -/// This is implemented using [StreamMessageListView], a widget that provides query +/// This is implemented using [StreamMessageListView], +/// a widget that provides query /// functionalities fetching the messages from the api and showing them in a /// listView. class ChannelPage extends StatelessWidget { diff --git a/packages/stream_chat_flutter/example/lib/tutorial_part_1.dart b/packages/stream_chat_flutter/example/lib/tutorial_part_1.dart index cd3bb12e..2c43230e 100644 --- a/packages/stream_chat_flutter/example/lib/tutorial_part_1.dart +++ b/packages/stream_chat_flutter/example/lib/tutorial_part_1.dart @@ -27,7 +27,8 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; /// - We make [StreamChat] the root Widget of our application /// /// - We create a single [ChannelPage] widget under [StreamChat] with three -/// widgets: [StreamChannelHeader], [StreamMessageListView] and [StreamMessageInput] +/// widgets: [StreamChannelHeader], [StreamMessageListView] +/// and [StreamMessageInput] /// /// If you now run the simulator you will see a single channel UI. void main() async { diff --git a/packages/stream_chat_flutter/example/lib/tutorial_part_2.dart b/packages/stream_chat_flutter/example/lib/tutorial_part_2.dart index 0ca2356e..a46043e3 100644 --- a/packages/stream_chat_flutter/example/lib/tutorial_part_2.dart +++ b/packages/stream_chat_flutter/example/lib/tutorial_part_2.dart @@ -25,7 +25,8 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; /// The [ChannelListPage] widget retrieves the list of channels based on a /// custom query and ordering. In this case we are showing the list of /// channels in which the current user is a member and we order them based -/// on the time they had a new message. [StreamChannelListView] handles pagination +/// on the time they had a new message. +/// [StreamChannelListView] handles pagination /// and updates automatically when new channels are created or when a new /// message is added to a channel. void main() async { diff --git a/packages/stream_chat_flutter/example/lib/tutorial_part_3.dart b/packages/stream_chat_flutter/example/lib/tutorial_part_3.dart index 8eb01fbb..aec63c57 100644 --- a/packages/stream_chat_flutter/example/lib/tutorial_part_3.dart +++ b/packages/stream_chat_flutter/example/lib/tutorial_part_3.dart @@ -15,9 +15,10 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; /// We start by changing how channel previews are shown in the channel list /// and include the number of unread messages for each. /// -/// We're passing a custom widget to [StreamChannelListView.channelPreviewBuilder]; -/// this will override the default [StreamChannelPreview] and allows you to create -/// one yourself. +/// We're passing a custom widget +/// to [StreamChannelListView.channelPreviewBuilder]; +/// this will override the default [StreamChannelPreview] and allows you +/// to create one yourself. /// /// There are a couple interesting things we do in this widget: /// diff --git a/packages/stream_chat_flutter/example/lib/tutorial_part_4.dart b/packages/stream_chat_flutter/example/lib/tutorial_part_4.dart index 89aa55f7..5a4d13fe 100644 --- a/packages/stream_chat_flutter/example/lib/tutorial_part_4.dart +++ b/packages/stream_chat_flutter/example/lib/tutorial_part_4.dart @@ -8,8 +8,10 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; /// to create sub-conversations inside the same channel. /// /// Using threaded conversations is very simple and mostly a matter of -/// plugging the [StreamMessageListView] to another widget that renders the widget. -/// To make this simple, such a widget only needs to build [StreamMessageListView] +/// plugging the [StreamMessageListView] +/// to another widget that renders the widget. +/// To make this simple, such a widget only needs +/// to build [StreamMessageListView] /// with the parent attribute set to the thread’s root message. /// /// Now we can open threads and create new ones as well. If you long-press a diff --git a/packages/stream_chat_flutter/lib/src/attachment_actions_modal.dart b/packages/stream_chat_flutter/lib/src/attachment_actions_modal.dart index 41e6fd11..a1b20450 100644 --- a/packages/stream_chat_flutter/lib/src/attachment_actions_modal.dart +++ b/packages/stream_chat_flutter/lib/src/attachment_actions_modal.dart @@ -58,7 +58,8 @@ class AttachmentActionsModal extends StatelessWidget { /// List of custom actions final List customActions; - /// Creates a copy of [StreamMessageWidget] with specified attributes overridden. + /// Creates a copy of [StreamMessageWidget] with + /// specified attributes overridden. AttachmentActionsModal copyWith({ Key? key, int? currentIndex, diff --git a/packages/stream_chat_flutter/lib/src/localization/translations.dart b/packages/stream_chat_flutter/lib/src/localization/translations.dart index 2a87e76d..83682c6d 100644 --- a/packages/stream_chat_flutter/lib/src/localization/translations.dart +++ b/packages/stream_chat_flutter/lib/src/localization/translations.dart @@ -1,8 +1,8 @@ import 'package:jiffy/jiffy.dart'; import 'package:stream_chat_flutter/src/connection_status_builder.dart'; -import 'package:stream_chat_flutter/src/message_input/message_input.dart'; import 'package:stream_chat_flutter/src/message_list_view.dart'; import 'package:stream_chat_flutter/src/message_search_list_view.dart'; +import 'package:stream_chat_flutter/src/v4/message_input/stream_message_input.dart'; import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart' show User; @@ -87,7 +87,8 @@ abstract class Translations { /// The label for "reconnecting" in [StreamConnectionStatusBuilder] String get reconnectingLabel; - /// The label for also send as direct message "checkbox"" in [StreamMessageInput] + /// The label for also send + /// as direct message "checkbox"" in [StreamMessageInput] String get alsoSendAsDirectMessageLabel; /// The label for search Gif diff --git a/packages/stream_chat_flutter/lib/src/message_widget.dart b/packages/stream_chat_flutter/lib/src/message_widget.dart index 05bff7ba..3108803e 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget.dart @@ -428,7 +428,8 @@ class StreamMessageWidget extends StatefulWidget { /// Customize onTap on attachment final void Function(Message message, Attachment attachment)? onAttachmentTap; - /// Creates a copy of [StreamMessageWidget] with specified attributes overridden. + /// Creates a copy of [StreamMessageWidget] with + /// specified attributes overridden. StreamMessageWidget copyWith({ Key? key, void Function(User)? onMentionTap, diff --git a/packages/stream_chat_flutter/lib/src/theme/channel_list_header_theme.dart b/packages/stream_chat_flutter/lib/src/theme/channel_list_header_theme.dart index 7cff2b90..87ba0127 100644 --- a/packages/stream_chat_flutter/lib/src/theme/channel_list_header_theme.dart +++ b/packages/stream_chat_flutter/lib/src/theme/channel_list_header_theme.dart @@ -12,7 +12,8 @@ typedef ChannelListHeaderTheme = StreamChannelListHeaderTheme; /// /// See also: /// -/// * [StreamChannelListHeaderThemeData], which is used to configure this theme. +/// * [StreamChannelListHeaderThemeData], which is used +/// to configure this theme. /// {@endtemplate} class StreamChannelListHeaderTheme extends InheritedTheme { /// Creates a [StreamChannelListHeaderTheme]. @@ -90,7 +91,8 @@ class StreamChannelListHeaderThemeData with Diagnosticable { color: color ?? this.color, ); - /// Linearly interpolate from one [StreamChannelListHeaderThemeData] to another. + /// Linearly interpolate from one [StreamChannelListHeaderThemeData] + /// to another. StreamChannelListHeaderThemeData lerp( StreamChannelListHeaderThemeData a, StreamChannelListHeaderThemeData b, diff --git a/packages/stream_chat_flutter/lib/src/theme/channel_list_view_theme.dart b/packages/stream_chat_flutter/lib/src/theme/channel_list_view_theme.dart index 4d6bd7d0..d3ed33eb 100644 --- a/packages/stream_chat_flutter/lib/src/theme/channel_list_view_theme.dart +++ b/packages/stream_chat_flutter/lib/src/theme/channel_list_view_theme.dart @@ -58,12 +58,14 @@ typedef ChannelListViewThemeData = StreamChannelListViewThemeData; /// {@template channel_list_view_theme_data} /// A style that overrides the default appearance of [ChannelListView]s when -/// used with [StreamChannelListViewTheme] or with the overall [StreamChatTheme]'s +/// used with [StreamChannelListViewTheme] +/// or with the overall [StreamChatTheme]'s /// [StreamChatThemeData.channelListViewTheme]. /// /// See also: /// -/// * [StreamChannelListViewTheme], the theme which is configured with this class. +/// * [StreamChannelListViewTheme], the theme +/// which is configured with this class. /// * [StreamChatThemeData.channelListViewTheme], which can be used to override /// the default style for [ChannelListView]s below the overall /// [StreamChatTheme]. diff --git a/packages/stream_chat_flutter/lib/src/theme/channel_preview_theme.dart b/packages/stream_chat_flutter/lib/src/theme/channel_preview_theme.dart index 3df974b2..e89ce4a6 100644 --- a/packages/stream_chat_flutter/lib/src/theme/channel_preview_theme.dart +++ b/packages/stream_chat_flutter/lib/src/theme/channel_preview_theme.dart @@ -64,7 +64,8 @@ typedef ChannelPreviewThemeData = StreamChannelPreviewThemeData; /// /// See also: /// -/// * [StreamChannelPreviewTheme], the theme which is configured with this class. +/// * [StreamChannelPreviewTheme], the theme +/// which is configured with this class. /// * [StreamChatThemeData.channelPreviewTheme], which can be used to override /// the default style for [ChannelHeader]s below the overall [StreamChatTheme]. /// {@endtemplate} diff --git a/packages/stream_chat_flutter/lib/src/theme/message_input_theme.dart b/packages/stream_chat_flutter/lib/src/theme/message_input_theme.dart index c3874ef6..bd78bd1b 100644 --- a/packages/stream_chat_flutter/lib/src/theme/message_input_theme.dart +++ b/packages/stream_chat_flutter/lib/src/theme/message_input_theme.dart @@ -61,7 +61,8 @@ typedef MessageInputThemeData = StreamMessageInputThemeData; /// {@template message_input_theme_data} /// A style that overrides the default appearance of [MessageInput] widgets -/// when used with [StreamMessageInputTheme] or with the overall [StreamChatTheme]'s +/// when used with [StreamMessageInputTheme] +/// or with the overall [StreamChatTheme]'s /// [StreamChatThemeData.messageInputTheme]. /// {@endtemplate} class StreamMessageInputThemeData with Diagnosticable { @@ -133,7 +134,8 @@ class StreamMessageInputThemeData with Diagnosticable { /// Shadow for the [MessageInput] widget final BoxShadow? shadow; - /// Returns a new [StreamMessageInputThemeData] replacing some of its properties + /// Returns a new [StreamMessageInputThemeData] + /// replacing some of its properties StreamMessageInputThemeData copyWith({ Duration? sendAnimationDuration, Color? inputBackgroundColor, diff --git a/packages/stream_chat_flutter/lib/src/theme/message_list_view_theme.dart b/packages/stream_chat_flutter/lib/src/theme/message_list_view_theme.dart index 882d4708..e882a9f6 100644 --- a/packages/stream_chat_flutter/lib/src/theme/message_list_view_theme.dart +++ b/packages/stream_chat_flutter/lib/src/theme/message_list_view_theme.dart @@ -58,12 +58,14 @@ typedef MessageListViewThemeData = StreamMessageListViewThemeData; /// {@template message_list_view_theme_data} /// A style that overrides the default appearance of [MessageListView]s when -/// used with [StreamMessageListViewTheme] or with the overall [StreamChatTheme]'s +/// used with [StreamMessageListViewTheme] or with +/// the overall [StreamChatTheme]'s /// [StreamChatThemeData.messageListViewTheme]. /// /// See also: /// -/// * [StreamMessageListViewTheme], the theme which is configured with this class. +/// * [StreamMessageListViewTheme], the theme +/// which is configured with this class. /// * [StreamChatThemeData.messageListViewTheme], which can be used to override /// the default style for [MessageListView]s below the overall /// [StreamChatTheme]. diff --git a/packages/stream_chat_flutter/lib/src/theme/message_search_list_view_theme.dart b/packages/stream_chat_flutter/lib/src/theme/message_search_list_view_theme.dart index 83ef032a..535846ae 100644 --- a/packages/stream_chat_flutter/lib/src/theme/message_search_list_view_theme.dart +++ b/packages/stream_chat_flutter/lib/src/theme/message_search_list_view_theme.dart @@ -63,8 +63,8 @@ typedef MessageSearchListViewThemeData = StreamMessageSearchListViewThemeData; /// /// See also: /// -/// * [StreamMessageSearchListViewTheme], the theme which is configured with this -/// class. +/// * [StreamMessageSearchListViewTheme], the theme +/// which is configured with this class. /// * [StreamChatThemeData.messageSearchListViewTheme], which can be used to /// override the default style for [UserListView]s below the overall /// [StreamChatTheme]. diff --git a/packages/stream_chat_flutter/lib/src/v4/channel_list_view/stream_channel_list_tile.dart b/packages/stream_chat_flutter/lib/src/v4/channel_list_view/stream_channel_list_tile.dart index 16fcc5cc..f54c6db9 100644 --- a/packages/stream_chat_flutter/lib/src/v4/channel_list_view/stream_channel_list_tile.dart +++ b/packages/stream_chat_flutter/lib/src/v4/channel_list_view/stream_channel_list_tile.dart @@ -1,16 +1,7 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; -import 'package:jiffy/jiffy.dart'; import 'package:stream_chat_flutter/src/extension.dart'; -import 'package:stream_chat_flutter/src/sending_indicator.dart'; -import 'package:stream_chat_flutter/src/stream_svg_icon.dart'; -import 'package:stream_chat_flutter/src/theme/channel_preview_theme.dart'; -import 'package:stream_chat_flutter/src/typing_indicator.dart'; -import 'package:stream_chat_flutter/src/unread_indicator.dart'; -import 'package:stream_chat_flutter/src/v4/stream_channel_avatar.dart'; -import 'package:stream_chat_flutter/src/v4/stream_channel_name.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; -import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; /// A widget that displays a channel preview. /// diff --git a/packages/stream_chat_flutter/lib/src/message_input/countdown_button.dart b/packages/stream_chat_flutter/lib/src/v4/message_input/countdown_button.dart similarity index 100% rename from packages/stream_chat_flutter/lib/src/message_input/countdown_button.dart rename to packages/stream_chat_flutter/lib/src/v4/message_input/countdown_button.dart diff --git a/packages/stream_chat_flutter/lib/src/message_input/simple_safe_area.dart b/packages/stream_chat_flutter/lib/src/v4/message_input/simple_safe_area.dart similarity index 100% rename from packages/stream_chat_flutter/lib/src/message_input/simple_safe_area.dart rename to packages/stream_chat_flutter/lib/src/v4/message_input/simple_safe_area.dart diff --git a/packages/stream_chat_flutter/lib/src/message_input/stream_attachment_picker.dart b/packages/stream_chat_flutter/lib/src/v4/message_input/stream_attachment_picker.dart similarity index 99% rename from packages/stream_chat_flutter/lib/src/message_input/stream_attachment_picker.dart rename to packages/stream_chat_flutter/lib/src/v4/message_input/stream_attachment_picker.dart index 8389d3c7..cb3859be 100644 --- a/packages/stream_chat_flutter/lib/src/message_input/stream_attachment_picker.dart +++ b/packages/stream_chat_flutter/lib/src/v4/message_input/stream_attachment_picker.dart @@ -352,7 +352,7 @@ class _StreamAttachmentPickerState extends State { if (mediaFile == null) return; - var file = AttachmentFile( + final file = AttachmentFile( path: mediaFile.path, size: await mediaFile.length(), bytes: mediaFile.readAsBytesSync(), diff --git a/packages/stream_chat_flutter/lib/src/message_input/message_input.dart b/packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_input.dart similarity index 99% rename from packages/stream_chat_flutter/lib/src/message_input/message_input.dart rename to packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_input.dart index 0ffa472c..085b021a 100644 --- a/packages/stream_chat_flutter/lib/src/message_input/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_input.dart @@ -13,11 +13,11 @@ import 'package:stream_chat_flutter/src/commands_overlay.dart'; import 'package:stream_chat_flutter/src/emoji/emoji.dart'; import 'package:stream_chat_flutter/src/emoji_overlay.dart'; import 'package:stream_chat_flutter/src/extension.dart'; -import 'package:stream_chat_flutter/src/message_input/simple_safe_area.dart'; -import 'package:stream_chat_flutter/src/message_input/tld.dart'; import 'package:stream_chat_flutter/src/multi_overlay.dart'; import 'package:stream_chat_flutter/src/quoted_message_widget.dart'; import 'package:stream_chat_flutter/src/user_mentions_overlay.dart'; +import 'package:stream_chat_flutter/src/v4/message_input/simple_safe_area.dart'; +import 'package:stream_chat_flutter/src/v4/message_input/tld.dart'; import 'package:stream_chat_flutter/src/video_thumbnail_image.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; @@ -34,7 +34,8 @@ typedef ErrorListener = void Function( StackTrace? stackTrace, ); -/// A callback that can be passed to [StreamMessageInput.onAttachmentLimitExceed]. +/// A callback that can be passed to +/// [StreamMessageInput.onAttachmentLimitExceed]. /// /// This callback should not throw. /// diff --git a/packages/stream_chat_flutter/lib/src/message_input/stream_message_send_button.dart b/packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_send_button.dart similarity index 100% rename from packages/stream_chat_flutter/lib/src/message_input/stream_message_send_button.dart rename to packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_send_button.dart diff --git a/packages/stream_chat_flutter/lib/src/message_input/stream_message_text_field.dart b/packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_text_field.dart similarity index 100% rename from packages/stream_chat_flutter/lib/src/message_input/stream_message_text_field.dart rename to packages/stream_chat_flutter/lib/src/v4/message_input/stream_message_text_field.dart diff --git a/packages/stream_chat_flutter/lib/src/message_input/tld.dart b/packages/stream_chat_flutter/lib/src/v4/message_input/tld.dart similarity index 100% rename from packages/stream_chat_flutter/lib/src/message_input/tld.dart rename to packages/stream_chat_flutter/lib/src/v4/message_input/tld.dart diff --git a/packages/stream_chat_flutter/lib/stream_chat_flutter.dart b/packages/stream_chat_flutter/lib/stream_chat_flutter.dart index e63db686..4b129d1f 100644 --- a/packages/stream_chat_flutter/lib/stream_chat_flutter.dart +++ b/packages/stream_chat_flutter/lib/stream_chat_flutter.dart @@ -23,11 +23,6 @@ export 'src/localization/stream_chat_localizations.dart'; export 'src/localization/translations.dart' show DefaultTranslations; export 'src/message_action.dart'; export 'src/message_input.dart' show MessageInput, MessageInputState; -export 'src/message_input/countdown_button.dart'; -export 'src/message_input/message_input.dart'; -export 'src/message_input/stream_attachment_picker.dart'; -export 'src/message_input/stream_message_send_button.dart'; -export 'src/message_input/stream_message_text_field.dart'; export 'src/message_list_view.dart'; export 'src/message_search_item.dart'; export 'src/message_search_list_view.dart'; @@ -51,11 +46,15 @@ export 'src/user_item.dart'; export 'src/user_list_view.dart'; export 'src/user_mention_tile.dart'; export 'src/utils.dart'; - // v4 export 'src/v4/channel_list_view/stream_channel_list_loading_tile.dart'; export 'src/v4/channel_list_view/stream_channel_list_tile.dart'; export 'src/v4/channel_list_view/stream_channel_list_view.dart'; +export 'src/v4/message_input/countdown_button.dart'; +export 'src/v4/message_input/stream_attachment_picker.dart'; +export 'src/v4/message_input/stream_message_input.dart'; +export 'src/v4/message_input/stream_message_send_button.dart'; +export 'src/v4/message_input/stream_message_text_field.dart'; export 'src/v4/stream_channel_avatar.dart'; export 'src/v4/stream_channel_info_bottom_sheet.dart'; export 'src/v4/stream_channel_name.dart'; diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 7305d74b..8fc47ac2 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 3.5.1 +version: 4.0.0-beta.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues diff --git a/packages/stream_chat_flutter_core/CHANGELOG.md b/packages/stream_chat_flutter_core/CHANGELOG.md index ab1e2504..1fb6c164 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,14 @@ +## 4.0.0-beta.0 + +βœ… Added + +- Added `MessageInputController` to hold `Message` related data. +- Deprecated old widgets in favor of Stream-prefixed ones. +- Deprecated `ChannelsBloc` in favor of `StreamChannelListController` to control the channel list. +- Added `MessageTextFieldController` to be used with the new `StreamTextField` ui widget. + +- Updated `stream_chat` dependency to [`4.0.0-beta.0`](https://pub.dev/packages/stream_chat/changelog). + ## 3.5.1 - Updated `stream_chat` dependency to [`3.5.1`](https://pub.dev/packages/stream_chat/changelog). @@ -9,10 +20,6 @@ ## 3.4.0 - Updated `stream_chat` dependency to [`3.4.0`](https://pub.dev/packages/stream_chat/changelog). -βœ… Added - -- Added `MessageInputController` to hold `Message` related data. - 🐞 Fixed - Do not move a channel to top if the new message is from a thread. diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index 09ce3733..4e5e39b7 100644 --- a/packages/stream_chat_flutter_core/pubspec.yaml +++ b/packages/stream_chat_flutter_core/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter_core homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK Core. Build your own chat experience using Dart and Flutter. -version: 3.5.1 +version: 4.0.0-beta.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -17,7 +17,7 @@ dependencies: freezed_annotation: ^1.0.0 meta: ^1.3.0 rxdart: ^0.27.0 - stream_chat: ^3.5.1 + stream_chat: ^4.0.0-beta.0 dev_dependencies: build_runner: ^2.0.1 diff --git a/packages/stream_chat_localizations/CHANGELOG.md b/packages/stream_chat_localizations/CHANGELOG.md index 94dc71c3..1e4f4c35 100644 --- a/packages/stream_chat_localizations/CHANGELOG.md +++ b/packages/stream_chat_localizations/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.0-beta.0 + +* Updated `stream_chat_flutter` dependency to [`4.0.0-beta.0`](https://pub.dev/packages/stream_chat_flutter/changelog). + ## 2.1.0 βœ… Added diff --git a/packages/stream_chat_localizations/pubspec.yaml b/packages/stream_chat_localizations/pubspec.yaml index 00606a7b..02bc1075 100644 --- a/packages/stream_chat_localizations/pubspec.yaml +++ b/packages/stream_chat_localizations/pubspec.yaml @@ -1,6 +1,6 @@ name: stream_chat_localizations description: The Official localizations for Stream Chat Flutter, a service for building chat applications -version: 2.1.0 +version: 3.0.0-beta.0 homepage: https://github.com/GetStream/stream-chat-flutter repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -14,7 +14,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - stream_chat_flutter: ^3.4.0 + stream_chat_flutter: ^4.0.0-beta.0 dev_dependencies: dart_code_metrics: ^4.4.0 diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index ea67fa88..5e80bd62 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.0.0-beta.0 + +- Updated `stream_chat` dependency to [`4.0.0-beta.0`](https://pub.dev/packages/stream_chat/changelog). + ## 3.1.0 - Bump `drift` to `1.3.0`. diff --git a/packages/stream_chat_persistence/pubspec.yaml b/packages/stream_chat_persistence/pubspec.yaml index 06167a11..0d28870e 100644 --- a/packages/stream_chat_persistence/pubspec.yaml +++ b/packages/stream_chat_persistence/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_persistence homepage: https://github.com/GetStream/stream-chat-flutter description: Official Stream Chat Persistence library. Build your own chat experience using Dart and Flutter. -version: 3.1.0 +version: 4.0.0-beta.0 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -19,7 +19,7 @@ dependencies: path: ^1.8.0 path_provider: ^2.0.1 sqlite3_flutter_libs: ^0.5.0 - stream_chat: ^3.4.0 + stream_chat: ^4.0.0-beta.0 dev_dependencies: build_runner: ^2.0.1 From 9eefb74600075eadaf9b0cfac951eda37fb861d3 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Mar 2022 11:34:44 +0100 Subject: [PATCH 05/33] remove log --- .../lib/src/stream_channel_list_controller.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart index 3b7342e5..b7ca36c9 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart @@ -221,7 +221,6 @@ class StreamChannelListController extends PagedValueNotifier { } _channelEventSubscription = client.on().listen((event) { - print('event.type: ${event.type}'); // Returns early if the event is already handled by the listener. if (eventListener?.call(event) ?? false) return; From 0a4eb0a1711ba3f5f71f98ac752776b4343a94c7 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 23 Mar 2022 16:25:51 +0530 Subject: [PATCH 06/33] feat(ui): only handle the latest events in channelEventSubscription Signed-off-by: xsahil03x --- .../lib/src/stream_channel_list_controller.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart index 3b7342e5..7fa3b226 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart @@ -220,8 +220,8 @@ class StreamChannelListController extends PagedValueNotifier { _unsubscribeFromChannelListEvents(); } - _channelEventSubscription = client.on().listen((event) { - print('event.type: ${event.type}'); + _channelEventSubscription = client.on().skip(1) // skip the initial event + .listen((event) { // Returns early if the event is already handled by the listener. if (eventListener?.call(event) ?? false) return; From 67dad76e46d90cd23d761cfb997ea2fc01b83fea Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 23 Mar 2022 16:33:20 +0530 Subject: [PATCH 07/33] feat(ui): improve the message for skipping the event. Signed-off-by: xsahil03x --- .../lib/src/stream_channel_list_controller.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart index 7fa3b226..9fe5594c 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_controller.dart @@ -220,8 +220,10 @@ class StreamChannelListController extends PagedValueNotifier { _unsubscribeFromChannelListEvents(); } - _channelEventSubscription = client.on().skip(1) // skip the initial event - .listen((event) { + _channelEventSubscription = + client.on().skip(1) // Skipping the last emitted event. + // We only need to handle the latest events. + .listen((event) { // Returns early if the event is already handled by the listener. if (eventListener?.call(event) ?? false) return; From 363c95148e6a402733a0e5e84f8636d251383fa4 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Mar 2022 14:25:51 +0100 Subject: [PATCH 08/33] update changelog --- packages/stream_chat_flutter/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index d116d50d..f26f3fcb 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -12,6 +12,7 @@ - Separated `MessageInput` widget in smaller components. (For example `CountDownButton`, `StreamAttachmentPicker`...) - Updated `stream_chat_flutter_core` dependency to [`4.0.0-beta.0`](https://pub.dev/packages/stream_chat_flutter_core/changelog). - Added OpenGraph preview support for links in `StreamMessageInput`. +- Removed video compression. 🐞 Fixed From a0f353373e76c7118904bc65375b2f74f47deb26 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Mar 2022 14:47:57 +0100 Subject: [PATCH 09/33] fix format --- packages/stream_chat_flutter/example/lib/main.dart | 2 +- packages/stream_chat_flutter/example/lib/tutorial_part_1.dart | 2 +- packages/stream_chat_flutter/example/lib/tutorial_part_2.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/stream_chat_flutter/example/lib/main.dart b/packages/stream_chat_flutter/example/lib/main.dart index 7b015689..ab8d0dfc 100644 --- a/packages/stream_chat_flutter/example/lib/main.dart +++ b/packages/stream_chat_flutter/example/lib/main.dart @@ -87,7 +87,7 @@ class MyApp extends StatelessWidget { /// A list of messages sent in the current channel. /// -/// This is implemented using [StreamMessageListView], +/// This is implemented using [StreamMessageListView], /// a widget that provides query /// functionalities fetching the messages from the api and showing them in a /// listView. diff --git a/packages/stream_chat_flutter/example/lib/tutorial_part_1.dart b/packages/stream_chat_flutter/example/lib/tutorial_part_1.dart index 2c43230e..7c73693e 100644 --- a/packages/stream_chat_flutter/example/lib/tutorial_part_1.dart +++ b/packages/stream_chat_flutter/example/lib/tutorial_part_1.dart @@ -27,7 +27,7 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; /// - We make [StreamChat] the root Widget of our application /// /// - We create a single [ChannelPage] widget under [StreamChat] with three -/// widgets: [StreamChannelHeader], [StreamMessageListView] +/// widgets: [StreamChannelHeader], [StreamMessageListView] /// and [StreamMessageInput] /// /// If you now run the simulator you will see a single channel UI. diff --git a/packages/stream_chat_flutter/example/lib/tutorial_part_2.dart b/packages/stream_chat_flutter/example/lib/tutorial_part_2.dart index a46043e3..8f2ba8b1 100644 --- a/packages/stream_chat_flutter/example/lib/tutorial_part_2.dart +++ b/packages/stream_chat_flutter/example/lib/tutorial_part_2.dart @@ -25,7 +25,7 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; /// The [ChannelListPage] widget retrieves the list of channels based on a /// custom query and ordering. In this case we are showing the list of /// channels in which the current user is a member and we order them based -/// on the time they had a new message. +/// on the time they had a new message. /// [StreamChannelListView] handles pagination /// and updates automatically when new channels are created or when a new /// message is added to a channel. From 21a8110bd28df3a769351ce735025b2411db06d1 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Mar 2022 16:36:03 +0100 Subject: [PATCH 10/33] fix format --- .../lib/src/v4/stream_channel_info_bottom_sheet.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/v4/stream_channel_info_bottom_sheet.dart b/packages/stream_chat_flutter/lib/src/v4/stream_channel_info_bottom_sheet.dart index 1a219e91..986a9cb3 100644 --- a/packages/stream_chat_flutter/lib/src/v4/stream_channel_info_bottom_sheet.dart +++ b/packages/stream_chat_flutter/lib/src/v4/stream_channel_info_bottom_sheet.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_flutter/src/channel_info.dart'; import 'package:stream_chat_flutter/src/extension.dart'; import 'package:stream_chat_flutter/src/option_list_tile.dart'; @@ -8,6 +7,7 @@ import 'package:stream_chat_flutter/src/stream_svg_icon.dart'; import 'package:stream_chat_flutter/src/theme/themes.dart'; import 'package:stream_chat_flutter/src/user_avatar.dart'; import 'package:stream_chat_flutter/src/v4/stream_channel_name.dart'; +import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; /// A [BottomSheet] that shows information about a [Channel]. class StreamChannelInfoBottomSheet extends StatelessWidget { From a8e04e84282489791ef05e60e22db8030ce8a14a Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Mar 2022 16:49:16 +0100 Subject: [PATCH 11/33] fix imports --- packages/stream_chat_flutter/CHANGELOG.md | 2 +- packages/stream_chat_flutter/pubspec.yaml | 4 ++-- packages/stream_chat_localizations/CHANGELOG.md | 4 ++-- packages/stream_chat_localizations/pubspec.yaml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index f26f3fcb..c26bfa2d 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,4 +1,4 @@ -## 4.0.0-beta.0 +## 4.0.0-beta.1 βœ… Added diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index 8fc47ac2..87246386 100644 --- a/packages/stream_chat_flutter/pubspec.yaml +++ b/packages/stream_chat_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 4.0.0-beta.0 +version: 4.0.0-beta.1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -36,7 +36,7 @@ dependencies: rxdart: ^0.27.0 share_plus: ^4.0.1 shimmer: ^2.0.0 - stream_chat_flutter_core: ^3.5.1 + stream_chat_flutter_core: ^4.0.0-beta.0 substring_highlight: ^1.0.26 url_launcher: ^6.0.3 video_player: ^2.1.0 diff --git a/packages/stream_chat_localizations/CHANGELOG.md b/packages/stream_chat_localizations/CHANGELOG.md index 1e4f4c35..2a8addab 100644 --- a/packages/stream_chat_localizations/CHANGELOG.md +++ b/packages/stream_chat_localizations/CHANGELOG.md @@ -1,6 +1,6 @@ -## 3.0.0-beta.0 +## 3.0.0-beta.1 -* Updated `stream_chat_flutter` dependency to [`4.0.0-beta.0`](https://pub.dev/packages/stream_chat_flutter/changelog). +* Updated `stream_chat_flutter` dependency to [`4.0.0-beta.1`](https://pub.dev/packages/stream_chat_flutter/changelog). ## 2.1.0 diff --git a/packages/stream_chat_localizations/pubspec.yaml b/packages/stream_chat_localizations/pubspec.yaml index 02bc1075..a47eabbb 100644 --- a/packages/stream_chat_localizations/pubspec.yaml +++ b/packages/stream_chat_localizations/pubspec.yaml @@ -1,6 +1,6 @@ name: stream_chat_localizations description: The Official localizations for Stream Chat Flutter, a service for building chat applications -version: 3.0.0-beta.0 +version: 3.0.0-beta.1 homepage: https://github.com/GetStream/stream-chat-flutter repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -14,7 +14,7 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - stream_chat_flutter: ^4.0.0-beta.0 + stream_chat_flutter: ^4.0.0-beta.1 dev_dependencies: dart_code_metrics: ^4.4.0 From b0fc4377198cacce836786de7b0f2d8d8699c3c0 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 24 Mar 2022 11:09:37 +0100 Subject: [PATCH 12/33] feat(llc): handle event.message in channel.truncate events --- packages/stream_chat/lib/src/client/channel.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index f2effe04..25aaa249 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1612,6 +1612,9 @@ class ChannelClientState { await _channel._client.chatPersistenceClient ?.deleteMessageByCid(channel.cid); truncate(); + if (event.message != null) { + updateMessage(event.message!); + } })); } From 058e2b42ccfbfcbe5860ea9aaf38450aab14a93d Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 24 Mar 2022 11:10:32 +0100 Subject: [PATCH 13/33] chore(llc): update changelog --- 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 a74b920e..e054c420 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,9 @@ +## Upcoming + +βœ… Added + +- Handle `event.message` in `channel.truncate` events + ## 3.5.1 🐞 Fixed From b11a812721d6d0e8508afd2ed8a32a3f32c5099b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 24 Mar 2022 11:42:46 +0100 Subject: [PATCH 14/33] fix(ui): fix initial alignment in message list view --- packages/stream_chat_flutter/lib/src/message_list_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat_flutter/lib/src/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view.dart index c6e269b9..9f670f15 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -369,7 +369,7 @@ class _MessageListViewState extends State { double get _initialAlignment { final initialAlignment = widget.initialAlignment; if (initialAlignment != null) return initialAlignment; - return 0.1; + return streamChannel!.initialMessageId == null ? 0 : 0.1; } bool _isInitialMessage(String id) => streamChannel!.initialMessageId == id; From 338b8422fdcda57194c03c3ddc8ce19bf86e802c Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 24 Mar 2022 11:44:46 +0100 Subject: [PATCH 15/33] chore(ui): update changelog --- packages/stream_chat_flutter/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 78a52f64..b8cd20ff 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -1,3 +1,9 @@ +## Upcoming + +🐞 Fixed + +-[[#892]](https://github.com/GetStream/stream-chat-flutter/issues/892): Fix default `initialAlignment` in `MessageListView`. + ## 3.5.1 🐞 Fixed From e4c6d8ccda3a5de4dcdf0b53ca48771ffa4fd146 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 24 Mar 2022 20:46:05 +0530 Subject: [PATCH 16/33] fix(llc): also save reactions while saving threads data in persistence Signed-off-by: xsahil03x --- .../stream_chat/lib/src/client/channel.dart | 8 ++-- .../lib/src/db/chat_persistence_client.dart | 38 +++++++++++++------ 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 25aaa249..b2887168 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -2122,12 +2122,12 @@ class ChannelClientState { final BehaviorSubject>> _threadsController = BehaviorSubject.seeded({}); - set _threads(Map> v) { - _channel.client.chatPersistenceClient?.updateMessages( + set _threads(Map> threads) { + _threadsController.add(threads); + _channel.client.chatPersistenceClient?.updateChannelThreads( _channel.cid!, - v.values.expand((v) => v).toList(), + threads, ); - _threadsController.add(v); } /// Channel related typing users last value. diff --git a/packages/stream_chat/lib/src/db/chat_persistence_client.dart b/packages/stream_chat/lib/src/db/chat_persistence_client.dart index 82ba181a..4e10dae3 100644 --- a/packages/stream_chat/lib/src/db/chat_persistence_client.dart +++ b/packages/stream_chat/lib/src/db/chat_persistence_client.dart @@ -197,6 +197,22 @@ abstract class ChatPersistenceClient { /// Deletes all the members by channel [cids] Future deleteMembersByCids(List cids); + /// Updates the channel [cid] threads data along with reactions and users. + Future updateChannelThreads( + String cid, + Map> threads, + ) async { + final messages = threads.values.expand((it) => it).toList(); + final reactions = messages.expand(_expandReactions).toList(); + final users = messages.map((it) => it.user).withNullifyer.toList(); + + await Future.wait([ + updateMessages(cid, messages), + updateReactions(reactions), + updateUsers(users), + ]); + } + /// Update the channel state data using [channelState] Future updateChannelState(ChannelState channelState) => updateChannelStates([channelState]); @@ -239,17 +255,8 @@ abstract class ChatPersistenceClient { channelWithMessages[cid] = messages; channelWithPinnedMessages[cid] = pinnedMessages; - List expandReactions(Message message) { - final own = message.ownReactions; - final latest = message.latestReactions; - return [ - if (own != null) ...own.where((r) => r.userId != null), - if (latest != null) ...latest.where((r) => r.userId != null), - ]; - } - - reactions.addAll(messages.expand(expandReactions)); - pinnedReactions.addAll(pinnedMessages.expand(expandReactions)); + reactions.addAll(messages.expand(_expandReactions)); + pinnedReactions.addAll(pinnedMessages.expand(_expandReactions)); users.addAll([ channel.createdBy, @@ -292,4 +299,13 @@ abstract class ChatPersistenceClient { ), ]); } + + List _expandReactions(Message message) { + final own = message.ownReactions; + final latest = message.latestReactions; + return [ + if (own != null) ...own.where((r) => r.userId != null), + if (latest != null) ...latest.where((r) => r.userId != null), + ]; + } } From d924c18a69e3367d30fc7c0c187ae11c5dbdc095 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 24 Mar 2022 20:47:09 +0530 Subject: [PATCH 17/33] chore(llc): update CHANGELOG.md Signed-off-by: xsahil03x --- packages/stream_chat/CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index e054c420..de19b33f 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,5 +1,9 @@ ## Upcoming +🐞 Fixed + +- Fixed reactions not working for threads in offline mode. + βœ… Added - Handle `event.message` in `channel.truncate` events @@ -7,6 +11,7 @@ ## 3.5.1 🐞 Fixed + - `channel.unreadCount` was being set as using global unread count on a very specific case. - The reconnection logic for the WebSocket connection is now more robust. @@ -22,7 +27,7 @@ - [[#890]](https://github.com/GetStream/stream-chat-flutter/pull/890) Fixed Reactions not updating on thread messages. Thanks [bstolinski](https://github.com/bstolinski). - [[#897]](https://github.com/GetStream/stream-chat-flutter/issues/897) Fixed error type mis-match in `AuthInterceptor`. -- [[#891]](https://github.com/GetStream/stream-chat-flutter/pull/891) Fixed reply counter for parent message not +- [[#891]](https://github.com/GetStream/stream-chat-flutter/pull/891) Fixed reply counter for parent message not updating correctly after deleting thread message. - Fix `channelState.copyWith` with respect to pinnedMessages. From dc007653d498c62864ca1e003ee1133fc3147b30 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 24 Mar 2022 22:55:38 +0530 Subject: [PATCH 18/33] test(llc): fix queryChannels test Signed-off-by: xsahil03x --- .../stream_chat/test/src/client/client_test.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/stream_chat/test/src/client/client_test.dart b/packages/stream_chat/test/src/client/client_test.dart index b59937bb..5ec2bfeb 100644 --- a/packages/stream_chat/test/src/client/client_test.dart +++ b/packages/stream_chat/test/src/client/client_test.dart @@ -645,8 +645,8 @@ void main() { when(() => persistence.getChannelThreads(any())) .thenAnswer((_) async => {}); - when(() => persistence.updateMessages(any(), any())) - .thenAnswer((_) => Future.value()); + when(() => persistence.updateChannelThreads(any(), any())) + .thenAnswer((_) async => {}); when(() => persistence.getChannelStateByCid(any(), messagePagination: any(named: 'messagePagination'), pinnedMessagePagination: @@ -692,7 +692,7 @@ void main() { verify(() => persistence.getChannelThreads(any())) .called((persistentChannelStates + channelStates).length); - verify(() => persistence.updateMessages(any(), any())) + verify(() => persistence.updateChannelThreads(any(), any())) .called((persistentChannelStates + channelStates).length); verify( () => persistence.getChannelStateByCid(any(), @@ -733,8 +733,8 @@ void main() { when(() => persistence.getChannelThreads(any())) .thenAnswer((_) async => {}); - when(() => persistence.updateMessages(any(), any())) - .thenAnswer((_) => Future.value()); + when(() => persistence.updateChannelThreads(any(), any())) + .thenAnswer((_) async => {}); when(() => persistence.getChannelStateByCid(any(), messagePagination: any(named: 'messagePagination'), pinnedMessagePagination: @@ -775,7 +775,7 @@ void main() { verify(() => persistence.getChannelThreads(any())) .called(persistentChannelStates.length); - verify(() => persistence.updateMessages(any(), any())) + verify(() => persistence.updateChannelThreads(any(), any())) .called(persistentChannelStates.length); verify( () => persistence.getChannelStateByCid(any(), From 181a2b7f637b6db8c06afb6081c068a0381bb397 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 25 Mar 2022 15:31:40 +0530 Subject: [PATCH 19/33] fix(llc): Remove old thread reactions before saving new Signed-off-by: xsahil03x --- .../stream_chat/lib/src/db/chat_persistence_client.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/stream_chat/lib/src/db/chat_persistence_client.dart b/packages/stream_chat/lib/src/db/chat_persistence_client.dart index 4e10dae3..2dfb7cd7 100644 --- a/packages/stream_chat/lib/src/db/chat_persistence_client.dart +++ b/packages/stream_chat/lib/src/db/chat_persistence_client.dart @@ -203,6 +203,12 @@ abstract class ChatPersistenceClient { Map> threads, ) async { final messages = threads.values.expand((it) => it).toList(); + + // Removing old reactions before saving the new + final oldReactions = messages.map((it) => it.id).toList(); + await deleteReactionsByMessageId(oldReactions); + + // Adding new reactions and users data final reactions = messages.expand(_expandReactions).toList(); final users = messages.map((it) => it.user).withNullifyer.toList(); From 604546db382128f8a4a562523333eb69fb5742b4 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 25 Mar 2022 15:39:28 +0530 Subject: [PATCH 20/33] test(llc): add persistence update thread test Signed-off-by: xsahil03x --- .../src/db/chat_persistence_client_test.dart | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/stream_chat/test/src/db/chat_persistence_client_test.dart b/packages/stream_chat/test/src/db/chat_persistence_client_test.dart index 897bbcb0..7c49cc7d 100644 --- a/packages/stream_chat/test/src/db/chat_persistence_client_test.dart +++ b/packages/stream_chat/test/src/db/chat_persistence_client_test.dart @@ -162,6 +162,23 @@ void main() { expect(channelState, isNotNull); }); + test('updateChannelThreads', () async { + const cid = 'test:cid'; + final user = User(id: 'test-user-id'); + final threads = { + 'parent-test-message': [ + Message( + id: 'test-message', + text: 'test-message', + user: user, + ownReactions: [Reaction(type: 'test', user: user)], + latestReactions: [Reaction(type: 'test', user: user)], + ) + ] + }; + persistenceClient.updateChannelThreads(cid, threads); + }); + test('updateChannelState', () async { final channelState = ChannelState(); persistenceClient.updateChannelState(channelState); From 679faffbaf219b7e22e357e7ce56bd6ab898783c Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 30 Mar 2022 20:43:21 +0530 Subject: [PATCH 21/33] fix(llc): segregate mute from channel mutes Signed-off-by: xsahil03x --- .../lib/src/core/models/channel_mute.dart | 37 +++++++++++++++++++ .../lib/src/core/models/channel_mute.g.dart | 17 +++++++++ .../stream_chat/lib/src/core/models/mute.dart | 14 +++---- .../lib/src/core/models/mute.g.dart | 5 ++- .../lib/src/core/models/own_user.dart | 5 ++- .../lib/src/core/models/own_user.g.dart | 2 +- .../fixtures/{mute.json => channel_mute.json} | 0 ...{mute_test.dart => channel_mute_test.dart} | 6 +-- .../test/src/core/models/own_user_test.dart | 5 ++- 9 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 packages/stream_chat/lib/src/core/models/channel_mute.dart create mode 100644 packages/stream_chat/lib/src/core/models/channel_mute.g.dart rename packages/stream_chat/test/fixtures/{mute.json => channel_mute.json} (100%) rename packages/stream_chat/test/src/core/models/{mute_test.dart => channel_mute_test.dart} (70%) diff --git a/packages/stream_chat/lib/src/core/models/channel_mute.dart b/packages/stream_chat/lib/src/core/models/channel_mute.dart new file mode 100644 index 00000000..67410afc --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/channel_mute.dart @@ -0,0 +1,37 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:stream_chat/src/core/models/channel_model.dart'; +import 'package:stream_chat/src/core/models/user.dart'; + +part 'channel_mute.g.dart'; + +/// The class that contains the information about a muted user +@JsonSerializable(createToJson: false) +class ChannelMute { + /// Constructor used for json serialization + ChannelMute({ + required this.user, + required this.channel, + required this.createdAt, + required this.updatedAt, + this.expires, + }); + + /// Create a new instance from a json + factory ChannelMute.fromJson(Map json) => + _$ChannelMuteFromJson(json); + + /// The user that performed the muting action + final User user; + + /// The target user + final ChannelModel channel; + + /// The date in which the use was muted + final DateTime createdAt; + + /// The date of the last update + final DateTime updatedAt; + + /// The date in which the mute expires + final DateTime? expires; +} diff --git a/packages/stream_chat/lib/src/core/models/channel_mute.g.dart b/packages/stream_chat/lib/src/core/models/channel_mute.g.dart new file mode 100644 index 00000000..9b6d00c1 --- /dev/null +++ b/packages/stream_chat/lib/src/core/models/channel_mute.g.dart @@ -0,0 +1,17 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'channel_mute.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ChannelMute _$ChannelMuteFromJson(Map json) => ChannelMute( + user: User.fromJson(json['user'] as Map), + channel: ChannelModel.fromJson(json['channel'] as Map), + createdAt: DateTime.parse(json['created_at'] as String), + updatedAt: DateTime.parse(json['updated_at'] as String), + expires: json['expires'] == null + ? null + : DateTime.parse(json['expires'] as String), + ); diff --git a/packages/stream_chat/lib/src/core/models/mute.dart b/packages/stream_chat/lib/src/core/models/mute.dart index 857b34a1..02c91784 100644 --- a/packages/stream_chat/lib/src/core/models/mute.dart +++ b/packages/stream_chat/lib/src/core/models/mute.dart @@ -1,7 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:stream_chat/src/core/models/channel_model.dart'; import 'package:stream_chat/src/core/models/user.dart'; -import 'package:stream_chat/src/core/util/serializer.dart'; part 'mute.g.dart'; @@ -11,27 +9,27 @@ class Mute { /// Constructor used for json serialization Mute({ required this.user, - required this.channel, + required this.target, required this.createdAt, required this.updatedAt, + this.expires, }); /// Create a new instance from a json factory Mute.fromJson(Map json) => _$MuteFromJson(json); /// The user that performed the muting action - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) final User user; /// The target user - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) - final ChannelModel channel; + final User target; /// The date in which the use was muted - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) final DateTime createdAt; /// The date of the last update - @JsonKey(includeIfNull: false, toJson: Serializer.readOnly) final DateTime updatedAt; + + /// The date in which the mute expires + final DateTime? expires; } diff --git a/packages/stream_chat/lib/src/core/models/mute.g.dart b/packages/stream_chat/lib/src/core/models/mute.g.dart index f57fd312..a0d908a8 100644 --- a/packages/stream_chat/lib/src/core/models/mute.g.dart +++ b/packages/stream_chat/lib/src/core/models/mute.g.dart @@ -8,7 +8,10 @@ part of 'mute.dart'; Mute _$MuteFromJson(Map json) => Mute( user: User.fromJson(json['user'] as Map), - channel: ChannelModel.fromJson(json['channel'] as Map), + target: User.fromJson(json['target'] as Map), createdAt: DateTime.parse(json['created_at'] as String), updatedAt: DateTime.parse(json['updated_at'] as String), + expires: json['expires'] == null + ? null + : DateTime.parse(json['expires'] as String), ); diff --git a/packages/stream_chat/lib/src/core/models/own_user.dart b/packages/stream_chat/lib/src/core/models/own_user.dart index 5246f48e..6133dd76 100644 --- a/packages/stream_chat/lib/src/core/models/own_user.dart +++ b/packages/stream_chat/lib/src/core/models/own_user.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:stream_chat/src/core/models/channel_mute.dart'; import 'package:stream_chat/src/core/util/serializer.dart'; import 'package:stream_chat/stream_chat.dart'; @@ -79,7 +80,7 @@ class OwnUser extends User { bool? banned, DateTime? banExpires, List? teams, - List? channelMutes, + List? channelMutes, List? devices, List? mutes, int? totalUnreadCount, @@ -142,7 +143,7 @@ class OwnUser extends User { /// List of channels muted by the user. @JsonKey(includeIfNull: false) - final List channelMutes; + final List channelMutes; /// Total unread messages by the user. @JsonKey(includeIfNull: false) diff --git a/packages/stream_chat/lib/src/core/models/own_user.g.dart b/packages/stream_chat/lib/src/core/models/own_user.g.dart index be8f2d45..6cae18ee 100644 --- a/packages/stream_chat/lib/src/core/models/own_user.g.dart +++ b/packages/stream_chat/lib/src/core/models/own_user.g.dart @@ -18,7 +18,7 @@ OwnUser _$OwnUserFromJson(Map json) => OwnUser( totalUnreadCount: json['total_unread_count'] as int? ?? 0, unreadChannels: json['unread_channels'] as int? ?? 0, channelMutes: (json['channel_mutes'] as List?) - ?.map((e) => Mute.fromJson(e as Map)) + ?.map((e) => ChannelMute.fromJson(e as Map)) .toList() ?? const [], id: json['id'] as String, diff --git a/packages/stream_chat/test/fixtures/mute.json b/packages/stream_chat/test/fixtures/channel_mute.json similarity index 100% rename from packages/stream_chat/test/fixtures/mute.json rename to packages/stream_chat/test/fixtures/channel_mute.json diff --git a/packages/stream_chat/test/src/core/models/mute_test.dart b/packages/stream_chat/test/src/core/models/channel_mute_test.dart similarity index 70% rename from packages/stream_chat/test/src/core/models/mute_test.dart rename to packages/stream_chat/test/src/core/models/channel_mute_test.dart index f1f7b606..4c63db00 100644 --- a/packages/stream_chat/test/src/core/models/mute_test.dart +++ b/packages/stream_chat/test/src/core/models/channel_mute_test.dart @@ -1,14 +1,14 @@ import 'package:stream_chat/src/core/models/channel_model.dart'; -import 'package:stream_chat/src/core/models/mute.dart'; +import 'package:stream_chat/src/core/models/channel_mute.dart'; import 'package:stream_chat/src/core/models/user.dart'; import 'package:test/test.dart'; import '../../utils.dart'; void main() { - group('src/models/mute', () { + group('src/models/channel_mute', () { test('should parse json correctly', () { - final mute = Mute.fromJson(jsonFixture('mute.json')); + final mute = ChannelMute.fromJson(jsonFixture('channel_mute.json')); expect(mute.channel, isA()); expect(mute.user, isA()); expect(mute.createdAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); diff --git a/packages/stream_chat/test/src/core/models/own_user_test.dart b/packages/stream_chat/test/src/core/models/own_user_test.dart index 430e9c36..e0dc7801 100644 --- a/packages/stream_chat/test/src/core/models/own_user_test.dart +++ b/packages/stream_chat/test/src/core/models/own_user_test.dart @@ -1,4 +1,5 @@ import 'package:mocktail/mocktail.dart'; +import 'package:stream_chat/src/core/models/channel_mute.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:test/test.dart'; @@ -6,12 +7,14 @@ import '../../utils.dart'; class MockMute extends Mock implements Mute {} +class ChannelMockMute extends Mock implements ChannelMute {} + class MockDevice extends Mock implements Device {} void main() { final devices = [MockDevice(), MockDevice()]; final mutes = [MockMute(), MockMute()]; - final channelMutes = [MockMute()]; + final channelMutes = [ChannelMockMute()]; final createdAt = DateTime.parse('2021-05-03 12:39:21.817646'); final updatedAt = DateTime.parse('2021-04-03 12:39:21.817646'); final lastActive = DateTime.parse('2021-03-03 12:39:21.817646'); From f26553dab3a9b3b0e9f3d5c7534be3a97d6cb25d Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 31 Mar 2022 14:54:36 +0530 Subject: [PATCH 22/33] chore(llc): Update CHANGELOG.md Signed-off-by: xsahil03x --- packages/stream_chat/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index de19b33f..a1583dee 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -3,6 +3,8 @@ 🐞 Fixed - Fixed reactions not working for threads in offline mode. +- [[#1046]](https://github.com/GetStream/stream-chat-flutter/issues/1046) After `/mute` command on reload cannot access + any channel. βœ… Added From 1a64d045eeb62f89a8ec6d94f9342b4801afce88 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 31 Mar 2022 15:37:29 +0530 Subject: [PATCH 23/33] fix(llc): merge channel in channel.update event Signed-off-by: xsahil03x --- packages/stream_chat/lib/src/client/channel.dart | 2 +- packages/stream_chat/lib/src/core/models/channel_model.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index b2887168..a98e9467 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1598,7 +1598,7 @@ class ChannelClientState { _subscriptions.add(_channel.on(EventType.channelUpdated).listen((Event e) { final channel = e.channel!; updateChannelState(channelState.copyWith( - channel: channel, + channel: channelState.channel?.merge(channel), members: channel.members, )); })); diff --git a/packages/stream_chat/lib/src/core/models/channel_model.dart b/packages/stream_chat/lib/src/core/models/channel_model.dart index ed7c2c2e..037c1431 100644 --- a/packages/stream_chat/lib/src/core/models/channel_model.dart +++ b/packages/stream_chat/lib/src/core/models/channel_model.dart @@ -172,7 +172,7 @@ class ChannelModel { updatedAt: other.updatedAt, deletedAt: other.deletedAt, memberCount: other.memberCount, - extraData: other.extraData, + extraData: {...extraData, ...other.extraData}, team: other.team, cooldown: other.cooldown, ); From 23dd1b002251aefde3dc309705e3bc6c1b10b8f8 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 31 Mar 2022 15:39:49 +0530 Subject: [PATCH 24/33] chore(llc): update CHANGELOG.md Signed-off-by: xsahil03x --- packages/stream_chat/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index de19b33f..e69501ba 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -3,6 +3,8 @@ 🐞 Fixed - Fixed reactions not working for threads in offline mode. +- [[#1047]](https://github.com/GetStream/stream-chat-flutter/issues/1047) `own_capabilities` extraData missing after + channel update. βœ… Added From 4cd8d6b00f41d1d4d9d281655e1d0fa2445de854 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 1 Apr 2022 13:19:22 +0530 Subject: [PATCH 25/33] Apply suggestions from code review --- packages/stream_chat/lib/src/core/models/channel_mute.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/core/models/channel_mute.dart b/packages/stream_chat/lib/src/core/models/channel_mute.dart index 67410afc..31c07f0e 100644 --- a/packages/stream_chat/lib/src/core/models/channel_mute.dart +++ b/packages/stream_chat/lib/src/core/models/channel_mute.dart @@ -4,7 +4,7 @@ import 'package:stream_chat/src/core/models/user.dart'; part 'channel_mute.g.dart'; -/// The class that contains the information about a muted user +/// The class that contains the information about a muted channel @JsonSerializable(createToJson: false) class ChannelMute { /// Constructor used for json serialization @@ -23,7 +23,7 @@ class ChannelMute { /// The user that performed the muting action final User user; - /// The target user + /// The target channel final ChannelModel channel; /// The date in which the use was muted From d938a0759d04a66e886e584832681921a27ffca5 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 1 Apr 2022 14:10:04 +0530 Subject: [PATCH 26/33] test(llc): add test for mute model Signed-off-by: xsahil03x --- packages/stream_chat/test/fixtures/mute.json | 32 +++++++++++++++++++ .../src/core/models/channel_mute_test.dart | 3 +- .../test/src/core/models/mute_test.dart | 17 ++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 packages/stream_chat/test/fixtures/mute.json create mode 100644 packages/stream_chat/test/src/core/models/mute_test.dart diff --git a/packages/stream_chat/test/fixtures/mute.json b/packages/stream_chat/test/fixtures/mute.json new file mode 100644 index 00000000..5e425392 --- /dev/null +++ b/packages/stream_chat/test/fixtures/mute.json @@ -0,0 +1,32 @@ +{ + "user": { + "id": "super-band-9", + "role": "user", + "created_at": "2020-03-03T16:48:28.853674Z", + "updated_at": "2021-05-26T03:22:20.296181Z", + "last_active": "2021-06-16T11:42:29.466165498Z", + "banned": false, + "online": true, + "username": "Rioland", + "image": "https://placehold.jp/150x150.png", + "invisible": false, + "name": "Proud darkness", + "unread_count": 0 + }, + "target": { + "id": "super-band-10", + "role": "user", + "created_at": "2020-03-03T16:48:28.853674Z", + "updated_at": "2021-05-26T03:22:20.296181Z", + "last_active": "2021-06-16T11:42:29.466165498Z", + "banned": false, + "online": true, + "username": "Holland", + "image": "https://placehold.jp/150x150.png", + "invisible": false, + "name": "Proud brightness", + "unread_count": 0 + }, + "created_at": "2020-12-04T10:39:06.512021Z", + "updated_at": "2020-12-04T10:39:06.512021Z" +} \ No newline at end of file diff --git a/packages/stream_chat/test/src/core/models/channel_mute_test.dart b/packages/stream_chat/test/src/core/models/channel_mute_test.dart index 4c63db00..9a84f263 100644 --- a/packages/stream_chat/test/src/core/models/channel_mute_test.dart +++ b/packages/stream_chat/test/src/core/models/channel_mute_test.dart @@ -9,9 +9,10 @@ void main() { group('src/models/channel_mute', () { test('should parse json correctly', () { final mute = ChannelMute.fromJson(jsonFixture('channel_mute.json')); - expect(mute.channel, isA()); expect(mute.user, isA()); + expect(mute.channel, isA()); expect(mute.createdAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); + expect(mute.updatedAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); }); }); } diff --git a/packages/stream_chat/test/src/core/models/mute_test.dart b/packages/stream_chat/test/src/core/models/mute_test.dart new file mode 100644 index 00000000..f5361506 --- /dev/null +++ b/packages/stream_chat/test/src/core/models/mute_test.dart @@ -0,0 +1,17 @@ +import 'package:stream_chat/src/core/models/mute.dart'; +import 'package:stream_chat/src/core/models/user.dart'; +import 'package:test/test.dart'; + +import '../../utils.dart'; + +void main() { + group('src/models/channel_mute', () { + test('should parse json correctly', () { + final mute = Mute.fromJson(jsonFixture('mute.json')); + expect(mute.user, isA()); + expect(mute.target, isA()); + expect(mute.createdAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); + expect(mute.updatedAt, DateTime.parse('2020-12-04T10:39:06.512021Z')); + }); + }); +} From 3ebf05bddf118eaafd31a55c5adfc8da447f3428 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Fri, 1 Apr 2022 14:10:48 +0530 Subject: [PATCH 27/33] Update packages/stream_chat/lib/src/core/models/channel_mute.dart Co-authored-by: Ayush Shekhar --- packages/stream_chat/lib/src/core/models/channel_mute.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_chat/lib/src/core/models/channel_mute.dart b/packages/stream_chat/lib/src/core/models/channel_mute.dart index 31c07f0e..ab17161b 100644 --- a/packages/stream_chat/lib/src/core/models/channel_mute.dart +++ b/packages/stream_chat/lib/src/core/models/channel_mute.dart @@ -26,7 +26,7 @@ class ChannelMute { /// The target channel final ChannelModel channel; - /// The date in which the use was muted + /// The date in which the channel was muted final DateTime createdAt; /// The date of the last update From a6990a3f66a347837cd31a633eaa8abf4a37e50d Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 4 Apr 2022 10:35:14 +0200 Subject: [PATCH 28/33] fix(llc): member removed --- packages/stream_chat/lib/src/client/channel.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index a98e9467..e13191de 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1587,9 +1587,13 @@ class ChannelClientState { final user = e.user; updateChannelState(channelState.copyWith( members: List.from( - channelState.members..removeWhere((m) => m.userId == user!.id), + channelState.members + .whereNot((m) => m.userId == user!.id) + .toList(growable: false), ), - read: channelState.read..removeWhere((r) => r.user.id == user!.id), + read: channelState.read + .whereNot((r) => r.user.id == user!.id) + .toList(growable: false), )); })); } From ad385c393da815e10853a607f3598ae955c97bd8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 4 Apr 2022 10:36:11 +0200 Subject: [PATCH 29/33] chore(llc): update changelog --- packages/stream_chat/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 9bffbf5c..349d6c00 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -7,6 +7,7 @@ any channel. - [[#1047]](https://github.com/GetStream/stream-chat-flutter/issues/1047) `own_capabilities` extraData missing after channel update. +- [[#1054]](https://github.com/GetStream/stream-chat-flutter/issues/1054) Fix `Unsupported operation: Cannot remove from an unmodifiable list`. βœ… Added From 047dce107f726b4a97f0efeed6d03d4db2cafc5d Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 4 Apr 2022 10:39:23 +0200 Subject: [PATCH 30/33] chore(llc): remove not needed List.from --- packages/stream_chat/lib/src/client/channel.dart | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index e13191de..cdac2220 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1586,11 +1586,9 @@ class ChannelClientState { _subscriptions.add(_channel.on(EventType.memberRemoved).listen((Event e) { final user = e.user; updateChannelState(channelState.copyWith( - members: List.from( - channelState.members - .whereNot((m) => m.userId == user!.id) - .toList(growable: false), - ), + members: channelState.members + .whereNot((m) => m.userId == user!.id) + .toList(growable: false), read: channelState.read .whereNot((r) => r.user.id == user!.id) .toList(growable: false), From b610438913c5a514bbd12e6238e9fff7768ff037 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 4 Apr 2022 10:41:04 +0200 Subject: [PATCH 31/33] fix(llc): use where --- packages/stream_chat/lib/src/client/channel.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index cdac2220..7218cf65 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1587,10 +1587,10 @@ class ChannelClientState { final user = e.user; updateChannelState(channelState.copyWith( members: channelState.members - .whereNot((m) => m.userId == user!.id) + .where((m) => m.userId != user!.id) .toList(growable: false), read: channelState.read - .whereNot((r) => r.user.id == user!.id) + .where((r) => r.user.id != user!.id) .toList(growable: false), )); })); From 36dc4295fdcb4908fecbddbaf3b6c6bbe64dd39f Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 4 Apr 2022 11:04:41 +0200 Subject: [PATCH 32/33] fix(llc): remove hard delete messages from persistence storage --- packages/stream_chat/lib/src/client/channel.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 7218cf65..7575b29d 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1094,7 +1094,6 @@ class Channel { // remove the passed message if response does // not contain message state!.removeMessage(message); - await _client.chatPersistenceClient?.deleteMessageById(messageId); } return res; } @@ -1851,7 +1850,9 @@ class ChannelClientState { } /// Remove a [message] from this [channelState]. - void removeMessage(Message message) { + void removeMessage(Message message) async { + await _channel._client.chatPersistenceClient?.deleteMessageById(message.id); + final parentId = message.parentId; // i.e. it's a thread message, Remove it if (parentId != null) { From aa20e1146596050609a7ea31bb79c2551b9b380a Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 4 Apr 2022 11:05:18 +0200 Subject: [PATCH 33/33] chore(llc): update changelog --- packages/stream_chat/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index 349d6c00..347b3491 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -8,6 +8,7 @@ - [[#1047]](https://github.com/GetStream/stream-chat-flutter/issues/1047) `own_capabilities` extraData missing after channel update. - [[#1054]](https://github.com/GetStream/stream-chat-flutter/issues/1054) Fix `Unsupported operation: Cannot remove from an unmodifiable list`. +- [[#1033]](https://github.com/GetStream/stream-chat-flutter/issues/1033) Hard delete from dashboard does not delete message from client. βœ… Added