diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatsListScreen.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatsListScreen.kt index f2638f1..2645791 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatsListScreen.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatsListScreen.kt @@ -5,6 +5,10 @@ import androidx.compose.animation.* import androidx.compose.animation.core.* import androidx.compose.foundation.* import androidx.compose.foundation.gestures.detectHorizontalDragGestures +import androidx.compose.foundation.gestures.awaitEachGesture +import androidx.compose.foundation.gestures.awaitFirstDown +import androidx.compose.foundation.gestures.horizontalDrag +import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -25,6 +29,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.input.pointer.positionChange import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight @@ -173,6 +178,15 @@ fun ChatsListScreen( val focusManager = androidx.compose.ui.platform.LocalFocusManager.current val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val scope = rememberCoroutineScope() + + // 🔥 Перехватываем системный back gesture - не закрываем приложение + // Если drawer открыт - закрываем его, иначе игнорируем + BackHandler(enabled = true) { + if (drawerState.isOpen) { + scope.launch { drawerState.close() } + } + // Если drawer закрыт - ничего не делаем (не выходим из приложения) + } // 🔥 ВСЕГДА закрываем клавиатуру при появлении ChatsListScreen // Используем DisposableEffect чтобы срабатывало при каждом появлении экрана @@ -935,7 +949,9 @@ fun ChatsListScreen( val currentDialogs = chatsState.dialogs LazyColumn( - modifier = Modifier.fillMaxSize().background(listBackgroundColor) + modifier = Modifier + .fillMaxSize() + .background(listBackgroundColor) ) { if (requestsCount > 0) { item( @@ -1050,6 +1066,24 @@ fun ChatsListScreen( } } } // Close ModalNavigationDrawer + + // 🔥 Прозрачная зона слева для открытия drawer свайпом + // Расположена ПОВЕРХ всего контента + Box( + modifier = Modifier + .fillMaxHeight() + .width(40.dp) + .align(Alignment.CenterStart) + .pointerInput(drawerState) { + detectHorizontalDragGestures( + onHorizontalDrag = { _, dragAmount -> + if (dragAmount > 5) { + scope.launch { drawerState.open() } + } + } + ) + } + ) // 🔥 Confirmation Dialogs @@ -1575,11 +1609,8 @@ fun SwipeableDialogItem( .pointerInput(Unit) { detectHorizontalDragGestures( onDragEnd = { - // Если свайпнули больше чем на - // половину - фиксируем - if (kotlin.math.abs(offsetX) > - swipeWidthPx / 2 - ) { + // Если свайпнули больше чем на половину - фиксируем + if (kotlin.math.abs(offsetX) > swipeWidthPx / 2) { offsetX = -swipeWidthPx } else { offsetX = 0f @@ -1587,14 +1618,9 @@ fun SwipeableDialogItem( }, onDragCancel = { offsetX = 0f }, onHorizontalDrag = { _, dragAmount -> - // Только свайп влево (отрицательное - // значение) + // Только свайп влево (отрицательное значение) val newOffset = offsetX + dragAmount - offsetX = - newOffset.coerceIn( - -swipeWidthPx, - 0f - ) + offsetX = newOffset.coerceIn(-swipeWidthPx, 0f) } ) } 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 49d5458..ba5442a 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 @@ -405,9 +405,9 @@ fun MessageBubble( val combinedBackgroundColor = if (isSelected) selectionBackgroundColor else highlightBackgroundColor - // Динамические отступы: больше между группами, меньше внутри группы - val topPadding = if (isGroupStart) 8.dp else 2.dp - val bottomPadding = 2.dp + // 🔥 Telegram-style отступы: минимальные внутри группы, чуть больше между группами + val topPadding = if (isGroupStart) 6.dp else 1.dp + val bottomPadding = 1.dp Row( modifier =