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

(cherry picked from commit c1e23ec18e54a53d1f027f66e71822a99602f603)
This commit is contained in:
Ivan Iskandar 2023-04-08 09:18:48 +07:00 committed by Jobobby04
parent 4f984cef5f
commit 8ea4298f13

View File

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