pass library view model to search bar

This commit is contained in:
Satindar Dhillon
2023-02-16 20:50:04 -08:00
parent 905f3bf10b
commit b3ddb354ec
4 changed files with 39 additions and 19 deletions

View File

@ -1,6 +1,5 @@
package app.omnivore.omnivore.ui.library
import android.util.Log
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown

View File

@ -33,13 +33,10 @@ fun LibraryView(
libraryViewModel: LibraryViewModel,
navController: NavHostController
) {
val searchText: String by libraryViewModel.searchTextLiveData.observeAsState("")
Scaffold(
topBar = {
SearchBar(
searchText = searchText,
onSearchTextChanged = { libraryViewModel.updateSearchText(it) },
libraryViewModel = libraryViewModel,
onSettingsIconClick = { navController.navigate(Routes.Settings.route) }
)
}
@ -84,8 +81,10 @@ fun LibraryViewContent(libraryViewModel: LibraryViewModel, modifier: Modifier) {
.fillMaxSize()
.padding(horizontal = 6.dp)
) {
item {
LibraryFilterBar(libraryViewModel)
if (searchText.isEmpty()) {
item {
LibraryFilterBar(libraryViewModel)
}
}
items(if (searchText.isNotEmpty()) searchedCardsData else cardsData) { cardDataWithLabels ->
SavedItemCard(

View File

@ -3,6 +3,7 @@ package app.omnivore.omnivore.ui.library
import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
@ -35,8 +36,8 @@ class LibraryViewModel @Inject constructor(
val searchTextLiveData = MutableLiveData("")
val searchItemsLiveData = MutableLiveData<List<SavedItemCardDataWithLabels>>(listOf())
val itemsLiveData = dataService.db.savedItemDao().getLibraryLiveDataWithLabels()
val appliedFilterLiveData = MutableLiveData<SavedItemFilter>(SavedItemFilter.INBOX)
val appliedSortFilterLiveData = MutableLiveData<SavedItemSortFilter>(SavedItemSortFilter.NEWEST)
val appliedFilterLiveData = MutableLiveData(SavedItemFilter.INBOX)
val appliedSortFilterLiveData = MutableLiveData(SavedItemSortFilter.NEWEST)
var isRefreshing by mutableStateOf(false)
var hasLoadedInitialFilters = false
@ -106,16 +107,24 @@ class LibraryViewModel @Inject constructor(
fun updateSavedItemFilter(filter: SavedItemFilter) {
viewModelScope.launch {
datastoreRepo.putString(DatastoreKeys.lastUsedSavedItemFilter, filter.rawValue)
appliedFilterLiveData.postValue(filter)
// TODO: update Room query
appliedFilterLiveData.value = filter
handleFilterChanges()
}
}
fun updateSavedItemSortFilter(filter: SavedItemSortFilter) {
viewModelScope.launch {
datastoreRepo.putString(DatastoreKeys.lastUsedSavedItemSortFilter, filter.rawValue)
appliedSortFilterLiveData.postValue(filter)
// TODO: update Room query
appliedSortFilterLiveData.value = filter
handleFilterChanges()
}
}
suspend fun handleFilterChanges() { // TODO: implement
if (searchTextLiveData.value != "") {
performSearch(true)
} else {
// TODO: implement
}
}
@ -168,7 +177,7 @@ class LibraryViewModel @Inject constructor(
searchIdx += 1
// Execute the search
val searchResult = networker.typeaheadSearch(searchTextLiveData.value ?: "")
val searchResult = networker.typeaheadSearch(searchQueryString())
// Search results aren't guaranteed to return in order so this
// will discard old results that are returned while a user is typing.
@ -209,6 +218,18 @@ class LibraryViewModel @Inject constructor(
}
}
}
private fun searchQueryString(): String {
var query = "${appliedFilterLiveData.value?.queryString} ${appliedSortFilterLiveData.value?.queryString}"
val searchText = searchTextLiveData.value ?: ""
if (searchText.isNotEmpty()) {
query += " $searchText"
}
Log.d("sefi", "search query: $query")
return query
}
}
enum class SavedItemAction {

View File

@ -15,6 +15,7 @@ import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
@ -27,16 +28,16 @@ import androidx.compose.ui.unit.dp
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SearchBar(
searchText: String,
onSearchTextChanged: (String) -> Unit,
libraryViewModel: LibraryViewModel,
onSettingsIconClick: () -> Unit
) {
var showSearchField by remember { mutableStateOf(searchText != "") }
var showSearchField by remember { mutableStateOf(false) }
val searchText: String by libraryViewModel.searchTextLiveData.observeAsState("")
SmallTopAppBar(
title = {
if (showSearchField) {
SearchField(searchText, onSearchTextChanged)
SearchField(searchText) { libraryViewModel.updateSearchText(it) }
} else {
Text("Library")
}
@ -50,7 +51,7 @@ fun SearchBar(
text = "Cancel",
modifier = Modifier
.clickable {
onSearchTextChanged("")
libraryViewModel.updateSearchText("")
showSearchField = false
}
.padding(horizontal = 6.dp)