From c605148fa49daaa5344afb2c54509e6d059940c2 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Fri, 16 Jan 2026 04:23:20 +0500 Subject: [PATCH] feat: Update reply message handling in ChatViewModel and ChatDetailScreen to improve user experience during reply animations --- .../rosetta/messenger/ui/chats/ChatDetailScreen.kt | 12 +++++++++--- .../com/rosetta/messenger/ui/chats/ChatViewModel.kt | 5 ++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt index ed45ca8..5fac30a 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatDetailScreen.kt @@ -292,9 +292,15 @@ fun ChatDetailScreen( val hasReply = replyMessages.isNotEmpty() // 🔥 Snapshot последнего непустого состояния для отображения во время анимации закрытия - val displayReplyMessages = remember(replyMessages) { - if (replyMessages.isNotEmpty()) replyMessages else emptyList() - }.let { if (hasReply) replyMessages else it } + // Используем rememberSaveable с mutableStateOf чтобы сохранять данные пока панель закрывается + var displayReplyMessages by remember { mutableStateOf(replyMessages) } + + // Обновляем snapshot только когда появляются новые данные (не пустые) + LaunchedEffect(replyMessages) { + if (replyMessages.isNotEmpty()) { + displayReplyMessages = replyMessages + } + } // 🔥 FocusRequester для автофокуса на инпут при reply val inputFocusRequester = remember { FocusRequester() } diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt index 3d7aa32..ba256fe 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt @@ -1032,9 +1032,8 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { _messages.value = _messages.value + optimisticMessage _inputText.value = "" - // 🔥 НЕ очищаем reply автоматически - пользователь должен закрыть панель вручную - // Это позволяет сохранить текст в reply инпуте после отправки - // clearReplyMessages() - вызывается только при клике на крестик + // 🔥 Очищаем reply после отправки - данные сохраняются в displayReplyMessages для анимации + clearReplyMessages() // Кэшируем текст decryptionCache[messageId] = text