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.combineMetadata(metadata: RaisedSearchMetadata?): Flow> { // 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) } } }