Przeglądaj źródła

GlobalSearchScreen: Skip result screen when using search intent (#9299)

Ivan Iskandar 2 lat temu
rodzic
commit
c1e23ec18e

+ 43 - 15
app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchScreen.kt

@@ -1,8 +1,12 @@
 package eu.kanade.tachiyomi.ui.browse.source.globalsearch
 
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
 import cafe.adriel.voyager.core.model.rememberScreenModel
 import cafe.adriel.voyager.navigator.LocalNavigator
 import cafe.adriel.voyager.navigator.currentOrThrow
@@ -10,10 +14,11 @@ import eu.kanade.presentation.browse.GlobalSearchScreen
 import eu.kanade.presentation.util.Screen
 import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen
 import eu.kanade.tachiyomi.ui.manga.MangaScreen
+import tachiyomi.presentation.core.screens.LoadingScreen
 
 class GlobalSearchScreen(
     val searchQuery: String = "",
-    val extensionFilter: String = "",
+    private val extensionFilter: String = "",
 ) : Screen() {
 
     @Composable
@@ -27,21 +32,44 @@ class GlobalSearchScreen(
             )
         }
         val state by screenModel.state.collectAsState()
+        var showSingleLoadingScreen by remember {
+            mutableStateOf(searchQuery.isNotEmpty() && extensionFilter.isNotEmpty() && state.total == 1)
+        }
+
+        if (showSingleLoadingScreen) {
+            LoadingScreen()
 
-        GlobalSearchScreen(
-            state = state,
-            navigateUp = navigator::pop,
-            onChangeSearchQuery = screenModel::updateSearchQuery,
-            onSearch = screenModel::search,
-            getManga = { screenModel.getManga(it) },
-            onClickSource = {
-                if (!screenModel.incognitoMode.get()) {
-                    screenModel.lastUsedSourceId.set(it.id)
+            LaunchedEffect(state.items) {
+                when (val result = state.items.values.singleOrNull()) {
+                    SearchItemResult.Loading -> return@LaunchedEffect
+                    is SearchItemResult.Success -> {
+                        val manga = result.result.singleOrNull()
+                        if (manga != null) {
+                            navigator.replace(MangaScreen(manga.id, true))
+                        } else {
+                            // Backoff to result screen
+                            showSingleLoadingScreen = false
+                        }
+                    }
+                    else -> showSingleLoadingScreen = false
                 }
-                navigator.push(BrowseSourceScreen(it.id, state.searchQuery))
-            },
-            onClickItem = { navigator.push(MangaScreen(it.id, true)) },
-            onLongClickItem = { navigator.push(MangaScreen(it.id, true)) },
-        )
+            }
+        } else {
+            GlobalSearchScreen(
+                state = state,
+                navigateUp = navigator::pop,
+                onChangeSearchQuery = screenModel::updateSearchQuery,
+                onSearch = screenModel::search,
+                getManga = { screenModel.getManga(it) },
+                onClickSource = {
+                    if (!screenModel.incognitoMode.get()) {
+                        screenModel.lastUsedSourceId.set(it.id)
+                    }
+                    navigator.push(BrowseSourceScreen(it.id, state.searchQuery))
+                },
+                onClickItem = { navigator.push(MangaScreen(it.id, true)) },
+                onLongClickItem = { navigator.push(MangaScreen(it.id, true)) },
+            )
+        }
     }
 }