|
@@ -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)) },
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
}
|