compose: search: Preserve filter header state

No need to layout new header for every search

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2025-08-30 19:45:18 +08:00
parent 6ad6167d98
commit 0dde304938

View File

@@ -192,28 +192,30 @@ private fun ScreenContent(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = { SearchBar() } topBar = { SearchBar() }
) { paddingValues -> ) { paddingValues ->
when (results.loadState.refresh) { Column(
is LoadState.Loading -> ProgressComposable() modifier = Modifier
.padding(paddingValues)
.fillMaxSize()
.padding(vertical = dimensionResource(R.dimen.padding_medium))
) {
FilterHeader(
isEnabled = results.itemCount > 0,
isAnonymous = isAnonymous,
onFilter = onFilter
)
is LoadState.Error -> { when (results.loadState.refresh) {
ErrorComposable( is LoadState.Loading -> ProgressComposable()
modifier = Modifier.padding(paddingValues),
icon = R.drawable.ic_disclaimer,
message = R.string.error
)
}
else -> { is LoadState.Error -> {
Column( ErrorComposable(
modifier = Modifier modifier = Modifier.padding(paddingValues),
.padding(paddingValues) icon = R.drawable.ic_disclaimer,
.fillMaxSize() message = R.string.error
.padding(vertical = dimensionResource(R.dimen.padding_medium)) )
) { }
if (textFieldState.text.isNotBlank() && results.itemCount > 0) {
FilterHeader(isAnonymous = isAnonymous, onFilter = onFilter)
}
else -> {
LazyColumn { LazyColumn {
items( items(
count = results.itemCount, count = results.itemCount,
@@ -268,7 +270,11 @@ private fun ScreenContent(
} }
@Composable @Composable
private fun FilterHeader(isAnonymous: Boolean = true, onFilter: (filter: SearchFilter) -> Unit) { private fun FilterHeader(
isAnonymous: Boolean = true,
isEnabled: Boolean = true,
onFilter: (filter: SearchFilter) -> Unit
) {
var activeFilter by rememberSaveable { mutableStateOf(SearchFilter()) } var activeFilter by rememberSaveable { mutableStateOf(SearchFilter()) }
val filters = listOfNotNull( val filters = listOfNotNull(
@@ -282,6 +288,7 @@ private fun FilterHeader(isAnonymous: Boolean = true, onFilter: (filter: SearchF
@Composable @Composable
fun NonExpandableFilterChip(@StringRes filter: Int, isSelected: Boolean) { fun NonExpandableFilterChip(@StringRes filter: Int, isSelected: Boolean) {
FilterChip( FilterChip(
enabled = isEnabled,
onClick = { onClick = {
activeFilter = when (filter) { activeFilter = when (filter) {
R.string.details_free -> activeFilter.copy(isFree = !activeFilter.isFree) R.string.details_free -> activeFilter.copy(isFree = !activeFilter.isFree)
@@ -309,6 +316,7 @@ private fun FilterHeader(isAnonymous: Boolean = true, onFilter: (filter: SearchF
Box { Box {
FilterChip( FilterChip(
enabled = isEnabled,
onClick = { isExpanded = !isExpanded }, onClick = { isExpanded = !isExpanded },
label = { Text(text = stringResource(filter)) }, label = { Text(text = stringResource(filter)) },
selected = isSelected, selected = isSelected,