Skip to content

Commit 05ae137

Browse files
committed
fix: reset scroll state only between tab switching, not within the same tab
1 parent 4ead32c commit 05ae137

2 files changed

Lines changed: 40 additions & 5 deletions

File tree

app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import androidx.compose.foundation.layout.fillMaxWidth
1010
import androidx.compose.foundation.layout.height
1111
import androidx.compose.foundation.layout.padding
1212
import androidx.compose.foundation.lazy.LazyColumn
13+
import androidx.compose.foundation.lazy.LazyListState
1314
import androidx.compose.foundation.lazy.LazyListScope
1415
import androidx.compose.foundation.lazy.LazyRow
1516
import androidx.compose.foundation.lazy.items
17+
import androidx.compose.foundation.lazy.rememberLazyListState
1618
import androidx.compose.material3.ExperimentalMaterial3Api
1719
import androidx.compose.material3.HorizontalDivider
1820
import androidx.compose.material3.ModalBottomSheet
@@ -83,6 +85,7 @@ fun EcosystemBottomSheetContent(
8385
onRemoveAppliedFilter: (FavoritesFilterSheetState) -> Unit,
8486
operatingHoursToString: (List<DayOperatingHours>) -> AnnotatedString,
8587
distanceStringToPlace: (Double?, Double?) -> String,
88+
listState: LazyListState,
8689
) {
8790
Column(modifier = modifier) {
8891
Row(
@@ -129,7 +132,8 @@ fun EcosystemBottomSheetContent(
129132
appliedFilters = appliedFilters,
130133
onRemoveAppliedFilter = onRemoveAppliedFilter,
131134
operatingHoursToString = operatingHoursToString,
132-
distanceStringToPlace = distanceStringToPlace
135+
distanceStringToPlace = distanceStringToPlace,
136+
listState = listState
133137
)
134138
}
135139

@@ -164,6 +168,7 @@ private fun BottomSheetFilteredContent(
164168
onRemoveAppliedFilter: (FavoritesFilterSheetState) -> Unit,
165169
operatingHoursToString: (List<DayOperatingHours>) -> AnnotatedString,
166170
distanceStringToPlace: (Double?, Double?) -> String,
171+
listState: LazyListState,
167172
) {
168173
Column {
169174
if (currentFilter == FilterState.FAVORITES) {
@@ -185,6 +190,7 @@ private fun BottomSheetFilteredContent(
185190
val isFilterBarHidden = currentFilter == FilterState.FAVORITES && appliedFilters.isEmpty()
186191
key(currentFilter, appliedFilters) {
187192
LazyColumn(
193+
state = listState,
188194
contentPadding = PaddingValues(
189195
start = 12.dp,
190196
end = 12.dp,
@@ -658,7 +664,8 @@ private fun PreviewEcosystemBottomSheet() {
658664
onFilterToggle = {},
659665
onRemoveAppliedFilter = {},
660666
operatingHoursToString = { _ -> AnnotatedString("") },
661-
distanceStringToPlace = { _, _ -> "" }
667+
distanceStringToPlace = { _, _ -> "" },
668+
listState = rememberLazyListState()
662669
)
663670
}
664671

@@ -826,7 +833,8 @@ private fun PreviewBottomSheetFilteredContentFavorites() {
826833
),
827834
onRemoveAppliedFilter = {},
828835
operatingHoursToString = { _ -> AnnotatedString("Open • 10am - 4pm") },
829-
distanceStringToPlace = { _, _ -> "distance" }
836+
distanceStringToPlace = { _, _ -> "distance" },
837+
listState = rememberLazyListState()
830838
)
831839
}
832840

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import androidx.compose.foundation.layout.height
1717
import androidx.compose.foundation.layout.padding
1818
import androidx.compose.foundation.layout.wrapContentHeight
1919
import androidx.compose.foundation.layout.wrapContentWidth
20+
import androidx.compose.foundation.lazy.LazyListState
21+
import androidx.compose.foundation.lazy.rememberLazyListState
2022
import androidx.compose.foundation.shape.RoundedCornerShape
2123
import androidx.compose.material.icons.Icons
2224
import androidx.compose.material.icons.outlined.Info
@@ -71,6 +73,7 @@ import com.cornellappdev.transit.ui.theme.IconGray
7173
import com.cornellappdev.transit.ui.theme.MetadataGray
7274
import com.cornellappdev.transit.ui.viewmodels.EcosystemSheetState
7375
import com.cornellappdev.transit.ui.viewmodels.FavoritesViewModel
76+
import com.cornellappdev.transit.ui.viewmodels.FilterState
7477
import com.cornellappdev.transit.ui.viewmodels.HomeViewModel
7578
import com.cornellappdev.transit.ui.viewmodels.SearchBarUIState
7679
import com.cornellappdev.transit.util.BOTTOM_SHEET_MAX_HEIGHT_PERCENT
@@ -290,6 +293,20 @@ fun HomeScreen(
290293

291294
// Favorites BottomSheet (Filters BottomSheet for ecosystem)
292295
if (ECOSYSTEM_FLAG) {
296+
val favoritesListState = rememberLazyListState()
297+
val gymsListState = rememberLazyListState()
298+
val eateriesListState = rememberLazyListState()
299+
val librariesListState = rememberLazyListState()
300+
val printersListState = rememberLazyListState()
301+
302+
fun listStateFor(filter: FilterState): LazyListState = when (filter) {
303+
FilterState.FAVORITES -> favoritesListState
304+
FilterState.GYMS -> gymsListState
305+
FilterState.EATERIES -> eateriesListState
306+
FilterState.LIBRARIES -> librariesListState
307+
FilterState.PRINTERS -> printersListState
308+
}
309+
293310
var ecosystemSheetState by remember {
294311
mutableStateOf<EcosystemSheetState>(
295312
EcosystemSheetState.Tabs
@@ -333,7 +350,16 @@ fun HomeScreen(
333350
EcosystemBottomSheetContent(
334351
filters = homeViewModel.filterList,
335352
activeFilter = filterStateValue,
336-
onFilterClick = homeViewModel::setCategoryFilter,
353+
onFilterClick = { selectedFilter ->
354+
if (selectedFilter == filterStateValue) {
355+
return@EcosystemBottomSheetContent
356+
}
357+
358+
homeViewModel.setCategoryFilter(selectedFilter)
359+
scope.launch {
360+
listStateFor(selectedFilter).scrollToItem(0)
361+
}
362+
},
337363
modifier = Modifier.onTapDisableSearch(),
338364
staticPlaces = staticPlaces,
339365
favorites = favorites,
@@ -359,7 +385,8 @@ fun HomeScreen(
359385
onFilterToggle = homeViewModel::toggleFavoritesFilter,
360386
onRemoveAppliedFilter = homeViewModel::removeAppliedFilter,
361387
operatingHoursToString = ::isOpenAnnotatedStringFromOperatingHours,
362-
distanceStringToPlace = homeViewModel::distanceStringIfCurrentLocationExists
388+
distanceStringToPlace = homeViewModel::distanceStringIfCurrentLocationExists,
389+
listState = listStateFor(filterStateValue)
363390
)
364391
}
365392
}

0 commit comments

Comments
 (0)