mirror of
https://github.com/Aviortheking/Neo-Store.git
synced 2025-04-23 19:32:16 +00:00
Move Category List to different file
This commit is contained in:
parent
79c3157a98
commit
bb2228b9cb
@ -0,0 +1,142 @@
|
|||||||
|
package com.looker.droidify.ui.compose.pages.home.components
|
||||||
|
|
||||||
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
|
import androidx.compose.animation.animateColor
|
||||||
|
import androidx.compose.animation.core.*
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.foundation.lazy.LazyRow
|
||||||
|
import androidx.compose.foundation.lazy.items
|
||||||
|
import androidx.compose.foundation.selection.toggleable
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.material.Icon
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Done
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.graphics.graphicsLayer
|
||||||
|
import androidx.compose.ui.unit.Dp
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
||||||
|
private enum class SelectionState { Unselected, Selected }
|
||||||
|
|
||||||
|
private class CategoryChipTransition(
|
||||||
|
cornerRadius: State<Dp>,
|
||||||
|
contentColor: State<Color>,
|
||||||
|
checkScale: State<Float>
|
||||||
|
) {
|
||||||
|
val cornerRadius by cornerRadius
|
||||||
|
val contentColor by contentColor
|
||||||
|
val checkScale by checkScale
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun categoryChipTransition(selected: Boolean): CategoryChipTransition {
|
||||||
|
val transition = updateTransition(
|
||||||
|
targetState = if (selected) SelectionState.Selected else SelectionState.Unselected,
|
||||||
|
label = "chip_transition"
|
||||||
|
)
|
||||||
|
val corerRadius = transition.animateDp(label = "chip_corner") { state ->
|
||||||
|
when (state) {
|
||||||
|
SelectionState.Unselected -> 10.dp
|
||||||
|
SelectionState.Selected -> 28.dp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val contentColor = transition.animateColor(label = "chip_content_alpha") { state ->
|
||||||
|
when (state) {
|
||||||
|
SelectionState.Unselected -> MaterialTheme.colorScheme.surface
|
||||||
|
SelectionState.Selected -> MaterialTheme.colorScheme.inversePrimary.copy(alpha = 0.8f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val checkScale = transition.animateFloat(
|
||||||
|
label = "chip_check_scale",
|
||||||
|
transitionSpec = {
|
||||||
|
spring(
|
||||||
|
dampingRatio = Spring.DampingRatioHighBouncy,
|
||||||
|
stiffness = Spring.StiffnessLow
|
||||||
|
)
|
||||||
|
}
|
||||||
|
) { state ->
|
||||||
|
when (state) {
|
||||||
|
SelectionState.Unselected -> 0.6f
|
||||||
|
SelectionState.Selected -> 1f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return remember(transition) {
|
||||||
|
CategoryChipTransition(corerRadius, contentColor, checkScale)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun CategoryChip(
|
||||||
|
category: String,
|
||||||
|
isSelected: Boolean = false,
|
||||||
|
onSelected: (Boolean) -> Unit = {}
|
||||||
|
) {
|
||||||
|
val categoryChipTransitionState = categoryChipTransition(selected = isSelected)
|
||||||
|
|
||||||
|
Surface(
|
||||||
|
modifier = Modifier
|
||||||
|
.graphicsLayer {
|
||||||
|
shape = RoundedCornerShape(categoryChipTransitionState.cornerRadius)
|
||||||
|
clip = true
|
||||||
|
},
|
||||||
|
color = categoryChipTransitionState.contentColor
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.toggleable(value = isSelected, onValueChange = onSelected)
|
||||||
|
.padding(horizontal = 4.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
AnimatedVisibility(visible = isSelected) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Filled.Done,
|
||||||
|
contentDescription = null,
|
||||||
|
tint = MaterialTheme.colorScheme.onSurface,
|
||||||
|
modifier = Modifier
|
||||||
|
.wrapContentSize()
|
||||||
|
.graphicsLayer {
|
||||||
|
scaleX = categoryChipTransitionState.checkScale
|
||||||
|
scaleY = categoryChipTransitionState.checkScale
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Text(
|
||||||
|
text = category,
|
||||||
|
style = MaterialTheme.typography.labelLarge,
|
||||||
|
modifier = Modifier.padding(8.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun CategoryChipList(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
list: List<String>,
|
||||||
|
onClick: (String) -> Unit
|
||||||
|
) {
|
||||||
|
var selected by remember { mutableStateOf(list[0]) }
|
||||||
|
|
||||||
|
LazyRow(
|
||||||
|
modifier = modifier.height(54.dp),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
|
contentPadding = PaddingValues(horizontal = 8.dp)
|
||||||
|
) {
|
||||||
|
items(list) { category ->
|
||||||
|
CategoryChip(
|
||||||
|
category = category,
|
||||||
|
isSelected = category == selected,
|
||||||
|
onSelected = {
|
||||||
|
selected = category
|
||||||
|
onClick(selected)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user