diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index d0b8ad32..f7094a53 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -1,5 +1,10 @@ ## Upcoming +🐞 Fixed + +- [[#1355]](https://github.com/GetStream/stream-chat-flutter/issues/1355) Fixed error while hiding channel and clearing + message history. + ✅ Added - Expose `ChannelMute` class. [#1473](https://github.com/GetStream/stream-chat-flutter/issues/1473) diff --git a/packages/stream_chat/lib/src/client/channel.dart b/packages/stream_chat/lib/src/client/channel.dart index 7d8515c7..1d419cbb 100644 --- a/packages/stream_chat/lib/src/client/channel.dart +++ b/packages/stream_chat/lib/src/client/channel.dart @@ -1485,19 +1485,11 @@ class Channel { /// will be removed for the user. Future hide({bool clearHistory = false}) async { _checkInitialized(); - final response = await _client.hideChannel( + return _client.hideChannel( id!, type, clearHistory: clearHistory, ); - if (clearHistory) { - state!.truncate(); - final cid = _cid; - if (cid != null) { - await _client.chatPersistenceClient?.deleteMessageByCid(cid); - } - } - return response; } /// Removes the hidden status for the channel. diff --git a/packages/stream_chat/lib/src/client/client.dart b/packages/stream_chat/lib/src/client/client.dart index 4f2dbda3..26d229b4 100644 --- a/packages/stream_chat/lib/src/client/client.dart +++ b/packages/stream_chat/lib/src/client/client.dart @@ -1567,7 +1567,7 @@ class ClientState { _client.on(EventType.channelHidden).listen((event) async { final eventChannel = event.channel!; await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]); - channels[eventChannel.cid]?.dispose(); + channels.remove(eventChannel.cid)?.dispose(); }), ); } @@ -1606,7 +1606,7 @@ class ClientState { .listen((Event event) async { final eventChannel = event.channel!; await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]); - channels[eventChannel.cid]?.dispose(); + channels.remove(eventChannel.cid)?.dispose(); }), ); } @@ -1713,9 +1713,9 @@ class ClientState { _unreadChannelsController.close(); _totalUnreadCountController.close(); - final channels = this.channels.values.toList(); + final channels = [...this.channels.keys]; for (final channel in channels) { - channel.dispose(); + this.channels.remove(channel)?.dispose(); } _channelsController.close(); } diff --git a/packages/stream_chat_flutter_core/CHANGELOG.md b/packages/stream_chat_flutter_core/CHANGELOG.md index 29b6a27f..5a560da6 100644 --- a/packages/stream_chat_flutter_core/CHANGELOG.md +++ b/packages/stream_chat_flutter_core/CHANGELOG.md @@ -1,3 +1,8 @@ +## Upcoming + +- [[#1356]](https://github.com/GetStream/stream-chat-flutter/issues/1356) Channel doesn't auto display again after being + hidden. + ## 6.0.0 - Updated dependencies to resolvable versions. diff --git a/packages/stream_chat_flutter_core/lib/src/stream_channel.dart b/packages/stream_chat_flutter_core/lib/src/stream_channel.dart index 9842c3e2..bbfdea5b 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_channel.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_channel.dart @@ -387,12 +387,20 @@ class StreamChannelState extends State { (it) => it.user.id == channel.client.state.currentUser?.id, ); - if (read != null && - !(channel.state!.messages - .any((it) => it.createdAt.compareTo(read.lastRead) > 0) && - channel.state!.messages - .any((it) => it.createdAt.compareTo(read.lastRead) <= 0))) { - _futures.add(_loadChannelAtTimestamp(read.lastRead)); + if (read == null) return; + + final messages = channel.state!.messages; + final lastRead = read.lastRead; + + final hasNewMessages = + messages.any((it) => it.createdAt.isAfter(lastRead)); + final hasOldMessages = + messages.any((it) => it.createdAt.isBeforeOrEqualTo(lastRead)); + + // Only load messages if the unread message is in-between the messages. + // Otherwise, we can just load the channel normally. + if (hasNewMessages && hasOldMessages) { + _futures.add(_loadChannelAtTimestamp(lastRead)); } } } @@ -449,3 +457,9 @@ class StreamChannelState extends State { return child; } } + +extension on DateTime { + bool isBeforeOrEqualTo(DateTime other) { + return isBefore(other) || isAtSameMomentAs(other); + } +} diff --git a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_event_handler.dart b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_event_handler.dart index 92b5650b..0fc34dfd 100644 --- a/packages/stream_chat_flutter_core/lib/src/stream_channel_list_event_handler.dart +++ b/packages/stream_chat_flutter_core/lib/src/stream_channel_list_event_handler.dart @@ -101,14 +101,19 @@ class StreamChannelListEventHandler { /// we are currently watching. /// /// By default, this moves the channel to the top of the list. - void onMessageNew(Event event, StreamChannelListController controller) { + void onMessageNew(Event event, StreamChannelListController controller) async { final channelCid = event.cid; if (channelCid == null) return; final channels = [...controller.currentItems]; final channelIndex = channels.indexWhere((it) => it.cid == channelCid); - if (channelIndex <= 0) return; + if (channelIndex <= 0) { + // If the channel is not in the list, It might be hidden. + // So, we just refresh the list. + await controller.refresh(resetValue: false); + return; + } final channel = channels.removeAt(channelIndex); channels.insert(0, channel);