fix: simplify horizontal swipe gesture for reply functionality in MessageBubble

This commit is contained in:
k1ngsterr1
2026-02-03 04:19:20 +05:00
parent c9c4cb65fc
commit 3953f66986

View File

@@ -308,54 +308,35 @@ fun MessageBubble(
Box( Box(
modifier = modifier =
Modifier.fillMaxWidth().pointerInput(Unit) { Modifier.fillMaxWidth().pointerInput(Unit) {
// 🔥 Кастомная обработка жестов с определением направления // 🔥 Простой горизонтальный свайп для reply
// Это предотвращает конфликт между swipe-to-reply и вертикальным скроллом // Используем detectHorizontalDragGestures который лучше работает со скроллом
awaitEachGesture { detectHorizontalDragGestures(
val down = awaitFirstDown(requireUnconsumed = false) onDragStart = { },
var isDragStarted = false onDragEnd = {
var isHorizontalDrag = false // Если свайпнули достаточно вправо - reply
val touchSlop = 20f // Минимальное смещение для определения направления if (swipeOffset >= swipeThreshold) {
var totalX = 0f
var totalY = 0f
do {
val event = awaitPointerEvent()
val change = event.changes.firstOrNull() ?: break
if (!isDragStarted) {
// Определяем направление по первым движениям
totalX += change.positionChange().x
totalY += change.positionChange().y
if (abs(totalX) > touchSlop || abs(totalY) > touchSlop) {
isDragStarted = true
// Горизонтальный свайп только если X > Y и свайп влево
isHorizontalDrag = abs(totalX) > abs(totalY) * 1.5f && totalX < 0
}
}
if (isDragStarted && isHorizontalDrag) {
// Перехватываем только горизонтальные жесты влево
change.consume()
val dragAmount = change.positionChange().x
val newOffset = swipeOffset + dragAmount
swipeOffset = newOffset.coerceIn(-maxSwipe, 0f)
}
} while (event.changes.any { it.pressed })
// onDragEnd
if (isHorizontalDrag && swipeOffset <= -swipeThreshold) {
onSwipeToReply() onSwipeToReply()
} }
swipeOffset = 0f swipeOffset = 0f
},
onDragCancel = {
swipeOffset = 0f
},
onHorizontalDrag = { change, dragAmount ->
// Только свайп вправо (положительное значение)
if (dragAmount > 0 || swipeOffset > 0) {
change.consume()
val newOffset = swipeOffset + dragAmount
swipeOffset = newOffset.coerceIn(0f, maxSwipe)
} }
} }
)
}
) { ) {
// Reply icon // 🔥 Reply icon - слева, появляется при свайпе вправо
Box( Box(
modifier = modifier =
Modifier.align(Alignment.CenterEnd).padding(end = 16.dp).graphicsLayer { Modifier.align(Alignment.CenterStart).padding(start = 16.dp).graphicsLayer {
alpha = swipeProgress alpha = swipeProgress
scaleX = swipeProgress scaleX = swipeProgress
scaleY = swipeProgress scaleY = swipeProgress