瀏覽代碼

Make `MigrateSourceState` similar to `MigrateState` (#7054)

FourTOne5 2 年之前
父節點
當前提交
aef1dc6eaf

+ 11 - 6
app/src/main/java/eu/kanade/presentation/source/MigrateSourceScreen.kt

@@ -26,6 +26,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
@@ -36,17 +37,16 @@ fun MigrateSourceScreen(
     onLongClickItem: (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,
             )
-        }
     }
 }
 
@@ -57,6 +57,11 @@ fun MigrateSourceList(
     onClickItem: (Source) -> Unit,
     onLongClickItem: (Source) -> Unit,
 ) {
+    if (list.isEmpty()) {
+        EmptyScreen(textResource = R.string.information_empty_library)
+        return
+    }
+
     LazyColumn(
         modifier = Modifier.nestedScroll(nestedScrollInterop),
         contentPadding = WindowInsets.navigationBars.asPaddingValues(),

+ 10 - 18
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<MigrationSourcesController>() {
 
-    private val _state: MutableStateFlow<MigrateSourceState> = MutableStateFlow(MigrateSourceState.EMPTY)
+    private val _state: MutableStateFlow<MigrateSourceState> = MutableStateFlow(MigrateSourceState.Loading)
     val state: StateFlow<MigrateSourceState> = _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<Pair<Source, Long>>?
-) {
-
-    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<Pair<Source, Long>>) : MigrateSourceState()
 }