Skip to content

Commit a3f36fa

Browse files
committed
Remove pingAgain, improve error state handling, ensure filter row state remembered, fix resetFilter
1 parent 2142501 commit a3f36fa

File tree

5 files changed

+172
-164
lines changed

5 files changed

+172
-164
lines changed

app/src/main/java/com/cornellappdev/android/eatery/ui/components/general/FilterRow.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import androidx.compose.foundation.layout.PaddingValues
77
import androidx.compose.foundation.layout.Spacer
88
import androidx.compose.foundation.layout.size
99
import androidx.compose.foundation.lazy.LazyListScope
10+
import androidx.compose.foundation.lazy.LazyListState
1011
import androidx.compose.foundation.lazy.LazyRow
1112
import androidx.compose.foundation.lazy.items
13+
import androidx.compose.foundation.lazy.rememberLazyListState
1214
import androidx.compose.foundation.shape.RoundedCornerShape
1315
import androidx.compose.material.Button
1416
import androidx.compose.material.ButtonDefaults
@@ -32,10 +34,12 @@ fun FilterRow(
3234
onFilterClicked: (Filter) -> Unit,
3335
customItemsBefore: LazyListScope.() -> Unit = {},
3436
customItemsAfter: LazyListScope.() -> Unit = {},
37+
rowState: LazyListState = rememberLazyListState()
3538
) {
3639
LazyRow(
3740
horizontalArrangement = Arrangement.spacedBy(8.dp),
38-
contentPadding = PaddingValues(horizontal = 16.dp)
41+
contentPadding = PaddingValues(horizontal = 16.dp),
42+
state = rowState
3943
) {
4044
customItemsBefore()
4145
items(filters) { filter ->

app/src/main/java/com/cornellappdev/android/eatery/ui/screens/HomeScreen.kt

Lines changed: 71 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.statusBarsPadding
2525
import androidx.compose.foundation.layout.width
2626
import androidx.compose.foundation.lazy.LazyColumn
2727
import androidx.compose.foundation.lazy.LazyListScope
28+
import androidx.compose.foundation.lazy.LazyListState
2829
import androidx.compose.foundation.lazy.items
2930
import androidx.compose.foundation.lazy.itemsIndexed
3031
import androidx.compose.foundation.lazy.rememberLazyListState
@@ -232,15 +233,12 @@ fun HomeScreen(
232233
}
233234
},
234235
onFilterClicked = { filter ->
235-
homeViewModel.toggleFilter(
236-
filter = filter,
237-
pingAgain = isErrorState(eateriesApiResponse)
238-
)
236+
pingIfError(eateriesApiResponse, homeViewModel)
237+
homeViewModel.toggleFilter(filter)
239238
},
240239
onResetFilters = {
241-
homeViewModel.resetFilters(
242-
pingAgain = isErrorState(eateriesApiResponse)
243-
)
240+
pingIfError(eateriesApiResponse, homeViewModel)
241+
homeViewModel.resetFilters()
244242
},
245243
filters = homeViewModel.homeScreenFilters,
246244
isGridView = isGridView,
@@ -265,6 +263,15 @@ fun HomeScreen(
265263
})
266264
}
267265

266+
private fun pingIfError(
267+
eateriesApiResponse: EateryApiResponse<List<Eatery>>,
268+
homeViewModel: HomeViewModel
269+
) {
270+
if (eateriesApiResponse is EateryApiResponse.Error) {
271+
homeViewModel.pingEateries()
272+
}
273+
}
274+
268275
@Composable
269276
@OptIn(ExperimentalMaterialApi::class)
270277
private fun SheetContent(
@@ -339,55 +346,36 @@ private fun HomeScrollableMainContent(
339346
if (favorites.isNotEmpty()) {
340347
lastFavorite = favorites[0]
341348
}
342-
if (isErrorState(eateriesApiResponse)) {
343-
Column(modifier = Modifier.fillMaxSize()) {
344-
HomeStickyHeader(
345-
collapsed = isFirstVisible.value,
346-
loaded = false,
347-
onSearchClick = onSearchClick,
348-
onNotificationsClick = onNotificationsClick
349-
)
350-
HomeMainHeader(
351-
onSearchClick = onSearchClick,
352-
selectedFilters = selectedFilters,
353-
filters = filters,
354-
onFilterClicked = onFilterClicked
355-
)
356-
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
357-
ErrorContent(onTryAgain = onReload)
349+
val filterRowState = rememberLazyListState()
350+
val homeLazyColumn: @Composable (LazyListScope.() -> Unit) -> Unit = { content ->
351+
LazyColumn(
352+
state = listState,
353+
modifier = Modifier
354+
.fillMaxSize()
355+
) {
356+
stickyHeader {
357+
HomeStickyHeader(
358+
collapsed = isFirstVisible.value,
359+
loaded = eateriesApiResponse is EateryApiResponse.Success,
360+
onSearchClick = onSearchClick,
361+
onNotificationsClick = onNotificationsClick
362+
)
358363
}
364+
item {
365+
HomeMainHeader(
366+
onSearchClick = onSearchClick,
367+
selectedFilters = selectedFilters,
368+
onFilterClicked = onFilterClicked,
369+
filters = filters,
370+
filterRowState = filterRowState
371+
)
372+
}
373+
content()
359374
}
360-
return
361375
}
362-
LazyColumn(
363-
state = listState,
364-
modifier = Modifier
365-
.fillMaxSize()
366-
) {
367-
stickyHeader {
368-
HomeStickyHeader(
369-
collapsed = isFirstVisible.value,
370-
loaded = eateriesApiResponse is EateryApiResponse.Success,
371-
onSearchClick = onSearchClick,
372-
onNotificationsClick = onNotificationsClick
373-
)
374-
}
375-
item {
376-
HomeMainHeader(
377-
onSearchClick = onSearchClick,
378-
selectedFilters = selectedFilters,
379-
onFilterClicked = onFilterClicked,
380-
filters = filters,
381-
)
382-
}
383-
when (eateriesApiResponse) {
384-
is EateryApiResponse.Pending -> {
385-
items(MainLoadingItem.mainItems) { item ->
386-
CreateMainLoadingItem(item, shimmer)
387-
}
388-
}
389-
390-
is EateryApiResponse.Success -> {
376+
when (eateriesApiResponse) {
377+
is EateryApiResponse.Success -> {
378+
homeLazyColumn {
391379
regularContent(
392380
eateriesApiResponse,
393381
selectedFilters,
@@ -403,17 +391,39 @@ private fun HomeScrollableMainContent(
403391
nearestEateries
404392
)
405393
}
394+
}
406395

407-
EateryApiResponse.Error -> {
408-
// impossible
396+
is EateryApiResponse.Pending -> {
397+
homeLazyColumn {
398+
items(MainLoadingItem.mainItems) { item ->
399+
CreateMainLoadingItem(item, shimmer)
400+
}
401+
}
402+
}
403+
404+
is EateryApiResponse.Error -> {
405+
Column(modifier = Modifier.fillMaxSize()) {
406+
HomeStickyHeader(
407+
collapsed = isFirstVisible.value,
408+
loaded = false,
409+
onSearchClick = onSearchClick,
410+
onNotificationsClick = onNotificationsClick
411+
)
412+
HomeMainHeader(
413+
onSearchClick = onSearchClick,
414+
selectedFilters = selectedFilters,
415+
filters = filters,
416+
onFilterClicked = onFilterClicked,
417+
filterRowState = filterRowState
418+
)
419+
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
420+
ErrorContent(onTryAgain = onReload)
421+
}
409422
}
410423
}
411424
}
412425
}
413426

414-
private fun isErrorState(eateriesApiResponse: EateryApiResponse<List<Eatery>>): Boolean =
415-
eateriesApiResponse is EateryApiResponse.Error
416-
417427
@Composable
418428
fun ErrorContent(onTryAgain: () -> Unit) {
419429
Column(
@@ -726,6 +736,7 @@ private fun HomeMainHeader(
726736
selectedFilters: List<Filter>,
727737
filters: List<Filter>,
728738
onFilterClicked: (Filter) -> Unit,
739+
filterRowState: LazyListState
729740
) {
730741
SearchBar(
731742
searchText = "",
@@ -740,12 +751,11 @@ private fun HomeMainHeader(
740751
onCancelClicked = {},
741752
enabled = false
742753
)
743-
744-
745754
FilterRow(
746755
currentFiltersSelected = selectedFilters,
747756
onFilterClicked = onFilterClicked,
748-
filters = filters
757+
filters = filters,
758+
rowState = filterRowState
749759
)
750760
}
751761

0 commit comments

Comments
 (0)