diff --git a/CHANGELOG.md b/CHANGELOG.md index a03bc8e7a17..afd8e1498a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Shadowed messages are filtered. [#5234](https://github.com/GetStream/stream-chat-android/pull/5234) ### ⬆️ Improved +- `Channel.lastMessageAt` is not updated when there is a new message within a thread. [#5245](https://github.com/GetStream/stream-chat-android/pull/5245) ### ✅ Added @@ -59,6 +60,7 @@ ### 🐞 Fixed ### ⬆️ Improved +- Channel List is not updated with new messages within a thread. [#5245](https://github.com/GetStream/stream-chat-android/pull/5245) ### ✅ Added - Added a Button to jump to the first unread message in the channel. [#5236](https://github.com/GetStream/stream-chat-android/pull/5236) @@ -72,6 +74,7 @@ - Fixed `ChannelsState.isLoadingMore` being stuck. [#5239](https://github.com/GetStream/stream-chat-android/pull/5239) ### ⬆️ Improved +- Channel List is not updated with new messages within a thread. [#5245](https://github.com/GetStream/stream-chat-android/pull/5245) ### ✅ Added diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/extensions/internal/Channel.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/extensions/internal/Channel.kt index 60f6c6e2173..fabc958e776 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/extensions/internal/Channel.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/extensions/internal/Channel.kt @@ -76,7 +76,10 @@ public fun Channel.updateLastMessage( ) } return this.copy( - lastMessageAt = newMessages.last().let { it.createdAt ?: it.createdLocallyAt }, + lastMessageAt = newMessages + .filterNot { it.parentId != null && !it.showInChannel } + .last() + .let { it.createdAt ?: it.createdLocallyAt }, messages = newMessages, read = newReads, ).syncUnreadCountWithReads() diff --git a/stream-chat-android-core/src/main/java/io/getstream/chat/android/models/ChannelData.kt b/stream-chat-android-core/src/main/java/io/getstream/chat/android/models/ChannelData.kt index 4edcf3afe7e..7eac7e9a8bf 100644 --- a/stream-chat-android-core/src/main/java/io/getstream/chat/android/models/ChannelData.kt +++ b/stream-chat-android-core/src/main/java/io/getstream/chat/android/models/ChannelData.kt @@ -130,6 +130,7 @@ public data class ChannelData( cooldown = cooldown, lastMessageAt = messagesList .filterNot { it.shadowed } + .filterNot { it.parentId != null && !it.showInChannel } .lastOrNull() ?.let { it.createdAt ?: it.createdLocallyAt }, createdBy = createdBy, diff --git a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/channel/internal/DatabaseChannelRepository.kt b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/channel/internal/DatabaseChannelRepository.kt index ae2eeec1612..0e0861557b7 100644 --- a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/channel/internal/DatabaseChannelRepository.kt +++ b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/channel/internal/DatabaseChannelRepository.kt @@ -222,7 +222,11 @@ internal class DatabaseChannelRepository( insertChannel( it.copy( messages = listOf(lastMessage), - lastMessageAt = lastMessage.createdAt ?: lastMessage.createdLocallyAt ?: Date(0), + lastMessageAt = it.lastMessageAt + .takeIf { lastMessage.parentId != null && !lastMessage.showInChannel } + ?: lastMessage.createdAt + ?: lastMessage.createdLocallyAt + ?: Date(0), ), ) } @@ -242,7 +246,10 @@ internal class DatabaseChannelRepository( lastMessageAt = maxOf( lastMessageAt, cachedChannel.lastMessageAt, - messages.lastOrNull()?.let { it.createdAt ?: it.createdLocallyAt ?: Date(0) }, + messages + .filterNot { it.parentId != null && !it.showInChannel } + .lastOrNull() + ?.let { it.createdAt ?: it.createdLocallyAt ?: Date(0) }, ), hiddenMessagesBefore = hideMessagesBefore, members = members, diff --git a/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/repository/domain/channel/internal/ChannelRepositoryImplTest.kt b/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/repository/domain/channel/internal/ChannelRepositoryImplTest.kt index 1d20e6ce5a3..ac9940391f7 100644 --- a/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/repository/domain/channel/internal/ChannelRepositoryImplTest.kt +++ b/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/repository/domain/channel/internal/ChannelRepositoryImplTest.kt @@ -68,7 +68,7 @@ internal class ChannelRepositoryImplTest { @Test fun `Given channel without messages in DB, Should insert channel with updated last message`() = runTest { val channel = randomChannel(messages = emptyList()) - val lastMessage = randomMessage(createdAt = Date()) + val lastMessage = randomMessage(createdAt = Date(), parentId = null) whenever(channelDao.select("cid")) doReturn channel.toEntity() channelRepository.updateLastMessageForChannel("cid", lastMessage) @@ -89,8 +89,8 @@ internal class ChannelRepositoryImplTest { fun `Given channel with outdated lastMessage in DB, Should insert channel with updated last message`() = runTest { val before = Date(1000) val after = Date(2000) - val outdatedMessage = randomMessage(id = "messageId1", createdAt = before) - val newLastMessage = randomMessage(id = "messageId2", createdAt = after) + val outdatedMessage = randomMessage(id = "messageId1", createdAt = before, parentId = null) + val newLastMessage = randomMessage(id = "messageId2", createdAt = after, parentId = null) val channel = randomChannel(messages = listOf(outdatedMessage), lastMessageAt = before) whenever(channelDao.select(cid = "cid")) doReturn channel.toEntity()