From 3953f66986cf581f92570392449d744cbd7b8a6a Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Tue, 3 Feb 2026 04:19:20 +0500 Subject: [PATCH] fix: simplify horizontal swipe gesture for reply functionality in MessageBubble --- .../chats/components/ChatDetailComponents.kt | 59 +++++++------------ 1 file changed, 20 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt index b0e964d..8a0ac26 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/components/ChatDetailComponents.kt @@ -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 - } + // 🔥 Простой горизонтальный свайп для reply + // Используем detectHorizontalDragGestures который лучше работает со скроллом + detectHorizontalDragGestures( + onDragStart = { }, + onDragEnd = { + // Если свайпнули достаточно вправо - reply + if (swipeOffset >= swipeThreshold) { + onSwipeToReply() } - - if (isDragStarted && isHorizontalDrag) { - // Перехватываем только горизонтальные жесты влево + swipeOffset = 0f + }, + onDragCancel = { + swipeOffset = 0f + }, + onHorizontalDrag = { change, dragAmount -> + // Только свайп вправо (положительное значение) + if (dragAmount > 0 || swipeOffset > 0) { change.consume() - val dragAmount = change.positionChange().x val newOffset = swipeOffset + dragAmount - swipeOffset = newOffset.coerceIn(-maxSwipe, 0f) + swipeOffset = newOffset.coerceIn(0f, maxSwipe) } - } while (event.changes.any { it.pressed }) - - // onDragEnd - if (isHorizontalDrag && swipeOffset <= -swipeThreshold) { - onSwipeToReply() } - swipeOffset = 0f - } + ) } ) { - // 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