pushdeer/android/app/src/main/java/com/pushdeer/os/ui/compose/componment/SwipeToDismissItem.kt

80 lines
2.9 KiB
Kotlin

package com.pushdeer.os.ui.compose.componment
import androidx.compose.animation.animateColorAsState
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Done
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.pushdeer.os.values.ConstValues
@ExperimentalMaterialApi
@Composable
fun SwipeToDismissItem(
onDismiss: () -> Unit,
sidePadding: Boolean = false,
content: @Composable RowScope.() -> Unit
) {
val dismissState = rememberDismissState()
if (dismissState.isDismissed(DismissDirection.EndToStart)) {
onDismiss()
}
Column(modifier = Modifier
.fillMaxWidth()
.padding(bottom = 16.dp)) {
SwipeToDismiss(
state = dismissState,
background = {
val direction = dismissState.dismissDirection ?: return@SwipeToDismiss
val color by animateColorAsState(
when (dismissState.targetValue) {
DismissValue.DismissedToEnd -> Color.Green
DismissValue.DismissedToStart -> Color.Red
else -> Color.Gray
}
)
val alignment = when (direction) {
DismissDirection.StartToEnd -> Alignment.CenterStart
DismissDirection.EndToStart -> Alignment.CenterEnd
}
val icon = when (direction) {
DismissDirection.StartToEnd -> Icons.Default.Done
DismissDirection.EndToStart -> Icons.Default.Delete
}
Box(
contentAlignment = alignment,
modifier = Modifier
.fillMaxSize()
.clip(RoundedCornerShape(4.dp))
.background(color)
.padding(end = 32.dp)
) {
Icon(
imageVector = icon,
contentDescription = "",
// tint = Color.Red
)
}
},
directions = setOf(DismissDirection.EndToStart, DismissDirection.EndToStart),
dismissThresholds = { direction ->
FractionalThreshold(if (direction == DismissDirection.EndToStart) 0.45f else 0.57f)
},
dismissContent = content,
modifier = Modifier.padding(horizontal = if (sidePadding) ConstValues.MainPageSidePadding else 0.dp)
)
}
}