|
|
|
@ -18,6 +18,7 @@ import androidx.compose.material3.* |
|
|
|
import androidx.compose.runtime.* |
|
|
|
import androidx.compose.runtime.* |
|
|
|
import androidx.compose.ui.Modifier |
|
|
|
import androidx.compose.ui.Modifier |
|
|
|
import androidx.compose.ui.platform.LocalContext |
|
|
|
import androidx.compose.ui.platform.LocalContext |
|
|
|
|
|
|
|
import androidx.compose.ui.platform.LocalDensity |
|
|
|
import androidx.compose.ui.unit.dp |
|
|
|
import androidx.compose.ui.unit.dp |
|
|
|
import androidx.compose.ui.unit.sp |
|
|
|
import androidx.compose.ui.unit.sp |
|
|
|
import com.utun.chat.data.Channel |
|
|
|
import com.utun.chat.data.Channel |
|
|
|
@ -122,13 +123,23 @@ fun ChatScreen( |
|
|
|
initialScrolled = true |
|
|
|
initialScrolled = true |
|
|
|
return@LaunchedEffect |
|
|
|
return@LaunchedEffect |
|
|
|
} |
|
|
|
} |
|
|
|
/* новое сообщение: анимируем только если пользователь у нижнего края */ |
|
|
|
/* новое сообщение: скроллим вниз если своё, либо если были у нижнего края */ |
|
|
|
val lastVisible = listState.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: -1 |
|
|
|
val ownMessage = messages.lastOrNull()?.isOutgoing == true |
|
|
|
if (lastIndex - lastVisible <= 1) { |
|
|
|
val wasAtBottom = !listState.canScrollForward |
|
|
|
|
|
|
|
if (ownMessage || wasAtBottom) { |
|
|
|
listState.animateScrollToItem(lastIndex) |
|
|
|
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( |
|
|
|
Column( |
|
|
|
modifier = Modifier.fillMaxSize().imePadding() |
|
|
|
modifier = Modifier.fillMaxSize().imePadding() |
|
|
|
) { |
|
|
|
) { |
|
|
|
|