mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
add saved item sort filter ui
This commit is contained in:
parent
4755199d7f
commit
905f3bf10b
4 changed files with 84 additions and 17 deletions
|
|
@ -16,6 +16,7 @@ object DatastoreKeys {
|
|||
const val preferredWebFontFamily = "preferredWebFontFamily"
|
||||
const val prefersWebHighContrastText = "prefersWebHighContrastText"
|
||||
const val lastUsedSavedItemFilter = "lastUsedSavedItemFilter"
|
||||
const val lastUsedSavedItemSortFilter = "lastUsedSavedItemSortFilter"
|
||||
}
|
||||
|
||||
object AppleConstants {
|
||||
|
|
|
|||
|
|
@ -17,6 +17,9 @@ fun LibraryFilterBar(viewModel: LibraryViewModel) {
|
|||
var isSavedItemFilterMenuExpanded by remember { mutableStateOf(false) }
|
||||
val activeSavedItemFilter: SavedItemFilter by viewModel.appliedFilterLiveData.observeAsState(SavedItemFilter.INBOX)
|
||||
|
||||
var isSavedItemSortFilterMenuExpanded by remember { mutableStateOf(false) }
|
||||
val activeSavedItemSortFilter: SavedItemSortFilter by viewModel.appliedSortFilterLiveData.observeAsState(SavedItemSortFilter.NEWEST)
|
||||
|
||||
Column {
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.Start,
|
||||
|
|
@ -36,8 +39,8 @@ fun LibraryFilterBar(viewModel: LibraryViewModel) {
|
|||
modifier = Modifier.padding(end = 6.dp)
|
||||
)
|
||||
AssistChip(
|
||||
onClick = { /* Do something! */ },
|
||||
label = { Text("Newest") },
|
||||
onClick = { isSavedItemSortFilterMenuExpanded = true },
|
||||
label = { Text(activeSavedItemSortFilter.displayText) },
|
||||
trailingIcon = {
|
||||
Icon(
|
||||
Icons.Default.ArrowDropDown,
|
||||
|
|
@ -53,5 +56,11 @@ fun LibraryFilterBar(viewModel: LibraryViewModel) {
|
|||
onDismiss = { isSavedItemFilterMenuExpanded = false },
|
||||
actionHandler = { viewModel.updateSavedItemFilter(it) }
|
||||
)
|
||||
|
||||
SavedItemSortFilterContextMenu(
|
||||
isExpanded = isSavedItemSortFilterMenuExpanded,
|
||||
onDismiss = { isSavedItemSortFilterMenuExpanded = false },
|
||||
actionHandler = { viewModel.updateSavedItemSortFilter(it) }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,21 +24,6 @@ class LibraryViewModel @Inject constructor(
|
|||
private val dataService: DataService,
|
||||
private val datastoreRepo: DatastoreRepository
|
||||
): ViewModel() {
|
||||
|
||||
init {
|
||||
// Load the last saved library filter
|
||||
runBlocking {
|
||||
datastoreRepo.getString(DatastoreKeys.lastUsedSavedItemFilter)?.let { str ->
|
||||
try {
|
||||
val filter = SavedItemFilter.values().first { it.rawValue == str }
|
||||
appliedFilterLiveData.postValue(filter)
|
||||
} catch (e: Exception) {
|
||||
Log.d("error", "invalid filter value store in datastore repo: $e")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var cursor: String? = null
|
||||
|
||||
// These are used to make sure we handle search result
|
||||
|
|
@ -51,8 +36,35 @@ class LibraryViewModel @Inject constructor(
|
|||
val searchItemsLiveData = MutableLiveData<List<SavedItemCardDataWithLabels>>(listOf())
|
||||
val itemsLiveData = dataService.db.savedItemDao().getLibraryLiveDataWithLabels()
|
||||
val appliedFilterLiveData = MutableLiveData<SavedItemFilter>(SavedItemFilter.INBOX)
|
||||
val appliedSortFilterLiveData = MutableLiveData<SavedItemSortFilter>(SavedItemSortFilter.NEWEST)
|
||||
|
||||
var isRefreshing by mutableStateOf(false)
|
||||
var hasLoadedInitialFilters = false
|
||||
|
||||
fun loadInitialFilterValues() {
|
||||
if (hasLoadedInitialFilters) { return }
|
||||
hasLoadedInitialFilters = false
|
||||
|
||||
runBlocking {
|
||||
datastoreRepo.getString(DatastoreKeys.lastUsedSavedItemFilter)?.let { str ->
|
||||
try {
|
||||
val filter = SavedItemFilter.values().first { it.rawValue == str }
|
||||
appliedFilterLiveData.postValue(filter)
|
||||
} catch (e: Exception) {
|
||||
Log.d("error", "invalid filter value stored in datastore repo: $e")
|
||||
}
|
||||
}
|
||||
|
||||
datastoreRepo.getString(DatastoreKeys.lastUsedSavedItemSortFilter)?.let { str ->
|
||||
try {
|
||||
val filter = SavedItemSortFilter.values().first { it.rawValue == str }
|
||||
appliedSortFilterLiveData.postValue(filter)
|
||||
} catch (e: Exception) {
|
||||
Log.d("error", "invalid sort filter value stored in datastore repo: $e")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun updateSearchText(text: String) {
|
||||
searchTextLiveData.value = text
|
||||
|
|
@ -80,6 +92,8 @@ class LibraryViewModel @Inject constructor(
|
|||
}
|
||||
|
||||
fun load(clearPreviousSearch: Boolean = false) {
|
||||
loadInitialFilterValues()
|
||||
|
||||
viewModelScope.launch {
|
||||
if (searchTextLiveData.value != "") {
|
||||
performSearch(clearPreviousSearch)
|
||||
|
|
@ -97,6 +111,14 @@ class LibraryViewModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
fun updateSavedItemSortFilter(filter: SavedItemSortFilter) {
|
||||
viewModelScope.launch {
|
||||
datastoreRepo.putString(DatastoreKeys.lastUsedSavedItemSortFilter, filter.rawValue)
|
||||
appliedSortFilterLiveData.postValue(filter)
|
||||
// TODO: update Room query
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun syncItems() {
|
||||
val syncStart = Instant.now()
|
||||
val lastSyncDate = getLastSyncTime() ?: Instant.MIN
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
package app.omnivore.omnivore.ui.library
|
||||
|
||||
import androidx.compose.material3.DropdownMenu
|
||||
import androidx.compose.material3.DropdownMenuItem
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
|
||||
enum class SavedItemSortFilter(val displayText: String, val rawValue: String, val queryString: String) {
|
||||
NEWEST("Newest", rawValue = "newest", "sort:saved"),
|
||||
OLDEST("Oldest", rawValue = "oldest", "sort:saved-ASC"),
|
||||
RECENTLY_READ("Recently Read", rawValue = "recentlyRead", "sort:read"),
|
||||
RECENTLY_PUBLISHED("Recently Published", rawValue = "recentlyPublished", "sort:published"),
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun SavedItemSortFilterContextMenu(
|
||||
isExpanded: Boolean,
|
||||
onDismiss: () -> Unit,
|
||||
actionHandler: (SavedItemSortFilter) -> Unit
|
||||
) {
|
||||
DropdownMenu(
|
||||
expanded = isExpanded,
|
||||
onDismissRequest = onDismiss
|
||||
) {
|
||||
SavedItemSortFilter.values().forEach {
|
||||
DropdownMenuItem(
|
||||
text = { Text(it.displayText) },
|
||||
onClick = {
|
||||
actionHandler(it)
|
||||
onDismiss()
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue