fix(library): Fix categories filter & hidden categories

This commit is contained in:
Cuong-Tran 2025-08-27 13:03:04 +07:00
parent 1fd86ca74f
commit f635fc209b

View file

@ -184,37 +184,11 @@ class LibraryScreenModel(
::Triple, ::Triple,
), ),
combine(getTracksPerManga.subscribe(), getTrackingFiltersFlow(), ::Pair), combine(getTracksPerManga.subscribe(), getTrackingFiltersFlow(), ::Pair),
// SY -->
combine(
state.map { it.groupType }.distinctUntilChanged(),
libraryPreferences.sortingMode().changes(),
// KMK -->
state.map { it.searchQuery.isNullOrBlank() && !it.hasActiveFilters }.distinctUntilChanged(),
::Triple,
// KMK <--
),
// SY <--
// KMK --> // KMK -->
combine( getCategoriesPerLibraryManga.subscribe(),
combine(
getCategoriesPerLibraryManga.subscribe(),
state.map { it.filterCategory }.distinctUntilChanged(),
::Pair,
),
combine(
state.map { it.includedCategories }.distinctUntilChanged(),
state.map { it.excludedCategories }.distinctUntilChanged(),
::Pair,
),
::Pair,
),
// KMK <-- // KMK <--
getLibraryItemPreferencesFlow(), getLibraryItemPreferencesFlow(),
) { (searchQuery, categories, favorites), (tracksMap, trackingFilters), (groupType, sort, noActiveFilterOrSearch), (categoryFilters, filteredCategories), itemPreferences -> ) { (searchQuery, categories, favorites), (tracksMap, trackingFilters), categoriesPerManga, itemPreferences ->
// KMK -->
val (categoriesPerManga, filterCategory) = categoryFilters
val (includedCategories, _) = filteredCategories
// KMK <--
val filteredFavorites = favorites val filteredFavorites = favorites
.applyFilters( .applyFilters(
tracksMap, tracksMap,
@ -255,55 +229,75 @@ class LibraryScreenModel(
} }
screenModelScope.launchIO { screenModelScope.launchIO {
state combine(
.dropWhile { !it.libraryData.isInitialized } state
.map { .dropWhile { !it.libraryData.isInitialized }
Triple( .map {
it.libraryData, Triple(
// SY --> it.libraryData,
it.groupType, // SY -->
// SY <-- it.groupType,
// SY <--
// KMK -->
it.searchQuery.isNullOrBlank() && !it.hasActiveFilters,
// KMK <--
)
}
.distinctUntilChanged(),
// KMK -->
combine(
libraryPreferences.sortingMode().changes(),
libraryPreferences.showHiddenCategories().changes(),
::Pair,
),
combine(
state.map { it.filterCategory }.distinctUntilChanged(),
state.map { it.includedCategories }.distinctUntilChanged(),
::Pair,
),
// KMK <--
) { (data, groupType, noActiveFilterOrSearch), (sort, showHiddenCategories), (filterCategory, includedCategories) ->
data.favorites
.applyGrouping(
data.categories,
// KMK --> // KMK -->
it.searchQuery.isNullOrBlank() && !it.hasActiveFilters, if (filterCategory && includedCategories.isNotEmpty()) {
LibraryGroup.UNGROUPED
} else {
groupType
},
showHiddenCategories,
// KMK <-- // KMK <--
) )
} .applySort(
.distinctUntilChanged() data.favoritesById,
.map { (data, groupType, noActiveFilterOrSearch) -> data.tracksMap,
data.favorites data.loggedInTrackerIds,
.applyGrouping( // SY -->
data.categories, sort.takeIf { groupType != LibraryGroup.BY_DEFAULT },
// SY --> // SY <--
groupType, )
// SY <-- // KMK -->
) .filter {
.applySort( // Hide empty categories if no active filter or search
data.favoritesById, noActiveFilterOrSearch || it.value.isNotEmpty()
data.tracksMap, }
data.loggedInTrackerIds, .let {
// SY --> // Fall back to default category if no categories are present
libraryPreferences.sortingMode().get().takeIf { groupType != LibraryGroup.BY_DEFAULT }, it.ifEmpty {
// SY <-- mapOf(
) Category(
// KMK --> 0,
.filter { preferences.context.stringResource(MR.strings.default_category),
noActiveFilterOrSearch || it.value.isNotEmpty() 0,
0,
false,
) to emptyList(),
)
} }
.let { }
it.ifEmpty { // KMK <--
mapOf( }
Category(
0,
preferences.context.stringResource(MR.strings.default_category),
0,
0,
false,
) to emptyList(),
)
}
}
// KMK <--
}
.collectLatest { .collectLatest {
mutableState.update { state -> mutableState.update { state ->
state.copy( state.copy(
@ -415,16 +409,6 @@ class LibraryScreenModel(
} }
.launchIn(screenModelScope) .launchIn(screenModelScope)
screenModelScope.launchIO {
getCategories
.subscribe()
.collect { categories ->
mutableState.update { state ->
state.copy(libraryCategories = categories.filterNot(Category::isSystemCategory))
}
}
}
screenModelScope.launchIO { screenModelScope.launchIO {
if (mangaDexDmcaUuids.isEmpty()) { if (mangaDexDmcaUuids.isEmpty()) {
mangaDexDmcaUuids = loadMangaDexDmcaUuids(context = Injekt.get<Application>()) mangaDexDmcaUuids = loadMangaDexDmcaUuids(context = Injekt.get<Application>())