From da008439baa30faa533f20bede0a470e2ed18e52 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Tue, 13 Jan 2026 00:51:41 +0500 Subject: [PATCH] feat: Adjust emoji panel display logic in MessageInputBar for smoother user experience --- .../messenger/ui/chats/ChatDetailScreen.kt | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 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 099ae69..4fb338b 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 @@ -28,6 +28,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.draw.scale import androidx.compose.ui.draw.shadow @@ -1552,10 +1553,14 @@ private fun MessageInputBar( showEmojiPicker = false // Клавиатура откроется автоматически т.к. фокус остался } else { - // Закрываем клавиатуру но оставляем фокус - keyboardController?.hide() - // Сразу показываем emoji panel (высота та же - нет прыжка) - showEmojiPicker = true + // Закрываем клавиатуру через IMM + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(view.windowToken, 0) + // Небольшая задержка перед показом эмодзи для плавного перехода + scope.launch { + delay(50) + showEmojiPicker = true + } } } @@ -1761,26 +1766,36 @@ private fun MessageInputBar( } } // End of else (not blocked) - // 🔥 APPLE EMOJI PICKER - с категориями и фоновой загрузкой + // 🔥 APPLE EMOJI PICKER - плавная анимация высоты if (!isBlocked) { - AnimatedVisibility( - visible = showEmojiPicker, - enter = fadeIn(tween(150)), - exit = fadeOut(tween(100)) - ) { - AppleEmojiPickerPanel( - isDarkTheme = isDarkTheme, - onEmojiSelected = { emoji -> - onValueChange(value + emoji) - }, - onClose = { - showEmojiPicker = false - }, + // Анимируем высоту панели + val animatedHeight by animateDpAsState( + targetValue = if (showEmojiPicker) emojiPanelHeight else 0.dp, + animationSpec = tween(durationMillis = 250, easing = FastOutSlowInEasing), + label = "EmojiPanelHeight" + ) + + Box( modifier = Modifier .fillMaxWidth() - .height(emojiPanelHeight) - ) - } + .height(animatedHeight) + .clipToBounds() + ) { + if (showEmojiPicker) { + AppleEmojiPickerPanel( + isDarkTheme = isDarkTheme, + onEmojiSelected = { emoji -> + onValueChange(value + emoji) + }, + onClose = { + showEmojiPicker = false + }, + modifier = Modifier + .fillMaxWidth() + .height(emojiPanelHeight) + ) + } + } } // End of if (!isBlocked) for emoji picker } }