Skip to content

Commit 27ba312

Browse files
Merge pull request #550 from angeles-bilbao6/jetsnack-filter-page
[Jetsnack] Add filter screen
2 parents 2c7ca8d + 7e7fa06 commit 27ba312

File tree

10 files changed

+384
-19
lines changed

10 files changed

+384
-19
lines changed

Jetsnack/app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ dependencies {
106106

107107
implementation Libs.Accompanist.insets
108108
implementation Libs.Accompanist.systemuicontroller
109+
implementation Libs.Accompanist.flowlayouts
109110

110111
implementation Libs.Coil.coilCompose
111112

Jetsnack/app/src/main/java/com/example/jetsnack/model/Filter.kt

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,53 @@
1616

1717
package com.example.jetsnack.model
1818

19+
import androidx.compose.material.icons.Icons
20+
import androidx.compose.material.icons.filled.Android
21+
import androidx.compose.material.icons.filled.SortByAlpha
22+
import androidx.compose.material.icons.filled.Star
1923
import androidx.compose.runtime.Stable
2024
import androidx.compose.runtime.mutableStateOf
25+
import androidx.compose.ui.graphics.vector.ImageVector
2126

2227
@Stable
2328
class Filter(
2429
val name: String,
25-
enabled: Boolean = false
30+
enabled: Boolean = false,
31+
val icon: ImageVector? = null
2632
) {
2733
val enabled = mutableStateOf(enabled)
2834
}
29-
3035
val filters = listOf(
3136
Filter(name = "Organic"),
3237
Filter(name = "Gluten-free"),
3338
Filter(name = "Dairy-free"),
3439
Filter(name = "Sweet"),
3540
Filter(name = "Savory")
3641
)
42+
val priceFilters = listOf(
43+
Filter(name = "$"),
44+
Filter(name = "$$"),
45+
Filter(name = "$$$"),
46+
Filter(name = "$$$$")
47+
)
48+
val sortFilters = listOf(
49+
Filter(name = "Android's favorite (default)", icon = Icons.Filled.Android),
50+
Filter(name = "Rating", icon = Icons.Filled.Star),
51+
Filter(name = "Alphabetical", icon = Icons.Filled.SortByAlpha)
52+
)
53+
54+
val categoryFilters = listOf(
55+
Filter(name = "Chips & crackers"),
56+
Filter(name = "Fruit snacks"),
57+
Filter(name = "Desserts"),
58+
Filter(name = "Nuts")
59+
)
60+
val lifeStyleFilters = listOf(
61+
Filter(name = "Organic"),
62+
Filter(name = "Gluten-free"),
63+
Filter(name = "Dairy-free"),
64+
Filter(name = "Sweet"),
65+
Filter(name = "Savory")
66+
)
67+
68+
var sortDefault = sortFilters.get(0).name

Jetsnack/app/src/main/java/com/example/jetsnack/model/SnackCollection.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ object SnackRepo {
3737
fun getRelated(@Suppress("UNUSED_PARAMETER") snackId: Long) = related
3838
fun getInspiredByCart() = inspiredByCart
3939
fun getFilters() = filters
40+
fun getPriceFilters() = priceFilters
4041
fun getCart() = cart
42+
fun getSortFilters() = sortFilters
43+
fun getCategoryFilters() = categoryFilters
44+
fun getSortDefault() = sortDefault
45+
fun getLifeStyleFilters() = lifeStyleFilters
4146
}
4247

4348
/**

Jetsnack/app/src/main/java/com/example/jetsnack/ui/components/Filters.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,19 @@ import com.example.jetsnack.model.Filter
5252
import com.example.jetsnack.ui.theme.JetsnackTheme
5353

5454
@Composable
55-
fun FilterBar(filters: List<Filter>) {
55+
fun FilterBar(
56+
filters: List<Filter>,
57+
onShowFilters: () -> Unit
58+
) {
59+
5660
LazyRow(
5761
verticalAlignment = Alignment.CenterVertically,
5862
horizontalArrangement = Arrangement.spacedBy(8.dp),
5963
contentPadding = PaddingValues(start = 12.dp, end = 8.dp),
6064
modifier = Modifier.heightIn(min = 56.dp)
6165
) {
6266
item {
63-
IconButton(onClick = { /* todo */ }) {
67+
IconButton(onClick = onShowFilters) {
6468
Icon(
6569
imageVector = Icons.Rounded.FilterList,
6670
tint = JetsnackTheme.colors.brand,
@@ -73,7 +77,7 @@ fun FilterBar(filters: List<Filter>) {
7377
}
7478
}
7579
items(filters) { filter ->
76-
FilterChip(filter)
80+
FilterChip(filter = filter, shape = MaterialTheme.shapes.small)
7781
}
7882
}
7983
}

Jetsnack/app/src/main/java/com/example/jetsnack/ui/home/Feed.kt

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,26 @@
1717
package com.example.jetsnack.ui.home
1818

1919
import android.content.res.Configuration
20+
import androidx.compose.animation.AnimatedVisibility
21+
import androidx.compose.animation.ExperimentalAnimationApi
22+
import androidx.compose.animation.expandVertically
23+
import androidx.compose.animation.fadeIn
24+
import androidx.compose.animation.fadeOut
25+
import androidx.compose.animation.shrinkVertically
26+
import androidx.compose.animation.slideInVertically
27+
import androidx.compose.animation.slideOutVertically
2028
import androidx.compose.foundation.layout.Box
2129
import androidx.compose.foundation.layout.Spacer
2230
import androidx.compose.foundation.layout.fillMaxSize
2331
import androidx.compose.foundation.lazy.LazyColumn
2432
import androidx.compose.foundation.lazy.itemsIndexed
2533
import androidx.compose.runtime.Composable
34+
import androidx.compose.runtime.getValue
35+
import androidx.compose.runtime.mutableStateOf
2636
import androidx.compose.runtime.remember
37+
import androidx.compose.runtime.saveable.rememberSaveable
38+
import androidx.compose.runtime.setValue
39+
import androidx.compose.ui.Alignment
2740
import androidx.compose.ui.Modifier
2841
import androidx.compose.ui.tooling.preview.Preview
2942
import androidx.compose.ui.unit.dp
@@ -59,6 +72,7 @@ private fun Feed(
5972
onSnackClick: (Long) -> Unit,
6073
modifier: Modifier = Modifier
6174
) {
75+
6276
JetsnackSurface(modifier = modifier.fillMaxSize()) {
6377
Box {
6478
SnackCollectionList(snackCollections, filters, onSnackClick)
@@ -67,29 +81,46 @@ private fun Feed(
6781
}
6882
}
6983

84+
@OptIn(ExperimentalAnimationApi::class)
7085
@Composable
7186
private fun SnackCollectionList(
7287
snackCollections: List<SnackCollection>,
7388
filters: List<Filter>,
7489
onSnackClick: (Long) -> Unit,
7590
modifier: Modifier = Modifier
7691
) {
77-
LazyColumn(modifier) {
78-
item {
79-
Spacer(Modifier.statusBarsHeight(additional = 56.dp))
80-
FilterBar(filters)
81-
}
82-
itemsIndexed(snackCollections) { index, snackCollection ->
83-
if (index > 0) {
84-
JetsnackDivider(thickness = 2.dp)
92+
var filtersVisible by rememberSaveable { mutableStateOf(false) }
93+
Box(modifier) {
94+
LazyColumn {
95+
96+
item {
97+
Spacer(Modifier.statusBarsHeight(additional = 56.dp))
98+
FilterBar(filters, onShowFilters = { filtersVisible = true })
99+
}
100+
itemsIndexed(snackCollections) { index, snackCollection ->
101+
if (index > 0) {
102+
JetsnackDivider(thickness = 2.dp)
103+
}
104+
105+
SnackCollection(
106+
snackCollection = snackCollection,
107+
onSnackClick = onSnackClick,
108+
index = index
109+
)
85110
}
86-
SnackCollection(
87-
snackCollection = snackCollection,
88-
onSnackClick = onSnackClick,
89-
index = index
90-
)
91111
}
92112
}
113+
AnimatedVisibility(
114+
visible = filtersVisible,
115+
enter = slideInVertically() + expandVertically(
116+
expandFrom = Alignment.Top
117+
) + fadeIn(initialAlpha = 0.3f),
118+
exit = slideOutVertically() + shrinkVertically() + fadeOut()
119+
) {
120+
FilterScreen(
121+
onDismiss = { filtersVisible = false }
122+
)
123+
}
93124
}
94125

95126
@Preview("default")

0 commit comments

Comments
 (0)