From 42e1112c504a374a317f550dbc163519b37cfd10 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Tue, 2 May 2023 18:52:13 +0530 Subject: [PATCH] fix(core): Channel doesn't auto display again after being hidden. Signed-off-by: xsahil03x --- .../stream_chat_flutter_core/CHANGELOG.md | 5 ++++ .../lib/src/stream_channel.dart | 26 ++++++++++++++----- .../stream_channel_list_event_handler.dart | 9 +++++-- 3 files changed, 32 insertions(+), 8 deletions(-) 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);