From fa2fc98ca0ee7c0b2c42d2a90256193f5d9a6f66 Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Tue, 13 Jan 2026 03:15:47 +0500 Subject: [PATCH] feat: Add emoji picker functionality and dynamic padding in ChatDetailScreen --- .../messenger/ui/chats/ChatDetailScreen.kt | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 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 9e958b9..b2c4c4f 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 @@ -211,8 +211,16 @@ fun ChatDetailScreen( val imeHeight = with(density) { imeInsets.getBottom(density).toDp() } val isKeyboardVisible = imeHeight > 0.dp - // Динамический bottom padding для списка: инпут (~70dp) + клавиатура - val listBottomPadding = if (isKeyboardVisible) 70.dp + imeHeight else 100.dp + // 🔥 Emoji picker state (поднят из MessageInputBar для KeyboardAvoidingView) + var showEmojiPicker by remember { mutableStateOf(false) } + val emojiPanelHeight = if (imeHeight > 50.dp) imeHeight else 280.dp + + // Динамический bottom padding для списка: инпут (~70dp) + клавиатура/эмодзи + val listBottomPadding = when { + isKeyboardVisible -> 70.dp + imeHeight + showEmojiPicker -> 70.dp + emojiPanelHeight + else -> 100.dp + } // Telegram-style scroll tracking var wasManualScroll by remember { mutableStateOf(false) } @@ -675,10 +683,9 @@ fun ChatDetailScreen( modifier = Modifier .fillMaxSize() .padding(paddingValues) - .imePadding() // KeyboardAvoidingView equivalent ) { - // Список сообщений - занимает весь экран - Box(modifier = Modifier.fillMaxSize().padding(bottom = 70.dp)) { + // Список сообщений - динамический padding для клавиатуры/эмодзи + Box(modifier = Modifier.fillMaxSize().padding(bottom = listBottomPadding)) { if (messages.isEmpty()) { // Пустое состояние Column( @@ -925,7 +932,10 @@ fun ChatDetailScreen( isForwardMode = isForwardMode, onCloseReply = { viewModel.clearReplyMessages() }, chatTitle = chatTitle, - isBlocked = isBlocked + isBlocked = isBlocked, + // Emoji picker state (поднят для KeyboardAvoidingView) + showEmojiPicker = showEmojiPicker, + onToggleEmojiPicker = { showEmojiPicker = it } ) } @@ -1538,10 +1548,12 @@ private fun MessageInputBar( isForwardMode: Boolean = false, onCloseReply: () -> Unit = {}, chatTitle: String = "", - isBlocked: Boolean = false + isBlocked: Boolean = false, + // Emoji picker state (поднят для KeyboardAvoidingView) + showEmojiPicker: Boolean = false, + onToggleEmojiPicker: (Boolean) -> Unit = {} ) { val hasReply = replyMessages.isNotEmpty() - var showEmojiPicker by remember { mutableStateOf(false) } val keyboardController = LocalSoftwareKeyboardController.current val focusManager = LocalFocusManager.current val interactionSource = remember { MutableInteractionSource() } @@ -1566,7 +1578,7 @@ private fun MessageInputBar( // 🔥 Закрываем эмодзи панель когда клавиатура открывается LaunchedEffect(isKeyboardVisible) { if (isKeyboardVisible && showEmojiPicker) { - showEmojiPicker = false + onToggleEmojiPicker(false) } } @@ -1581,7 +1593,7 @@ private fun MessageInputBar( fun toggleEmojiPicker() { if (showEmojiPicker) { // Закрываем emoji picker и открываем клавиатуру - showEmojiPicker = false + onToggleEmojiPicker(false) // Клавиатура откроется автоматически т.к. фокус остался } else { // Закрываем клавиатуру через IMM @@ -1590,7 +1602,7 @@ private fun MessageInputBar( // Небольшая задержка перед показом эмодзи для плавного перехода scope.launch { delay(50) - showEmojiPicker = true + onToggleEmojiPicker(true) } } } @@ -1762,7 +1774,7 @@ private fun MessageInputBar( ) { // При клике на инпут - закрываем эмодзи панель, клавиатура откроется автоматически if (showEmojiPicker) { - showEmojiPicker = false + onToggleEmojiPicker(false) } } .padding(horizontal = 12.dp, vertical = 8.dp), @@ -1852,7 +1864,7 @@ private fun MessageInputBar( onValueChange(value + emoji) }, onClose = { - showEmojiPicker = false + onToggleEmojiPicker(false) }, modifier = Modifier .fillMaxWidth()