chatgui-android: автоскролл чата вниз при открытии клавиатуры и своих сообщениях
This commit is contained in:
1 parent
d78d652bf5
commit
369b253bdb
1 file changed
+14
-3
@@ -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()
|
||||
) {
|
||||
|
||||
Reference in new issue
Block a user