diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt index 4e86d60e..f0727dbc 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.utun.chat.data.Channel @@ -122,13 +123,23 @@ fun ChatScreen( initialScrolled = true return@LaunchedEffect } - /* новое сообщение: анимируем только если пользователь у нижнего края */ - val lastVisible = listState.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: -1 - if (lastIndex - lastVisible <= 1) { + /* новое сообщение: скроллим вниз если своё, либо если были у нижнего края */ + val ownMessage = messages.lastOrNull()?.isOutgoing == true + val wasAtBottom = !listState.canScrollForward + if (ownMessage || wasAtBottom) { listState.animateScrollToItem(lastIndex) } } + /* при открытии клавиатуры прижимаем список к низу, чтобы последнее сообщение осталось видимым */ + val density = LocalDensity.current + val imeVisible = WindowInsets.ime.getBottom(density) > 0 + LaunchedEffect(imeVisible) { + if (imeVisible && messages.isNotEmpty()) { + listState.scrollToItem(messages.size - 1) + } + } + Column( modifier = Modifier.fillMaxSize().imePadding() ) {