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:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user