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 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()