fix: simplify horizontal swipe gesture for reply functionality in MessageBubble
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user