GlobalSearchScreen: Skip result screen when using search intent (#9299)
This commit is contained in:
parent
b7cd7b8b4e
commit
c1e23ec18e
1 changed files with 43 additions and 15 deletions
|
@ -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)
|
||||
}
|
||||
|
||||
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)
|
||||
if (showSingleLoadingScreen) {
|
||||
LoadingScreen()
|
||||
|
||||
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)) },
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue