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 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()
|
||||||
|
|||||||
Reference in New Issue
Block a user