Browse Source

chatgui-android: автоскролл чата вниз при открытии клавиатуры и своих сообщениях

v2
evgeny 3 weeks ago
parent
commit
369b253bdb
  1. 17
      tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/ChatScreen.kt

17
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()
) {

Loading…
Cancel
Save