diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt b/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt index 06642a8938..646edef269 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/chats/ChatContainer.kt @@ -125,10 +125,13 @@ class ChatContainer @Inject constructor( val aroundUnread = loadAroundMessageOrder( chat = chat, order = initialState.oldestMessageOrderId.orEmpty() - ).also { - val target = it.find { it.order == initialState.oldestMessageOrderId } + ).also { messages -> + val target = messages.find { it.order == initialState.oldestMessageOrderId } if (target != null) { - intent = Intent.ScrollToMessage(target.id) + intent = Intent.ScrollToMessage( + id = target.id, + smooth = false + ) } } addAll(aroundUnread) @@ -179,7 +182,10 @@ class ChatContainer @Inject constructor( } ChatStreamState( messages = messages, - intent = Intent.ScrollToMessage(transform.message), + intent = Intent.ScrollToMessage( + id = transform.message, + smooth = true + ), state = state.state ) } @@ -207,7 +213,10 @@ class ChatContainer @Inject constructor( val target = messages.find { it.order == oldestReadOrderId } ChatStreamState( messages = messages, - intent = if (target != null) Intent.ScrollToMessage(target.id) else Intent.ScrollToBottom, + intent = if (target != null) + Intent.ScrollToMessage(target.id, smooth = true) + else + Intent.ScrollToBottom, state = state.state ) } else { @@ -626,7 +635,15 @@ class ChatContainer @Inject constructor( ) sealed class Intent { - data class ScrollToMessage(val id: Id) : Intent() + /** + * Represents an intent to scroll to a specific message in the chat. + * + * @param id The unique identifier of the message to scroll to. + * @param smooth Determines whether the scrolling should be smooth (animated) or instantaneous. + * Defaults to `false` for performance reasons, as smooth scrolling may introduce + * delays or unnecessary animations in certain scenarios. + */ + data class ScrollToMessage(val id: Id, val smooth: Boolean = false) : Intent() data class Highlight(val id: Id) : Intent() data object ScrollToBottom : Intent() data object None : Intent() diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt index fac46debb4..958e7f5440 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/ui/ChatScreen.kt @@ -383,7 +383,11 @@ fun ChatScreen( if (index >= 0) { snapshotFlow { lazyListState.layoutInfo.totalItemsCount } .first { it > index } - lazyListState.animateScrollToItem(index) + if (intent.smooth) { + lazyListState.animateScrollToItem(index) + } else { + lazyListState.scrollToItem(index) + } awaitFrame() } else { Timber.d("DROID-2966 COMPOSE Could not find the scrolling target for the intent")