From 369b253bdb31cafb2b120b5346a5fd1d0748e3cb Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 14 Sep 2026 12:14:44 +0300 Subject: [PATCH] =?UTF-8?q?chatgui-android:=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=81=D0=BA=D1=80=D0=BE=D0=BB=D0=BB=20=D1=87=D0=B0=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B2=D0=BD=D0=B8=D0=B7=20=D0=BF=D1=80=D0=B8=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B8=20=D0=BA=D0=BB=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=B0=D1=82=D1=83=D1=80=D1=8B=20=D0=B8=20=D1=81=D0=B2?= =?UTF-8?q?=D0=BE=D0=B8=D1=85=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/utun/chat/ui/screens/ChatScreen.kt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) 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() ) {