Scroll fix (#281)

* auto scroll

* scroll fix
This commit is contained in:
callebtc 2025-08-22 22:01:11 +02:00 committed by GitHub
parent 440c73961e
commit 8e61ab24bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 3 deletions

View File

@ -50,6 +50,7 @@ fun ChatScreen(viewModel: ChatViewModel) {
var showPasswordDialog by remember { mutableStateOf(false) }
var passwordInput by remember { mutableStateOf("") }
var showLocationChannelsSheet by remember { mutableStateOf(false) }
var forceScrollToBottom by remember { mutableStateOf(false) }
// Show password dialog when needed
LaunchedEffect(showPasswordPrompt) {
@ -85,7 +86,8 @@ fun ChatScreen(viewModel: ChatViewModel) {
messages = displayMessages,
currentUserNickname = nickname,
meshService = viewModel.meshService,
modifier = Modifier.weight(1f)
modifier = Modifier.weight(1f),
forceScrollToBottom = forceScrollToBottom
)
// Input area - stays at bottom
ChatInputSection(
@ -99,6 +101,7 @@ fun ChatScreen(viewModel: ChatViewModel) {
if (messageText.text.trim().isNotEmpty()) {
viewModel.sendMessage(messageText.text.trim())
messageText = TextFieldValue("")
forceScrollToBottom = !forceScrollToBottom // Toggle to trigger scroll
}
},
showCommandSuggestions = showCommandSuggestions,

View File

@ -31,13 +31,37 @@ fun MessagesList(
messages: List<BitchatMessage>,
currentUserNickname: String,
meshService: BluetoothMeshService,
modifier: Modifier = Modifier
modifier: Modifier = Modifier,
forceScrollToBottom: Boolean = false
) {
val listState = rememberLazyListState()
// Auto-scroll to bottom when new messages arrive
// Track if this is the first time messages are being loaded
var hasScrolledToInitialPosition by remember { mutableStateOf(false) }
// Smart scroll: auto-scroll to bottom for initial load, then only when user is at or near the bottom
LaunchedEffect(messages.size) {
if (messages.isNotEmpty()) {
val layoutInfo = listState.layoutInfo
val lastVisibleIndex = layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: -1
val totalItems = layoutInfo.totalItemsCount
// Always scroll to bottom on first load, or when user is near the bottom
val isFirstLoad = !hasScrolledToInitialPosition
val isNearBottom = lastVisibleIndex >= totalItems - 3
if (isFirstLoad || isNearBottom) {
listState.animateScrollToItem(messages.size - 1)
if (isFirstLoad) {
hasScrolledToInitialPosition = true
}
}
}
}
// Force scroll to bottom when requested (e.g., when user sends a message)
LaunchedEffect(forceScrollToBottom) {
if (forceScrollToBottom && messages.isNotEmpty()) {
listState.animateScrollToItem(messages.size - 1)
}
}