From 94c6c9349a1300cd968768d85b64632b17b62e8f Mon Sep 17 00:00:00 2001 From: Diego Beraldin Date: Thu, 7 Mar 2024 14:09:11 +0100 Subject: [PATCH] fix: no fling swipe to dismiss workaround (#577) --- .../commonui/components/SwipeActionCard.kt | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/core/commonui/components/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/components/SwipeActionCard.kt b/core/commonui/components/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/components/SwipeActionCard.kt index 461438003..ef07e3a03 100644 --- a/core/commonui/components/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/components/SwipeActionCard.kt +++ b/core/commonui/components/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/components/SwipeActionCard.kt @@ -5,22 +5,24 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SwipeToDismissBox +import androidx.compose.material3.SwipeToDismissBoxDefaults +import androidx.compose.material3.SwipeToDismissBoxState import androidx.compose.material3.SwipeToDismissBoxValue -import androidx.compose.material3.rememberSwipeToDismissBoxState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallbackArgs import kotlinx.coroutines.flow.launchIn @@ -35,7 +37,7 @@ data class SwipeAction( val onTriggered: () -> Unit, ) -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun SwipeActionCard( modifier: Modifier = Modifier, @@ -50,7 +52,7 @@ fun SwipeActionCard( var secondNotified by remember { mutableStateOf(false) } val gestureBeginCallback by rememberUpdatedState(onGestureBegin) var lastProgress by remember { mutableStateOf(0.0f) } - val dismissState = rememberSwipeToDismissBoxState( + val dismissState = rememberNoFlingSwipeToDismissBoxState( confirmValueChange = rememberCallbackArgs { value -> when (value) { SwipeToDismissBoxValue.StartToEnd -> { @@ -162,4 +164,34 @@ fun SwipeActionCard( } else { content() } -} \ No newline at end of file +} + +/** + * CREDITS: + * https://issuetracker.google.com/issues/252334353#comment16 + */ +@Composable +@ExperimentalMaterial3Api +private fun rememberNoFlingSwipeToDismissBoxState( + initialValue: SwipeToDismissBoxValue = SwipeToDismissBoxValue.Settled, + confirmValueChange: (SwipeToDismissBoxValue) -> Boolean = { true }, + positionalThreshold: (totalDistance: Float) -> Float = + SwipeToDismissBoxDefaults.positionalThreshold, +): SwipeToDismissBoxState { + // instead of LocalDensity.current we use a value that makes velocityThreshold to skyrocket + val density = Density(Float.POSITIVE_INFINITY) + return rememberSaveable( + saver = SwipeToDismissBoxState.Saver( + confirmValueChange = confirmValueChange, + density = density, + positionalThreshold = positionalThreshold + ) + ) { + SwipeToDismissBoxState( + initialValue = initialValue, + density = density, + confirmValueChange = confirmValueChange, + positionalThreshold = positionalThreshold + ) + } +}