feat: implement custom profile photo picker with smooth animations and gallery integration
This commit is contained in:
@@ -270,25 +270,9 @@ fun ChatDetailScreen(
|
||||
val hasReply = replyMessages.isNotEmpty()
|
||||
val isForwardMode by viewModel.isForwardMode.collectAsState()
|
||||
|
||||
// 🔥 Количество сообщений для отслеживания пагинации
|
||||
val messagesCount = messages.size
|
||||
var previousMessagesCount by remember { mutableStateOf(messagesCount) }
|
||||
|
||||
// 🔥 ПАГИНАЦИЯ: Сохраняем позицию скролла при подгрузке старых сообщений
|
||||
LaunchedEffect(messagesCount) {
|
||||
if (messagesCount > previousMessagesCount && previousMessagesCount > 0) {
|
||||
// Загрузились новые (старые) сообщения - корректируем позицию
|
||||
val addedCount = messagesCount - previousMessagesCount
|
||||
val currentIndex = listState.firstVisibleItemIndex
|
||||
val currentOffset = listState.firstVisibleItemScrollOffset
|
||||
|
||||
// Прокручиваем на количество добавленных элементов, чтобы остаться на месте
|
||||
listState.scrollToItem(currentIndex + addedCount, currentOffset)
|
||||
}
|
||||
previousMessagesCount = messagesCount
|
||||
}
|
||||
|
||||
// 🔥 ПАГИНАЦИЯ: Загружаем старые сообщения при прокрутке вверх
|
||||
// NOTE: Не нужен ручной scrollToItem - LazyColumn с reverseLayout=true
|
||||
// автоматически сохраняет позицию благодаря стабильным ключам (key = message.id)
|
||||
// reverseLayout=true означает что index 0 - это новое сообщение внизу,
|
||||
// а большие индексы - старые сообщения вверху
|
||||
// Используем snapshotFlow с debounce для плавной пагинации без прерывания скролла
|
||||
@@ -445,7 +429,10 @@ fun ChatDetailScreen(
|
||||
}
|
||||
|
||||
// 🔥 Отслеживаем ID самого нового сообщения для умного скролла
|
||||
val newestMessageId = messages.firstOrNull()?.id
|
||||
// ВАЖНО: Используем maxByOrNull по timestamp, НЕ firstOrNull()!
|
||||
// При пагинации старые сообщения добавляются в начало списка,
|
||||
// поэтому firstOrNull() возвращает старое сообщение, а не новое.
|
||||
val newestMessageId = messages.maxByOrNull { it.timestamp.time }?.id
|
||||
var lastNewestMessageId by remember { mutableStateOf<String?>(null) }
|
||||
|
||||
// Telegram-style: Прокрутка ТОЛЬКО при новых сообщениях (не при пагинации)
|
||||
|
||||
Reference in New Issue
Block a user