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(
modifier =
Modifier.fillMaxWidth().pointerInput(Unit) {
// 🔥 Кастомная обработка жестов с определением направления
// Это предотвращает конфликт между swipe-to-reply и вертикальным скроллом
awaitEachGesture {
val down = awaitFirstDown(requireUnconsumed = false)
var isDragStarted = false
var isHorizontalDrag = false
val touchSlop = 20f // Минимальное смещение для определения направления
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) {
// 🔥 Простой горизонтальный свайп для reply
// Используем detectHorizontalDragGestures который лучше работает со скроллом
detectHorizontalDragGestures(
onDragStart = { },
onDragEnd = {
// Если свайпнули достаточно вправо - reply
if (swipeOffset >= swipeThreshold) {
onSwipeToReply()
}
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(
modifier =
Modifier.align(Alignment.CenterEnd).padding(end = 16.dp).graphicsLayer {
Modifier.align(Alignment.CenterStart).padding(start = 16.dp).graphicsLayer {
alpha = swipeProgress
scaleX = swipeProgress
scaleY = swipeProgress