feat: Add emoji picker functionality and dynamic padding in ChatDetailScreen

This commit is contained in:
k1ngsterr1
2026-01-13 03:15:47 +05:00
parent 0e88c52ffc
commit fa2fc98ca0

View File

@@ -211,8 +211,16 @@ fun ChatDetailScreen(
val imeHeight = with(density) { imeInsets.getBottom(density).toDp() } val imeHeight = with(density) { imeInsets.getBottom(density).toDp() }
val isKeyboardVisible = imeHeight > 0.dp val isKeyboardVisible = imeHeight > 0.dp
// Динамический bottom padding для списка: инпут (~70dp) + клавиатура // 🔥 Emoji picker state (поднят из MessageInputBar для KeyboardAvoidingView)
val listBottomPadding = if (isKeyboardVisible) 70.dp + imeHeight else 100.dp 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 // Telegram-style scroll tracking
var wasManualScroll by remember { mutableStateOf(false) } var wasManualScroll by remember { mutableStateOf(false) }
@@ -675,10 +683,9 @@ fun ChatDetailScreen(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(paddingValues) .padding(paddingValues)
.imePadding() // KeyboardAvoidingView equivalent
) { ) {
// Список сообщений - занимает весь экран // Список сообщений - динамический padding для клавиатуры/эмодзи
Box(modifier = Modifier.fillMaxSize().padding(bottom = 70.dp)) { Box(modifier = Modifier.fillMaxSize().padding(bottom = listBottomPadding)) {
if (messages.isEmpty()) { if (messages.isEmpty()) {
// Пустое состояние // Пустое состояние
Column( Column(
@@ -925,7 +932,10 @@ fun ChatDetailScreen(
isForwardMode = isForwardMode, isForwardMode = isForwardMode,
onCloseReply = { viewModel.clearReplyMessages() }, onCloseReply = { viewModel.clearReplyMessages() },
chatTitle = chatTitle, 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, isForwardMode: Boolean = false,
onCloseReply: () -> Unit = {}, onCloseReply: () -> Unit = {},
chatTitle: String = "", chatTitle: String = "",
isBlocked: Boolean = false isBlocked: Boolean = false,
// Emoji picker state (поднят для KeyboardAvoidingView)
showEmojiPicker: Boolean = false,
onToggleEmojiPicker: (Boolean) -> Unit = {}
) { ) {
val hasReply = replyMessages.isNotEmpty() val hasReply = replyMessages.isNotEmpty()
var showEmojiPicker by remember { mutableStateOf(false) }
val keyboardController = LocalSoftwareKeyboardController.current val keyboardController = LocalSoftwareKeyboardController.current
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
@@ -1566,7 +1578,7 @@ private fun MessageInputBar(
// 🔥 Закрываем эмодзи панель когда клавиатура открывается // 🔥 Закрываем эмодзи панель когда клавиатура открывается
LaunchedEffect(isKeyboardVisible) { LaunchedEffect(isKeyboardVisible) {
if (isKeyboardVisible && showEmojiPicker) { if (isKeyboardVisible && showEmojiPicker) {
showEmojiPicker = false onToggleEmojiPicker(false)
} }
} }
@@ -1581,7 +1593,7 @@ private fun MessageInputBar(
fun toggleEmojiPicker() { fun toggleEmojiPicker() {
if (showEmojiPicker) { if (showEmojiPicker) {
// Закрываем emoji picker и открываем клавиатуру // Закрываем emoji picker и открываем клавиатуру
showEmojiPicker = false onToggleEmojiPicker(false)
// Клавиатура откроется автоматически т.к. фокус остался // Клавиатура откроется автоматически т.к. фокус остался
} else { } else {
// Закрываем клавиатуру через IMM // Закрываем клавиатуру через IMM
@@ -1590,7 +1602,7 @@ private fun MessageInputBar(
// Небольшая задержка перед показом эмодзи для плавного перехода // Небольшая задержка перед показом эмодзи для плавного перехода
scope.launch { scope.launch {
delay(50) delay(50)
showEmojiPicker = true onToggleEmojiPicker(true)
} }
} }
} }
@@ -1762,7 +1774,7 @@ private fun MessageInputBar(
) { ) {
// При клике на инпут - закрываем эмодзи панель, клавиатура откроется автоматически // При клике на инпут - закрываем эмодзи панель, клавиатура откроется автоматически
if (showEmojiPicker) { if (showEmojiPicker) {
showEmojiPicker = false onToggleEmojiPicker(false)
} }
} }
.padding(horizontal = 12.dp, vertical = 8.dp), .padding(horizontal = 12.dp, vertical = 8.dp),
@@ -1852,7 +1864,7 @@ private fun MessageInputBar(
onValueChange(value + emoji) onValueChange(value + emoji)
}, },
onClose = { onClose = {
showEmojiPicker = false onToggleEmojiPicker(false)
}, },
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()