diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index f8a5bee7..a74b920e 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,3 +1,9 @@ +## 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. + ## 3.5.0 ✅ Added diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 0493c0d7..f2effe04 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1902,7 +1902,6 @@ class ChannelClientState { readList.add(Read( user: event.user!, lastRead: event.createdAt, - unreadMessages: event.totalUnreadCount ?? 0, )); _channelState = _channelState.copyWith(read: readList); } diff --git a/packages/stream_chat/lib/src/ws/websocket.dart b/packages/stream_chat/lib/src/ws/websocket.dart index 82c7d7c1..888ba08b 100644 --- a/packages/stream_chat/lib/src/ws/websocket.dart +++ b/packages/stream_chat/lib/src/ws/websocket.dart @@ -190,8 +190,12 @@ class WebSocket with TimerHelper { _connectionStatus = ConnectionStatus.connecting; connectionCompleter = Completer(); - final uri = await _buildUri(); - _initWebSocketChannel(uri); + try { + final uri = await _buildUri(); + _initWebSocketChannel(uri); + } catch (e, stk) { + _onConnectionError(e, stk); + } return connectionCompleter!.future; } @@ -216,7 +220,11 @@ class WebSocket with TimerHelper { Duration(milliseconds: delay), () async { final uri = await _buildUri(refreshToken: refreshToken); - _initWebSocketChannel(uri); + try { + _initWebSocketChannel(uri); + } catch (e, stk) { + _onConnectionError(e, stk); + } }, ); } diff --git a/packages/stream_chat/lib/version.dart b/packages/stream_chat/lib/version.dart index 0ae6a20a..8d0584a0 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.0'; +const PACKAGE_VERSION = '3.5.1'; diff --git a/packages/stream_chat/pubspec.yaml b/packages/stream_chat/pubspec.yaml index 6e6893c1..2e195f6b 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.0 +version: 3.5.1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -30,5 +30,5 @@ dev_dependencies: dart_code_metrics: ^4.4.0 freezed: ^1.0.0 json_serializable: ^6.0.1 - mocktail: ^0.2.0 + mocktail: ^0.3.0 test: ^1.17.12 \ No newline at end of file diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index 7d978867..74d0d67b 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -4,6 +4,13 @@ - `centerTitle` and `elevation` properties to `ChannelHeader`, `ThreadHeader` and `ChannelListHeader`. +## 3.5.1 + +🐞 Fixed + +- Mentions overlay now doesn't overflow when there is not enough height available +- Updated `stream_chat_flutter_core` dependency to [`3.5.1`](https://pub.dev/packages/stream_chat_flutter_core/changelog). + ## 3.5.0 🐞 Fixed diff --git a/packages/stream_chat_flutter/lib/src/media_list_view.dart b/packages/stream_chat_flutter/lib/src/media_list_view.dart index d5a9233c..62072b0a 100644 --- a/packages/stream_chat_flutter/lib/src/media_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/media_list_view.dart @@ -158,7 +158,10 @@ class _MediaListViewState extends State { )) .firstOrNull; - final media = await assetList?.getAssetListPaged(_currentPage, 50); + final media = await assetList?.getAssetListPaged( + page: _currentPage, + size: 50, + ); if (media?.isNotEmpty == true) { setState(() { @@ -197,7 +200,7 @@ class MediaThumbnailProvider extends ImageProvider { DecoderCallback decode, ) async { assert(key == this, 'Checks MediaThumbnailProvider'); - final bytes = await media.thumbData; + final bytes = await media.thumbnailData; return decode(bytes!); } diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index d1a45786..afb2c749 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -344,6 +344,7 @@ class MessageInputState extends State { final _imagePicker = ImagePicker(); late final _focusNode = widget.focusNode ?? FocusNode(); + late final _isInternalFocusNode = widget.focusNode == null; bool _inputEnabled = true; bool _commandEnabled = false; bool _showCommandsOverlay = false; @@ -1191,30 +1192,36 @@ class MessageInputState extends State { }; } - return UserMentionsOverlay( - query: query, - mentionAllAppUsers: widget.mentionAllAppUsers, - client: StreamChat.of(context).client, - channel: channel, - size: Size(renderObject.size.width - 16, 400), - mentionsTileBuilder: tileBuilder, - onMentionUserTap: (user) { - _mentionedUsers.add(user); - splits[splits.length - 1] = user.name; - final rejoin = splits.join('@'); + return LayoutBuilder( + builder: (context, snapshot) => UserMentionsOverlay( + query: query, + mentionAllAppUsers: widget.mentionAllAppUsers, + client: StreamChat.of(context).client, + channel: channel, + size: Size( + renderObject.size.width - 16, + min(400, (snapshot.maxHeight - renderObject.size.height - 16).abs()), + ), + mentionsTileBuilder: tileBuilder, + onMentionUserTap: (user) { + _mentionedUsers.add(user); + splits[splits.length - 1] = user.name; + final rejoin = splits.join('@'); - textEditingController.value = TextEditingValue( - text: rejoin + - textEditingController.text.substring( - textEditingController.selection.start, - ), - selection: TextSelection.collapsed( - offset: rejoin.length, - ), - ); - _onChangedDebounced.cancel(); - setState(() => _showMentionsOverlay = false); - }, + textEditingController.value = TextEditingValue( + text: rejoin + + textEditingController.text.substring( + textEditingController.selection.start, + ), + selection: TextSelection.collapsed( + offset: rejoin.length, + ), + ); + _onChangedDebounced.cancel(); + + setState(() => _showMentionsOverlay = false); + }, + ), ); } @@ -1925,6 +1932,7 @@ class MessageInputState extends State { void dispose() { textEditingController.dispose(); _focusNode.removeListener(_focusNodeListener); + if (_isInternalFocusNode) _focusNode.dispose(); _stopSlowMode(); _onChangedDebounced.cancel(); super.dispose(); @@ -1970,12 +1978,12 @@ class _PickerWidget extends StatefulWidget { } class _PickerWidgetState extends State<_PickerWidget> { - Future? requestPermission; + Future? requestPermission; @override void initState() { super.initState(); - requestPermission = PhotoManager.requestPermission(); + requestPermission = PhotoManager.requestPermissionExtend(); } @override @@ -1983,14 +1991,15 @@ class _PickerWidgetState extends State<_PickerWidget> { if (widget.filePickerIndex != 0) { return const Offstage(); } - return FutureBuilder( + return FutureBuilder( future: requestPermission, builder: (context, snapshot) { if (!snapshot.hasData) { return const Offstage(); } - if (snapshot.data!) { + if ([PermissionState.authorized, PermissionState.limited] + .contains(snapshot.data)) { if (widget.containsFile) { return GestureDetector( onTap: () { diff --git a/packages/stream_chat_flutter/pubspec.yaml b/packages/stream_chat_flutter/pubspec.yaml index c2d90eb0..2abc216f 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.0 +version: 3.5.1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -31,12 +31,12 @@ dependencies: lottie: ^1.0.1 meta: ^1.3.0 path_provider: ^2.0.1 - photo_manager: ^1.2.6+1 + photo_manager: ^2.0.1 photo_view: ^0.13.0 rxdart: ^0.27.0 - share_plus: ^3.0.4 + share_plus: ^4.0.1 shimmer: ^2.0.0 - stream_chat_flutter_core: ^3.5.0 + stream_chat_flutter_core: ^3.5.1 substring_highlight: ^1.0.26 synchronized: ^3.0.0 url_launcher: ^6.0.3 @@ -58,5 +58,5 @@ dev_dependencies: flutter_test: sdk: flutter golden_toolkit: ^0.13.0 - mocktail: ^0.2.0 + mocktail: ^0.3.0 path: ^1.8.0 diff --git a/packages/stream_chat_flutter_core/CHANGELOG.md b/packages/stream_chat_flutter_core/CHANGELOG.md index 1fa60708..d18b2ca0 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.5.1 + +- Updated `stream_chat` dependency to [`3.5.1`](https://pub.dev/packages/stream_chat/changelog). + ## 3.5.0 - Updated `stream_chat` dependency to [`3.5.0`](https://pub.dev/packages/stream_chat/changelog). diff --git a/packages/stream_chat_flutter_core/pubspec.yaml b/packages/stream_chat_flutter_core/pubspec.yaml index b9d8e440..3fde274b 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.0 +version: 3.5.1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -16,12 +16,12 @@ dependencies: sdk: flutter meta: ^1.3.0 rxdart: ^0.27.0 - stream_chat: ^3.5.0 + stream_chat: ^3.5.1 dev_dependencies: dart_code_metrics: ^4.4.0 fake_async: ^1.2.0 flutter_test: sdk: flutter - mocktail: ^0.2.0 + mocktail: ^0.3.0