TachiyomiSY-Plus/app/src/main/java/exh/pagepreview/PagePreviewScreenModel.kt
arkon e4ad723606 Refactor SourceManager/StubSource to domain module
(cherry picked from commit ad4912803bda73e0f1d5e2e0246561a508e72fd7)

# Conflicts:
#	app/src/main/java/eu/kanade/data/source/SourceRepositoryImpl.kt
#	app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt
#	app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/AndroidSourceManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/SourcePreferencesScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesScreenModel.kt
2023-03-14 23:35:34 -04:00

109 lines
4.1 KiB
Kotlin

package exh.pagepreview
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import cafe.adriel.voyager.core.model.StateScreenModel
import cafe.adriel.voyager.core.model.coroutineScope
import eu.kanade.domain.manga.interactor.GetPagePreviews
import eu.kanade.domain.manga.model.PagePreview
import eu.kanade.tachiyomi.source.Source
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.update
import tachiyomi.core.util.lang.launchIO
import tachiyomi.domain.chapter.interactor.GetChapterByMangaId
import tachiyomi.domain.chapter.model.Chapter
import tachiyomi.domain.manga.interactor.GetManga
import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.source.service.SourceManager
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class PagePreviewScreenModel(
private val mangaId: Long,
private val getPagePreviews: GetPagePreviews = Injekt.get(),
private val getManga: GetManga = Injekt.get(),
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(),
private val sourceManager: SourceManager = Injekt.get(),
) : StateScreenModel<PagePreviewState>(PagePreviewState.Loading) {
private val page = MutableStateFlow(1)
var pageDialogOpen by mutableStateOf(false)
init {
coroutineScope.launchIO {
val manga = getManga.await(mangaId)!!
val chapter = getChapterByMangaId.await(mangaId).minByOrNull { it.sourceOrder }
if (chapter == null) {
mutableState.update {
PagePreviewState.Error(Exception("No chapters found"))
}
return@launchIO
}
val source = sourceManager.getOrStub(manga.source)
page
.onEach { page ->
when (
val previews = getPagePreviews.await(manga, source, page)
) {
is GetPagePreviews.Result.Error -> mutableState.update {
PagePreviewState.Error(previews.error)
}
is GetPagePreviews.Result.Success -> mutableState.update {
when (it) {
PagePreviewState.Loading, is PagePreviewState.Error -> {
PagePreviewState.Success(
page,
previews.pagePreviews,
previews.hasNextPage,
previews.pageCount,
manga,
chapter,
source,
)
}
is PagePreviewState.Success -> it.copy(
page = page,
pagePreviews = previews.pagePreviews,
hasNextPage = previews.hasNextPage,
pageCount = previews.pageCount,
)
}
}
GetPagePreviews.Result.Unused -> Unit
}
}
.catch { e ->
mutableState.update {
PagePreviewState.Error(e)
}
}
.collect()
}
}
fun moveToPage(page: Int) {
this.page.value = page
}
}
sealed class PagePreviewState {
object Loading : PagePreviewState()
data class Success(
val page: Int,
val pagePreviews: List<PagePreview>,
val hasNextPage: Boolean,
val pageCount: Int?,
val manga: Manga,
val chapter: Chapter,
val source: Source,
) : PagePreviewState()
data class Error(val error: Throwable) : PagePreviewState()
}