feat: Add emoji picker functionality and dynamic padding in ChatDetailScreen
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user