feat: Refine emoji picker toggle logic to implement cooldown without strict blocking
This commit is contained in:
@@ -2107,7 +2107,7 @@ private fun MessageInputBar(
|
|||||||
|
|
||||||
// <20> Защита от слишком частого переключения клавиатуры (300ms cooldown)
|
// <20> Защита от слишком частого переключения клавиатуры (300ms cooldown)
|
||||||
var lastToggleTime by remember { mutableLongStateOf(0L) }
|
var lastToggleTime by remember { mutableLongStateOf(0L) }
|
||||||
val toggleCooldownMs = 300L
|
val toggleCooldownMs = 500L
|
||||||
|
|
||||||
// 🚫 Флаг "клавиатура анимируется" - блокирует переключение пока высота не стабилизируется
|
// 🚫 Флаг "клавиатура анимируется" - блокирует переключение пока высота не стабилизируется
|
||||||
var isKeyboardAnimating by remember { mutableStateOf(false) }
|
var isKeyboardAnimating by remember { mutableStateOf(false) }
|
||||||
@@ -2190,7 +2190,7 @@ private fun MessageInputBar(
|
|||||||
|
|
||||||
// 🔥 Функция переключения emoji picker с Telegram-style transitions
|
// 🔥 Функция переключения emoji picker с Telegram-style transitions
|
||||||
fun toggleEmojiPicker() {
|
fun toggleEmojiPicker() {
|
||||||
// 🚫 Защита от слишком частого переключения
|
// 🚫 Защита от слишком частого переключения (только cooldown, убираем строгие блокировки)
|
||||||
val currentTime = System.currentTimeMillis()
|
val currentTime = System.currentTimeMillis()
|
||||||
val timeSinceLastToggle = currentTime - lastToggleTime
|
val timeSinceLastToggle = currentTime - lastToggleTime
|
||||||
|
|
||||||
@@ -2199,18 +2199,6 @@ private fun MessageInputBar(
|
|||||||
return
|
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
|
lastToggleTime = currentTime
|
||||||
|
|
||||||
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
|
|||||||
@@ -848,6 +848,10 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
)
|
)
|
||||||
} else null
|
} else null
|
||||||
|
|
||||||
|
// Сохраняем reply для отправки ПЕРЕД очисткой
|
||||||
|
val replyMsgsToSend = replyMsgs.toList()
|
||||||
|
val isForwardToSend = isForward
|
||||||
|
|
||||||
// 1. 🚀 Optimistic UI - мгновенно показываем сообщение с reply bubble
|
// 1. 🚀 Optimistic UI - мгновенно показываем сообщение с reply bubble
|
||||||
val optimisticMessage = ChatMessage(
|
val optimisticMessage = ChatMessage(
|
||||||
id = messageId,
|
id = messageId,
|
||||||
@@ -860,11 +864,7 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
_messages.value = _messages.value + optimisticMessage
|
_messages.value = _messages.value + optimisticMessage
|
||||||
_inputText.value = ""
|
_inputText.value = ""
|
||||||
|
|
||||||
// Сохраняем reply для отправки
|
// Очищаем reply ПОСЛЕ добавления сообщения в список
|
||||||
val replyMsgsToSend = replyMsgs.toList()
|
|
||||||
val isForwardToSend = isForward
|
|
||||||
|
|
||||||
// Очищаем reply после отправки
|
|
||||||
clearReplyMessages()
|
clearReplyMessages()
|
||||||
|
|
||||||
// Кэшируем текст
|
// Кэшируем текст
|
||||||
|
|||||||
Reference in New Issue
Block a user