Moving some search class around.

This commit is contained in:
Thomas Andres Gomez 2022-07-21 10:47:22 +02:00
parent c7dc9b227c
commit 2eb87a156f
5 changed files with 137 additions and 98 deletions

View file

@ -24,7 +24,7 @@ import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.PagerState
import com.google.accompanist.pager.rememberPagerState
import com.pixelized.biblib.R
import com.pixelized.biblib.ui.composable.Search
import com.pixelized.biblib.ui.screen.home.page.search.Search
import com.pixelized.biblib.ui.scaffold.*
import com.pixelized.biblib.ui.scaffold.SearchScaffoldState.ContentState
import com.pixelized.biblib.ui.screen.home.common.connectivity.ConnectivityHeader

View file

@ -0,0 +1,120 @@
package com.pixelized.biblib.ui.screen.home.page.search
import android.content.res.Configuration
import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.pixelized.biblib.ui.scaffold.LocalSearchViewModel
import com.pixelized.biblib.ui.scaffold.SearchFilter
import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.default
@Composable
fun SearchFilter(
modifier: Modifier = Modifier,
filters: List<SearchFilter> = SearchFilter.all,
onFilter: (filter: SearchFilter) -> Unit = default<SearchFilter>(),
) {
Row(
modifier = Modifier
.horizontalScroll(rememberScrollState())
.then(modifier),
verticalAlignment = Alignment.CenterVertically,
) {
filters.forEachIndexed { index, filter ->
val chipModifier = if (index != filters.lastIndex) {
Modifier.padding(end = MaterialTheme.bibLib.dimen.dp8)
} else {
Modifier
}
SearchChipFilter(
modifier = chipModifier,
selected = filter.isSelected,
label = stringResource(id = filter.label),
value = filter.value,
onClick = { onFilter(filter) }
)
}
}
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
private fun SearchChipFilter(
modifier: Modifier = Modifier,
label: String,
selected: Boolean = false,
value: String? = null,
onClick: () -> Unit = default(),
) {
FilterChip(
modifier = modifier,
selected = selected,
onClick = onClick,
) {
Text(
color = MaterialTheme.bibLib.colors.typography.medium,
style = MaterialTheme.typography.caption,
text = label
)
value?.let {
Text(
color = MaterialTheme.bibLib.colors.typography.medium,
style = MaterialTheme.typography.caption,
text = ": "
)
Text(
color = MaterialTheme.bibLib.colors.typography.medium,
style = MaterialTheme.typography.caption,
text = value
)
}
Icon(
imageVector = Icons.Default.ArrowDropDown,
tint = MaterialTheme.bibLib.colors.typography.medium,
contentDescription = null
)
}
}
@Composable
fun rememberSearchFilter(
searchViewModel: SearchViewModel = LocalSearchViewModel.current
): List<SearchFilter> {
val filters by remember {
derivedStateOf {
listOf(
SearchFilter.Author(value = searchViewModel.authors.search?.label),
SearchFilter.Series(value = searchViewModel.series.search?.label),
SearchFilter.Genre(value = searchViewModel.genre.search?.label),
SearchFilter.Language(value = searchViewModel.language.search?.label)
)
}
}
return filters
}
@Composable
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
private fun SearchFilterPreview() {
BibLibTheme {
SearchFilter()
}
}

View file

@ -41,6 +41,7 @@ import com.pixelized.biblib.ui.screen.home.common.item.SmallBookThumbnailUio
import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.default
import com.pixelized.biblib.utils.extention.isLoading
import com.pixelized.biblib.utils.extention.navigationBarsHeight
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
@ -130,102 +131,6 @@ private fun SearchLoader(
)
}
@Composable
private fun SearchFilter(
modifier: Modifier = Modifier,
filters: List<SearchFilter> = SearchFilter.all,
onFilter: (filter: SearchFilter) -> Unit = default<SearchFilter>(),
) {
Row(
modifier = Modifier
.horizontalScroll(rememberScrollState())
.then(modifier),
verticalAlignment = Alignment.CenterVertically,
) {
filters.forEachIndexed { index, filter ->
val chipModifier = if (index != filters.lastIndex) {
Modifier.padding(end = MaterialTheme.bibLib.dimen.dp8)
} else {
Modifier
}
SearchChipFilter(
modifier = chipModifier,
selected = filter.isSelected,
label = stringResource(id = filter.label),
value = filter.value,
onClick = { onFilter(filter) }
)
}
}
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
private fun SearchChipFilter(
modifier: Modifier = Modifier,
label: String,
selected: Boolean = false,
value: String? = null,
onClick: () -> Unit = default(),
) {
FilterChip(
modifier = modifier,
selected = selected,
onClick = onClick,
) {
Text(
color = MaterialTheme.bibLib.colors.typography.medium,
style = MaterialTheme.typography.caption,
text = label
)
value?.let {
Text(
color = MaterialTheme.bibLib.colors.typography.medium,
style = MaterialTheme.typography.caption,
text = ": "
)
Text(
color = MaterialTheme.bibLib.colors.typography.medium,
style = MaterialTheme.typography.caption,
text = value
)
}
Icon(
imageVector = Icons.Default.ArrowDropDown,
tint = MaterialTheme.bibLib.colors.typography.medium,
contentDescription = null
)
}
}
@Composable
private fun rememberSearchFilter(
searchViewModel: SearchViewModel = LocalSearchViewModel.current
): List<SearchFilter> {
val filters by remember {
derivedStateOf {
listOf(
SearchFilter.Author(value = searchViewModel.authors.search?.label),
SearchFilter.Series(value = searchViewModel.series.search?.label),
SearchFilter.Genre(value = searchViewModel.genre.search?.label),
SearchFilter.Language(value = searchViewModel.language.search?.label)
)
}
}
return filters
}
private val LazyPagingItems<*>.isLoading: Boolean
get() {
val isLoading by derivedStateOf {
loadState.refresh is LoadState.Loading || loadState.append is LoadState.Loading
}
return isLoading
}
@Composable
@Preview(showBackground = true, uiMode = UI_MODE_NIGHT_NO)
@Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES)

View file

@ -1,4 +1,4 @@
package com.pixelized.biblib.ui.composable
package com.pixelized.biblib.ui.screen.home.page.search
import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES

View file

@ -0,0 +1,14 @@
package com.pixelized.biblib.utils.extention
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems
val LazyPagingItems<*>.isLoading: Boolean
get() {
val isLoading by derivedStateOf {
loadState.refresh is LoadState.Loading || loadState.append is LoadState.Loading
}
return isLoading
}