From 327b12a462a3e217b791b32ac6ec9ea8fac8630d Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Thu, 15 Jan 2026 16:31:42 +0500 Subject: [PATCH] feat: Refine emoji picker toggle logic to implement cooldown without strict blocking --- .../messenger/ui/chats/ChatDetailScreen.kt | 16 ++-------------- .../rosetta/messenger/ui/chats/ChatViewModel.kt | 10 +++++----- 2 files changed, 7 insertions(+), 19 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 bd19460..b9d9857 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 @@ -2107,7 +2107,7 @@ private fun MessageInputBar( // � Защита от слишком частого переключения клавиатуры (300ms cooldown) var lastToggleTime by remember { mutableLongStateOf(0L) } - val toggleCooldownMs = 300L + val toggleCooldownMs = 500L // 🚫 Флаг "клавиатура анимируется" - блокирует переключение пока высота не стабилизируется var isKeyboardAnimating by remember { mutableStateOf(false) } @@ -2190,7 +2190,7 @@ private fun MessageInputBar( // 🔥 Функция переключения emoji picker с Telegram-style transitions fun toggleEmojiPicker() { - // 🚫 Защита от слишком частого переключения + // 🚫 Защита от слишком частого переключения (только cooldown, убираем строгие блокировки) val currentTime = System.currentTimeMillis() val timeSinceLastToggle = currentTime - lastToggleTime @@ -2199,18 +2199,6 @@ private fun MessageInputBar( return } - // 🚫 БЛОКИРОВКА: Если идет анимация - запрещаем переключение - if (coordinator.currentState != KeyboardTransitionCoordinator.TransitionState.IDLE) { - android.util.Log.d("EmojiPicker", "⏸️ Toggle blocked: animation in progress (state=${coordinator.currentState})") - return - } - - // 🚫 БЛОКИРОВКА: Если клавиатура еще анимируется (не стабилизировалась) - if (isKeyboardAnimating) { - android.util.Log.d("EmojiPicker", "⏸️ Toggle blocked: keyboard still animating") - return - } - lastToggleTime = currentTime val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 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 cfdba91..5100f7d 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 @@ -848,6 +848,10 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { ) } else null + // Сохраняем reply для отправки ПЕРЕД очисткой + val replyMsgsToSend = replyMsgs.toList() + val isForwardToSend = isForward + // 1. 🚀 Optimistic UI - мгновенно показываем сообщение с reply bubble val optimisticMessage = ChatMessage( id = messageId, @@ -860,11 +864,7 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { _messages.value = _messages.value + optimisticMessage _inputText.value = "" - // Сохраняем reply для отправки - val replyMsgsToSend = replyMsgs.toList() - val isForwardToSend = isForward - - // Очищаем reply после отправки + // Очищаем reply ПОСЛЕ добавления сообщения в список clearReplyMessages() // Кэшируем текст