komikku/app/src/main/java/exh/recs/BrowseRecommendsScreenModel.kt
Cuong-Tran 6c530e4fca
fix(recommendation): Fix null RecommendationSource & refactoring (#1000)
* Remove redundant condition & refactor class

* Batch networkToLocalManga

* Fix null source

* Simplify by creating RecommendationSource to match with upstream

* Add comment
2025-06-12 15:39:09 +07:00

67 lines
2.6 KiB
Kotlin

package exh.recs
import cafe.adriel.voyager.core.model.screenModelScope
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel
import exh.metadata.metadata.RaisedSearchMetadata
import exh.recs.sources.RECOMMENDS_SOURCE
import exh.recs.sources.RecommendationPagingSource
import exh.recs.sources.RecommendationSource
import exh.recs.sources.StaticResultPagingSource
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.runBlocking
import tachiyomi.core.common.util.lang.launchIO
import tachiyomi.domain.manga.interactor.GetManga
import tachiyomi.domain.manga.model.Manga
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class BrowseRecommendsScreenModel(
private val args: BrowseRecommendsScreen.Args,
private val getManga: GetManga = Injekt.get(),
) : BrowseSourceScreenModel(
sourceId = when (args) {
is BrowseRecommendsScreen.Args.SingleSourceManga -> args.sourceId
is BrowseRecommendsScreen.Args.MergedSourceMangas -> args.results.recAssociatedSourceId ?: RECOMMENDS_SOURCE
},
listingQuery = null,
) {
private var manga: Manga? = null
init {
screenModelScope.launchIO {
manga = when (args) {
is BrowseRecommendsScreen.Args.SingleSourceManga -> getManga.await(args.mangaId)
is BrowseRecommendsScreen.Args.MergedSourceMangas -> null
}
}
}
val recommendationPagingSource: RecommendationPagingSource
get() = when (args) {
is BrowseRecommendsScreen.Args.MergedSourceMangas -> StaticResultPagingSource(args.results)
is BrowseRecommendsScreen.Args.SingleSourceManga -> RecommendationPagingSource.createSources(
manga ?: runBlocking(Dispatchers.IO) { getManga.await(args.mangaId)!! },
// KMK -->
RecommendationSource(sourceId),
// KMK <--
).first {
it::class.qualifiedName == args.recommendationSourceName
}
}
override fun createSourcePagingSource(query: String, filters: FilterList) = recommendationPagingSource
override fun Flow<Manga>.combineMetadata(metadata: RaisedSearchMetadata?): Flow<Pair<Manga, RaisedSearchMetadata?>> {
// Overridden to prevent our custom metadata from being replaced from a cache
return flatMapLatest { manga -> flowOf(manga to metadata) }
}
init {
mutableState.update { it.copy(filterable = false) }
}
}