diff --git a/CHANGELOG.md b/CHANGELOG.md index 0db3a916..911e4ba3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +## 0.2.3 + +- Add `lockChannelsOrder` parameter to `ChannelsBloc` + +## 0.2.2+3 + +- Fix `ChannelListView` channel hidden behaviour + +- Refresh `ChannelListView` on new message from hidden channel + +## 0.2.2+1 + +- Fix some components to implement a splitview example + ## 0.2.2 - Add `messageLinks` property to `MessageTheme` to customize links color diff --git a/lib/src/channel_bottom_sheet.dart b/lib/src/channel_bottom_sheet.dart index a2f124fc..5d32b80c 100644 --- a/lib/src/channel_bottom_sheet.dart +++ b/lib/src/channel_bottom_sheet.dart @@ -107,10 +107,8 @@ class ChannelBottomSheet extends StatelessWidget { 'Do you want to leave the group?', ); if (confirm == true) { - await channel.removeMembers(channel.state.members - .where((element) => - element.userId == StreamChat.of(context).user.id) - .toList()); + await channel + .removeMembers([StreamChat.of(context).user.id]); Navigator.pop(context); } }, @@ -133,10 +131,8 @@ class ChannelBottomSheet extends StatelessWidget { 'Do you want to delete the chat?', ); if (confirm == true) { - await channel.removeMembers(channel.state.members - .where((element) => - element.userId == StreamChat.of(context).user.id) - .toList()); + await channel + .removeMembers([StreamChat.of(context).user.id]); Navigator.pop(context); } }, diff --git a/lib/src/channel_list_view.dart b/lib/src/channel_list_view.dart index 11f4b402..fd60eb95 100644 --- a/lib/src/channel_list_view.dart +++ b/lib/src/channel_list_view.dart @@ -339,11 +339,8 @@ class _ChannelListViewState extends State 'Do you want to leave the group?', ); if (confirm == true) { - await channel.removeMembers(channel.state.members - .where((element) => - element.userId == - StreamChat.of(context).user.id) - .toList()); + await channel + .removeMembers([StreamChat.of(context).user.id]); } }, ), @@ -357,11 +354,8 @@ class _ChannelListViewState extends State 'Do you want to delete the chat?', ); if (confirm == true) { - await channel.removeMembers(channel.state.members - .where((element) => - element.userId == - StreamChat.of(context).user.id) - .toList()); + await channel + .removeMembers([StreamChat.of(context).user.id]); } }, ), @@ -472,6 +466,7 @@ class _ChannelListViewState extends State .on( EventType.connectionRecovered, EventType.notificationAddedToChannel, + EventType.notificationMessageNew, EventType.channelVisible, ) .listen((event) { diff --git a/lib/src/channels_bloc.dart b/lib/src/channels_bloc.dart index b38c6030..e2cf9cd9 100644 --- a/lib/src/channels_bloc.dart +++ b/lib/src/channels_bloc.dart @@ -4,16 +4,21 @@ import 'package:flutter/material.dart'; import 'package:rxdart/rxdart.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_flutter/src/stream_chat.dart'; +import 'package:stream_chat_flutter/stream_chat_flutter.dart'; /// Widget dedicated to the management of a channel list with pagination class ChannelsBloc extends StatefulWidget { /// The widget child final Widget child; + /// Set this to false to prevent channels to be brought to the top of the list when a new message arrives + final bool lockChannelsOrder; + /// Instantiate a new ChannelsBloc const ChannelsBloc({ Key key, this.child, + this.lockChannelsOrder = false, }) : super(key: key); @override @@ -58,6 +63,8 @@ class ChannelsBlocState extends State Stream get queryChannelsLoading => _queryChannelsLoadingController.stream; + final List _hiddenChannels = []; + /// Calls [client.queryChannels] updating [queryChannelsLoading] stream Future queryChannels({ Map filter, @@ -112,12 +119,31 @@ class ChannelsBlocState extends State final client = StreamChat.of(context).client; - _subscriptions.add(client.on(EventType.messageNew).listen((e) { - final newChannels = List.from(channels ?? []); - final index = newChannels.indexWhere((c) => c.cid == e.cid); - if (index > 0) { - final channel = newChannels.removeAt(index); - newChannels.insert(0, channel); + if (!widget.lockChannelsOrder) { + _subscriptions.add(client.on(EventType.messageNew).listen((e) { + final newChannels = List.from(channels ?? []); + final index = newChannels.indexWhere((c) => c.cid == e.cid); + if (index > 0) { + final channel = newChannels.removeAt(index); + newChannels.insert(0, channel); + _channelsController.add(newChannels); + } else { + final hiddenIndex = _hiddenChannels.indexWhere((c) => c.cid == e.cid); + if (hiddenIndex > -1) { + newChannels.insert(0, _hiddenChannels[hiddenIndex]); + _hiddenChannels.removeAt(hiddenIndex); + _channelsController.add(newChannels); + } + } + })); + } + + _subscriptions.add(client.on(EventType.channelHidden).listen((event) async { + final newChannels = List.from(channels); + final channelIndex = newChannels.indexWhere((c) => c.cid == event.cid); + if (channelIndex > -1) { + final channel = newChannels.removeAt(channelIndex); + _hiddenChannels.add(channel); _channelsController.add(newChannels); } })); diff --git a/lib/src/message_widget.dart b/lib/src/message_widget.dart index a2020726..663e682a 100644 --- a/lib/src/message_widget.dart +++ b/lib/src/message_widget.dart @@ -208,8 +208,8 @@ class _MessageWidgetState extends State { @override Widget build(BuildContext context) { var leftPadding = widget.showUserAvatar != DisplayWidget.gone - ? widget.messageTheme.avatarTheme.constraints.maxWidth + 16.0 - : 6.0; + ? widget.messageTheme.avatarTheme.constraints.maxWidth + 24.0 + : 16.0; return Portal( child: Padding( padding: widget.padding ?? EdgeInsets.all(8), @@ -232,6 +232,15 @@ class _MessageWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.end, mainAxisSize: MainAxisSize.min, children: [ + if (widget.showSendingIndicator == DisplayWidget.show) + _buildSendingIndicator(), + SizedBox( + width: 2, + ), + if (widget.showSendingIndicator == DisplayWidget.hide) + SizedBox( + width: 8, + ), if (widget.showUserAvatar == DisplayWidget.show) _buildUserAvatar(), SizedBox( diff --git a/pubspec.yaml b/pubspec.yaml index 8c25ab28..6eb7a7d8 100644 --- a/pubspec.yaml +++ b/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: 0.2.2 +version: 0.2.3 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -23,8 +23,8 @@ dependencies: file_picker: ^1.12.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.1 - flutter_svg: ^0.17.0 + flutter_svg: ^0.18.0 + stream_chat: ^0.2.2 mime: ^0.9.6+3 visibility_detector: ^0.1.5 line_awesome_icons: ^1.0.4+2