mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-18 04:27:02 +05:30
Make saving a swipe dismiss action
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
bb8c07f232
commit
8c162c75c5
4 changed files with 87 additions and 21 deletions
|
@ -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()
|
||||
}
|
||||
AnimatedSwipeDismiss(
|
||||
item = item,
|
||||
background = {},
|
||||
content = {
|
||||
LobstersItem(
|
||||
post = item,
|
||||
linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) },
|
||||
commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) },
|
||||
saveAction = saveAction,
|
||||
)
|
||||
},
|
||||
onDismiss = saveAction,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 = {})
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ->
|
||||
AnimatedSwipeDismiss(
|
||||
item = item,
|
||||
background = {},
|
||||
content = {
|
||||
LobstersItem(
|
||||
post = item,
|
||||
linkOpenAction = { post -> urlLauncher.launch(post.url.ifEmpty { post.commentsUrl }) },
|
||||
commentOpenAction = { post -> urlLauncher.launch(post.commentsUrl) },
|
||||
saveAction = saveAction,
|
||||
)
|
||||
},
|
||||
onDismiss = saveAction,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 <T> AnimatedSwipeDismiss(
|
||||
modifier: Modifier = Modifier,
|
||||
item: T,
|
||||
background: @Composable (isDismissed: Boolean) -> Unit,
|
||||
content: @Composable (isDismissed: Boolean) -> Unit,
|
||||
directions: Set<DismissDirection> = 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) }
|
||||
)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue