diff --git a/app/src/main/java/eu/kanade/presentation/source/MigrateSourceScreen.kt b/app/src/main/java/eu/kanade/presentation/source/MigrateSourceScreen.kt index 8b3abcc87..179ce3918 100644 --- a/app/src/main/java/eu/kanade/presentation/source/MigrateSourceScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/source/MigrateSourceScreen.kt @@ -28,6 +28,7 @@ import eu.kanade.presentation.source.components.BaseSourceItem import eu.kanade.presentation.theme.header import eu.kanade.presentation.util.horizontalPadding import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.ui.browse.migration.sources.MigrateSourceState import eu.kanade.tachiyomi.ui.browse.migration.sources.MigrationSourcesPresenter @Composable @@ -39,18 +40,17 @@ fun MigrateSourceScreen( onClickAll: (Source) -> Unit, ) { val state by presenter.state.collectAsState() - when { - state.isLoading -> LoadingScreen() - state.isEmpty -> EmptyScreen(textResource = R.string.information_empty_library) - else -> { + when (state) { + is MigrateSourceState.Loading -> LoadingScreen() + is MigrateSourceState.Error -> Text(text = (state as MigrateSourceState.Error).error.message!!) + is MigrateSourceState.Success -> MigrateSourceList( nestedScrollInterop = nestedScrollInterop, - list = state.sources!!, + list = (state as MigrateSourceState.Success).sources, onClickItem = onClickItem, onLongClickItem = onLongClickItem, onClickAll = onClickAll ) - } } } @@ -62,6 +62,11 @@ fun MigrateSourceList( onLongClickItem: (Source) -> Unit, onClickAll: (Source) -> Unit, ) { + if (list.isEmpty()) { + EmptyScreen(textResource = R.string.information_empty_library) + return + } + LazyColumn( modifier = Modifier.nestedScroll(nestedScrollInterop), contentPadding = WindowInsets.navigationBars.asPaddingValues(), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt index 1d4ca46c3..37a2c1069 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt @@ -9,8 +9,8 @@ import eu.kanade.tachiyomi.util.lang.launchIO import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.update import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -19,7 +19,7 @@ class MigrationSourcesPresenter( private val setMigrateSorting: SetMigrateSorting = Injekt.get() ) : BasePresenter() { - private val _state: MutableStateFlow = MutableStateFlow(MigrateSourceState.EMPTY) + private val _state: MutableStateFlow = MutableStateFlow(MigrateSourceState.Loading) val state: StateFlow = _state.asStateFlow() override fun onCreate(savedState: Bundle?) { @@ -27,10 +27,11 @@ class MigrationSourcesPresenter( presenterScope.launchIO { getSourcesWithFavoriteCount.subscribe() + .catch { exception -> + _state.emit(MigrateSourceState.Error(exception)) + } .collectLatest { sources -> - _state.update { state -> - state.copy(sources = sources) - } + _state.emit(MigrateSourceState.Success(sources)) } } } @@ -44,17 +45,8 @@ class MigrationSourcesPresenter( } } -data class MigrateSourceState( - val sources: List>? -) { - - val isLoading: Boolean - get() = sources == null - - val isEmpty: Boolean - get() = sources.isNullOrEmpty() - - companion object { - val EMPTY = MigrateSourceState(null) - } +sealed class MigrateSourceState { + object Loading : MigrateSourceState() + data class Error(val error: Throwable) : MigrateSourceState() + data class Success(val sources: List>) : MigrateSourceState() }