komikku/app/src/main/java/exh/pagepreview/PagePreviewScreenModel.kt

109 lines
4.1 KiB
Kotlin
Raw Normal View History

package exh.pagepreview
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
2022-11-26 19:36:06 +01:00
import cafe.adriel.voyager.core.model.StateScreenModel
import cafe.adriel.voyager.core.model.coroutineScope
2022-11-06 05:33:11 +01:00
import eu.kanade.domain.chapter.model.Chapter
import eu.kanade.domain.history.interactor.GetNextChapters
import eu.kanade.domain.manga.interactor.GetManga
import eu.kanade.domain.manga.interactor.GetPagePreviews
import eu.kanade.domain.manga.model.Manga
import eu.kanade.domain.manga.model.PagePreview
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.util.lang.launchIO
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 uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
2022-11-26 19:36:06 +01:00
class PagePreviewScreenModel(
private val mangaId: Long,
private val getPagePreviews: GetPagePreviews = Injekt.get(),
private val getManga: GetManga = Injekt.get(),
private val getNextChapters: GetNextChapters = Injekt.get(),
private val sourceManager: SourceManager = Injekt.get(),
2022-11-26 19:36:06 +01:00
) : StateScreenModel<PagePreviewState>(PagePreviewState.Loading) {
private val page = MutableStateFlow(1)
var pageDialogOpen by mutableStateOf(false)
2022-11-26 19:36:06 +01:00
init {
coroutineScope.launchIO {
val manga = getManga.await(mangaId)!!
val chapter = getNextChapters.await(mangaId, onlyUnread = false).lastOrNull()
2022-11-06 05:33:11 +01:00
if (chapter == null) {
2022-11-26 19:36:06 +01:00
mutableState.update {
2022-11-06 05:33:11 +01:00
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)
) {
2022-11-26 19:36:06 +01:00
is GetPagePreviews.Result.Error -> mutableState.update {
PagePreviewState.Error(previews.error)
}
2022-11-26 19:36:06 +01:00
is GetPagePreviews.Result.Success -> mutableState.update {
when (it) {
PagePreviewState.Loading, is PagePreviewState.Error -> {
PagePreviewState.Success(
page,
previews.pagePreviews,
previews.hasNextPage,
previews.pageCount,
manga,
2022-11-06 05:33:11 +01:00
chapter,
source,
)
}
is PagePreviewState.Success -> it.copy(
page = page,
pagePreviews = previews.pagePreviews,
hasNextPage = previews.hasNextPage,
pageCount = previews.pageCount,
2022-11-06 05:33:11 +01:00
)
}
}
GetPagePreviews.Result.Unused -> Unit
}
}
.catch { e ->
2022-11-26 19:36:06 +01:00
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,
2022-11-06 05:33:11 +01:00
val chapter: Chapter,
val source: Source,
) : PagePreviewState()
data class Error(val error: Throwable) : PagePreviewState()
}