@@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.statusBarsPadding
2525import androidx.compose.foundation.layout.width
2626import androidx.compose.foundation.lazy.LazyColumn
2727import androidx.compose.foundation.lazy.LazyListScope
28+ import androidx.compose.foundation.lazy.LazyListState
2829import androidx.compose.foundation.lazy.items
2930import androidx.compose.foundation.lazy.itemsIndexed
3031import 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 )
270277private 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
418428fun 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