Improve saved-search usage (#518)

* reload saved-searches every time reseting filters

* always reload saved-search & reset filter list when click on saved-search
This commit is contained in:
Cuong-Tran 2024-11-10 03:31:22 +07:00 committed by GitHub
parent e2ca729277
commit b685d82096
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 51 additions and 11 deletions

View file

@ -167,17 +167,17 @@ open class BrowseSourceScreenModel(
}
// SY -->
val savedSearchFilters = savedSearch
val savedSearchId = savedSearch
val jsonFilters = filtersJson
val filters = state.value.filters
if (savedSearchFilters != null) {
val savedSearch = runBlocking { getExhSavedSearch.awaitOne(savedSearchFilters) { filters } }
if (savedSearchId != null) {
val savedSearch = runBlocking { getExhSavedSearch.awaitOne(savedSearchId) { filters } }
if (savedSearch != null) {
search(
query = savedSearch.query,
filters = savedSearch.filterList,
// KMK -->
savedSearchId = savedSearchFilters,
savedSearchId = savedSearchId,
// KMK <--
)
}
@ -258,7 +258,11 @@ open class BrowseSourceScreenModel(
// KMK <--
if (source !is CatalogueSource) return
mutableState.update { it.copy(filters = source.getFilterList()) }
// KMK -->
setFilters(source.getFilterList())
reloadSavedSearches()
// KMK <--
}
fun setListing(listing: Listing) {
@ -289,7 +293,9 @@ open class BrowseSourceScreenModel(
if (source !is CatalogueSource) return
// SY -->
if (filters != null && filters !== state.value.filters) {
mutableState.update { state -> state.copy(filters = filters) }
// KMK -->
setFilters(filters)
// KMK <--
}
// SY <--
val input = state.value.listing as? Listing.Search
@ -521,7 +527,20 @@ open class BrowseSourceScreenModel(
val isUserQuery get() = listing is Listing.Search && !listing.query.isNullOrEmpty()
}
// KMK -->
private fun reloadSavedSearches() {
screenModelScope.launchIO {
getExhSavedSearch.await(source.id, (source as CatalogueSource)::getFilterList)
.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, EXHSavedSearch::name))
.let { savedSearches ->
mutableState.update { it.copy(savedSearches = savedSearches.toImmutableList()) }
}
}
}
// KMK <--
// EXH -->
/** Show a dialog to enter name for new saved search */
fun onSaveSearch() {
screenModelScope.launchIO {
val names = state.value.savedSearches.map { it.name }.toImmutableList()
@ -529,16 +548,26 @@ open class BrowseSourceScreenModel(
}
}
/** Open a saved search */
fun onSavedSearch(
search: EXHSavedSearch,
// KMK -->
loadedSearch: EXHSavedSearch,
// KMK <--
onToast: (StringResource) -> Unit,
) {
// KMK -->
resetFilters()
// KMK <--
screenModelScope.launchIO {
// KMK -->
val source = source
// KMK <--
if (source !is CatalogueSource) return@launchIO
// KMK -->
val search = getExhSavedSearch.awaitOne(loadedSearch.id, source::getFilterList) ?: loadedSearch
// KMK <--
if (search.filterList == null && state.value.filters.isNotEmpty()) {
withUIContext {
onToast(SYMR.strings.save_search_invalid)
@ -569,10 +598,12 @@ open class BrowseSourceScreenModel(
}
}
/** Show dialog to delete saved search */
fun onSavedSearchPress(search: EXHSavedSearch) {
mutableState.update { it.copy(dialog = Dialog.DeleteSavedSearch(search.id, search.name)) }
}
/** Save a search */
fun saveSearch(
name: String,
) {

View file

@ -78,8 +78,8 @@ class SourceFeedScreen(val sourceId: Long) : Screen() {
}
LaunchedEffect(navigator.lastItem) {
// Reload saved-searches when screen is navigated back to
screenModel.reloadSavedSearches()
// Reset filters & reload saved-searches when screen is navigated back to
screenModel.resetFilters()
}
val bulkFavoriteScreenModel = rememberScreenModel { BulkFavoriteScreenModel() }

View file

@ -122,6 +122,8 @@ open class SourceFeedScreenModel(
if (source !is CatalogueSource) return
setFilters(source.getFilterList())
reloadSavedSearches()
}
// KMK <--
@ -276,7 +278,7 @@ open class SourceFeedScreenModel(
}
// KMK -->
fun reloadSavedSearches() {
private fun reloadSavedSearches() {
screenModelScope.launchIO {
val searches = loadSearches()
mutableState.update { it.copy(savedSearches = searches) }
@ -311,8 +313,11 @@ open class SourceFeedScreenModel(
}
}
/** Open a saved search */
fun onSavedSearch(
search: EXHSavedSearch,
// KMK -->
loadedSearch: EXHSavedSearch,
// KMK <--
onBrowseClick: (query: String?, searchId: Long) -> Unit,
onToast: (StringResource) -> Unit,
) {
@ -321,6 +326,10 @@ open class SourceFeedScreenModel(
// KMK <--
if (source !is CatalogueSource) return
screenModelScope.launchIO {
// KMK -->
val search = getExhSavedSearch.awaitOne(loadedSearch.id, source::getFilterList) ?: loadedSearch
// KMK <--
if (search.filterList == null && state.value.filters.isNotEmpty()) {
withUIContext {
onToast(SYMR.strings.save_search_invalid)