feat: Adjust emoji panel display logic in MessageInputBar for smoother user experience
This commit is contained in:
@@ -28,6 +28,7 @@ import androidx.compose.ui.Alignment
|
|||||||
import androidx.compose.ui.ExperimentalComposeUiApi
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
|
import androidx.compose.ui.draw.clipToBounds
|
||||||
import androidx.compose.ui.unit.IntOffset
|
import androidx.compose.ui.unit.IntOffset
|
||||||
import androidx.compose.ui.draw.scale
|
import androidx.compose.ui.draw.scale
|
||||||
import androidx.compose.ui.draw.shadow
|
import androidx.compose.ui.draw.shadow
|
||||||
@@ -1552,10 +1553,14 @@ private fun MessageInputBar(
|
|||||||
showEmojiPicker = false
|
showEmojiPicker = false
|
||||||
// Клавиатура откроется автоматически т.к. фокус остался
|
// Клавиатура откроется автоматически т.к. фокус остался
|
||||||
} else {
|
} else {
|
||||||
// Закрываем клавиатуру но оставляем фокус
|
// Закрываем клавиатуру через IMM
|
||||||
keyboardController?.hide()
|
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||||
// Сразу показываем emoji panel (высота та же - нет прыжка)
|
imm.hideSoftInputFromWindow(view.windowToken, 0)
|
||||||
showEmojiPicker = true
|
// Небольшая задержка перед показом эмодзи для плавного перехода
|
||||||
|
scope.launch {
|
||||||
|
delay(50)
|
||||||
|
showEmojiPicker = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1761,26 +1766,36 @@ private fun MessageInputBar(
|
|||||||
}
|
}
|
||||||
} // End of else (not blocked)
|
} // End of else (not blocked)
|
||||||
|
|
||||||
// 🔥 APPLE EMOJI PICKER - с категориями и фоновой загрузкой
|
// 🔥 APPLE EMOJI PICKER - плавная анимация высоты
|
||||||
if (!isBlocked) {
|
if (!isBlocked) {
|
||||||
AnimatedVisibility(
|
// Анимируем высоту панели
|
||||||
visible = showEmojiPicker,
|
val animatedHeight by animateDpAsState(
|
||||||
enter = fadeIn(tween(150)),
|
targetValue = if (showEmojiPicker) emojiPanelHeight else 0.dp,
|
||||||
exit = fadeOut(tween(100))
|
animationSpec = tween(durationMillis = 250, easing = FastOutSlowInEasing),
|
||||||
) {
|
label = "EmojiPanelHeight"
|
||||||
AppleEmojiPickerPanel(
|
)
|
||||||
isDarkTheme = isDarkTheme,
|
|
||||||
onEmojiSelected = { emoji ->
|
Box(
|
||||||
onValueChange(value + emoji)
|
|
||||||
},
|
|
||||||
onClose = {
|
|
||||||
showEmojiPicker = false
|
|
||||||
},
|
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.height(emojiPanelHeight)
|
.height(animatedHeight)
|
||||||
)
|
.clipToBounds()
|
||||||
}
|
) {
|
||||||
|
if (showEmojiPicker) {
|
||||||
|
AppleEmojiPickerPanel(
|
||||||
|
isDarkTheme = isDarkTheme,
|
||||||
|
onEmojiSelected = { emoji ->
|
||||||
|
onValueChange(value + emoji)
|
||||||
|
},
|
||||||
|
onClose = {
|
||||||
|
showEmojiPicker = false
|
||||||
|
},
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.height(emojiPanelHeight)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
} // End of if (!isBlocked) for emoji picker
|
} // End of if (!isBlocked) for emoji picker
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user