Moving some search class around.
This commit is contained in:
parent
c7dc9b227c
commit
2eb87a156f
5 changed files with 137 additions and 98 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue