feat: implement custom profile photo picker with smooth animations and gallery integration

This commit is contained in:
2026-02-02 16:25:01 +05:00
parent c41c27e6d9
commit 0c5abd976e
3 changed files with 618 additions and 31 deletions

View File

@@ -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: Прокрутка ТОЛЬКО при новых сообщениях (не при пагинации)