From b9fd2e100daa000a423c83e4d03525b9980f5480 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 22 Nov 2023 15:38:39 +0200 Subject: [PATCH] Fallback to local manga on network error --- .../details/domain/DetailsLoadUseCase.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsLoadUseCase.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsLoadUseCase.kt index e4c71e2cb..70d910265 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsLoadUseCase.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsLoadUseCase.kt @@ -11,8 +11,8 @@ import kotlinx.coroutines.async import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.runInterruptible +import okio.IOException import org.koitharu.kotatsu.core.model.isLocal -import org.koitharu.kotatsu.core.os.NetworkState import org.koitharu.kotatsu.core.parser.MangaDataRepository import org.koitharu.kotatsu.core.parser.MangaIntent import org.koitharu.kotatsu.core.parser.MangaRepository @@ -33,7 +33,6 @@ class DetailsLoadUseCase @Inject constructor( private val mangaRepositoryFactory: MangaRepository.Factory, private val recoverUseCase: RecoverMangaUseCase, private val imageGetter: Html.ImageGetter, - private val networkState: NetworkState, ) { operator fun invoke(intent: MangaIntent): Flow = channelFlow { @@ -48,16 +47,15 @@ class DetailsLoadUseCase @Inject constructor( null } send(MangaDetails(manga, null, null, false)) - if (!networkState.value) { - // try load offline instead - local?.await()?.manga?.let { localManga -> + try { + val details = getDetails(manga) + send(MangaDetails(details, local?.peek(), details.description?.parseAsHtml(withImages = false), false)) + send(MangaDetails(details, local?.await(), details.description?.parseAsHtml(withImages = true), true)) + } catch (e: IOException) { + local?.await()?.manga?.also { localManga -> send(MangaDetails(localManga, null, localManga.description?.parseAsHtml(withImages = false), true)) - return@channelFlow - } + } ?: throw e } - val details = getDetails(manga) - send(MangaDetails(details, local?.peek(), details.description?.parseAsHtml(withImages = false), false)) - send(MangaDetails(details, local?.await(), details.description?.parseAsHtml(withImages = true), true)) } private suspend fun getDetails(seed: Manga) = runCatchingCancellable {