diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt index 6b040842..91ac21ca 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/HottestPosts.kt @@ -8,6 +8,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncherAmbient +import dev.msfjarvis.lobsters.util.AnimatedSwipeDismiss @Composable fun HottestPosts( @@ -30,11 +31,17 @@ fun HottestPosts( if (posts.lastIndex == index) { overscrollAction.invoke() } - LobstersItem( - post = item, - linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) }, - commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) }, - saveAction = saveAction, + AnimatedSwipeDismiss( + item = item, + background = {}, + content = { + LobstersItem( + post = item, + linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) }, + commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) }, + ) + }, + onDismiss = saveAction, ) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt index ec994581..c84d8abd 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt @@ -13,8 +13,6 @@ import androidx.compose.foundation.lazy.LazyColumnFor import androidx.compose.foundation.lazy.LazyItemScope import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -36,10 +34,8 @@ fun LazyItemScope.LobstersItem( modifier: Modifier = Modifier, linkOpenAction: (LobstersPost) -> Unit, commentOpenAction: (LobstersPost) -> Unit, - saveAction: (LobstersPost) -> Unit, ) { - val liked = remember { mutableStateOf(false) } - val titleColor = if (post.isLiked || liked.value) savedTitleColor else titleColor + val titleColor = if (post.isLiked) savedTitleColor else titleColor Column( modifier = modifier @@ -47,11 +43,6 @@ fun LazyItemScope.LobstersItem( .clickable( onClick = { linkOpenAction.invoke(post) }, onLongClick = { commentOpenAction.invoke(post) }, - onDoubleClick = { - post.isLiked = true - liked.value = true - saveAction.invoke(post) - }, ), ) { Text( @@ -128,7 +119,7 @@ fun PreviewLobstersItem() { post = item, linkOpenAction = {}, commentOpenAction = {}, - saveAction = {}) + ) } } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt index 4765aed5..f15c8073 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt @@ -8,6 +8,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncherAmbient +import dev.msfjarvis.lobsters.util.AnimatedSwipeDismiss @Composable fun SavedPosts( @@ -26,11 +27,17 @@ fun SavedPosts( state = listState, modifier = Modifier.padding(horizontal = 8.dp).then(modifier) ) { item -> - LobstersItem( - post = item, - linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) }, - commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) }, - saveAction = saveAction, + AnimatedSwipeDismiss( + item = item, + background = {}, + content = { + LobstersItem( + post = item, + linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) }, + commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) }, + ) + }, + onDismiss = saveAction, ) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/util/AnimatedSwipeDismiss.kt b/app/src/main/java/dev/msfjarvis/lobsters/util/AnimatedSwipeDismiss.kt new file mode 100644 index 00000000..963a8a0a --- /dev/null +++ b/app/src/main/java/dev/msfjarvis/lobsters/util/AnimatedSwipeDismiss.kt @@ -0,0 +1,61 @@ +package dev.msfjarvis.lobsters.util + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.core.tween +import androidx.compose.animation.expandVertically +import androidx.compose.animation.shrinkVertically +import androidx.compose.material.DismissDirection +import androidx.compose.material.DismissValue +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.SwipeToDismiss +import androidx.compose.material.rememberDismissState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.onCommit +import androidx.compose.ui.Modifier + +/** + * Imported from Brandon McAnsh's [Gist](https://gist.github.com/bmc08gt/fca95db3bf9fcf255d76f03ec10ea3f9). + */ +@OptIn(ExperimentalAnimationApi::class, ExperimentalMaterialApi::class) +@Composable +fun AnimatedSwipeDismiss( + modifier: Modifier = Modifier, + item: T, + background: @Composable (isDismissed: Boolean) -> Unit, + content: @Composable (isDismissed: Boolean) -> Unit, + directions: Set = setOf(DismissDirection.StartToEnd, DismissDirection.EndToStart), + enter: EnterTransition = expandVertically(), + exit: ExitTransition = shrinkVertically( + animSpec = tween( + durationMillis = 500, + ) + ), + onDismiss: (T) -> Unit +) { + val dismissState = rememberDismissState() + val isDismissed = dismissState.isDismissed(DismissDirection.EndToStart) + + onCommit(dismissState.value) { + if (dismissState.value == DismissValue.DismissedToStart) { + onDismiss(item) + } + } + + AnimatedVisibility( + modifier = modifier, + visible = !isDismissed, + enter = enter, + exit = exit + ) { + SwipeToDismiss( + modifier = modifier, + state = dismissState, + directions = directions, + background = { background(isDismissed) }, + dismissContent = { content(isDismissed) } + ) + } +}