From 1d609f88d250cf30363d1f2c933dd180960895f7 Mon Sep 17 00:00:00 2001 From: Eugene Date: Mon, 17 Aug 2026 20:18:50 +0300 Subject: [PATCH] update search screen logic --- apps/vbox/client/androidApp/build.gradle.kts | 2 +- .../preview/SearchScreenPreview.kt | 6 +- .../shared/presentation/list/VideoScreen.kt | 3 +- .../presentation/list/VideoScreenComponent.kt | 6 +- .../vbox/shared/presentation/nav/Route.kt | 5 +- .../presentation/search/SearchScreen.kt | 59 +++++++++---------- .../search/SearchScreenComponent.kt | 4 +- 7 files changed, 47 insertions(+), 38 deletions(-) diff --git a/apps/vbox/client/androidApp/build.gradle.kts b/apps/vbox/client/androidApp/build.gradle.kts index 9e1faaa..b66ce2f 100644 --- a/apps/vbox/client/androidApp/build.gradle.kts +++ b/apps/vbox/client/androidApp/build.gradle.kts @@ -7,7 +7,7 @@ plugins { alias(libs.plugins.convention.ktor.client) } -val appVersion = "1.26.6" +val appVersion = "1.26.7" android { buildFeatures { buildConfig = true } diff --git a/apps/vbox/client/androidApp/src/main/kotlin/ru/shadowsparky/videobox/multiplatform/preview/SearchScreenPreview.kt b/apps/vbox/client/androidApp/src/main/kotlin/ru/shadowsparky/videobox/multiplatform/preview/SearchScreenPreview.kt index c1d319d..995c1cc 100644 --- a/apps/vbox/client/androidApp/src/main/kotlin/ru/shadowsparky/videobox/multiplatform/preview/SearchScreenPreview.kt +++ b/apps/vbox/client/androidApp/src/main/kotlin/ru/shadowsparky/videobox/multiplatform/preview/SearchScreenPreview.kt @@ -21,7 +21,8 @@ fun AppBarWithSearchPreview() { AppBarWithSearch( title = "TitleWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", isDefault = false, - onBack = {} + onBack = {}, + onEdit = {} ) } @@ -30,7 +31,8 @@ fun AppBarWithSearchPreview() { fun AppBarWithSearchWithBackPreview() { AppBarWithSearch( title = "TitleWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", - onBack = {} + onBack = {}, + onEdit = {} ) } diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreen.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreen.kt index e31d0b2..36b31e6 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreen.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreen.kt @@ -69,7 +69,8 @@ fun VideoScreen(component: VideoScreenComponent) { AppBarWithSearch( title, isDefault = title == appName, - onBack = { component.doBack() } + onBack = { component.doBack() }, + onEdit = { component.doEdit() } ) } ) diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreenComponent.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreenComponent.kt index 39c0f11..0be78bb 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreenComponent.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/list/VideoScreenComponent.kt @@ -26,7 +26,8 @@ class VideoScreenComponent( private val dispatcherProvider: DispatcherProvider, val search: String? = null, val showOverview: (Long) -> Unit, - val doBack: () -> Unit + val doBack: () -> Unit, + val doEdit: () -> Unit ) : ComponentContext by context { private val componentScope = createComponentScope() private val _items = MutableStateFlow?>(null) @@ -65,7 +66,8 @@ class VideosChildFactory( dispatcherProvider, route.request, showOverview = { root.nav(Route.Overview(it)) }, - doBack = { root.onBack() } + doBack = { root.onBack() }, + doEdit = { root.navReplace(Route.SearchVideos(route.request)) } ) return Child.VideosChild(comp) } diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/nav/Route.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/nav/Route.kt index b0d737c..ba774f6 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/nav/Route.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/nav/Route.kt @@ -13,7 +13,10 @@ sealed class Route : ru.shadowsparky.ui.nav.Route() { ) : Route() @Serializable - data class SearchVideos(override val routeId: String = RouteIds.SEARCH) : Route() + data class SearchVideos( + val request: String? = null, + override val routeId: String = RouteIds.SEARCH + ) : Route() @Serializable data class Bookmark(override val routeId: String = RouteIds.BOOKMARK) : Route() diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreen.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreen.kt index a6b6ee6..7068f0a 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreen.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreen.kt @@ -63,6 +63,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import ru.shadowsparky.ui.components.AppBarWithSearch +import ru.shadowsparky.ui.components.BackButton import ru.shadowsparky.ui.components.ExpressiveLazyColumn import ru.shadowsparky.ui.components.IconButton import ru.shadowsparky.vbox.shared.presentation.MainScreenScaffold @@ -77,7 +78,8 @@ fun SearchScreen( ) { val requester by remember { mutableStateOf(FocusRequester()) } var textFieldValue by rememberSaveable(stateSaver = TextFieldValue.Saver) { - mutableStateOf(TextFieldValue()) + val text = component.defaultRequest + mutableStateOf(TextFieldValue(text, TextRange(text.length))) } MainScreenScaffold( appBar = { @@ -218,28 +220,28 @@ fun SearchAppBar( AppBarWithSearch( inputField = { TextField( - value = textFieldValue, - onValueChange = { onValueChange(it) }, - colors = getTextFieldsColors(), - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), - keyboardActions = KeyboardActions(onDone = { onDone() }), - modifier = Modifier.fillMaxWidth() - .focusRequester(inputFocusRequester) - .onFocusChanged { - if (it.isFocused) keyboardController?.show() - }.requestFocusOnDownEvent(focusRequester), - trailingIcon = { - if (textFieldValue.text.isNotEmpty()) { - IconButton(onClick = { - onValueChange(TextFieldValue("")) - }) { - Icon(painterResource(Res.drawable.clear_text), null) + value = textFieldValue, + onValueChange = { onValueChange(it) }, + colors = getTextFieldsColors(), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + keyboardActions = KeyboardActions(onDone = { onDone() }), + modifier = Modifier.fillMaxWidth() + .focusRequester(inputFocusRequester) + .onFocusChanged { + if (it.isFocused) keyboardController?.show() + }.requestFocusOnDownEvent(focusRequester), + trailingIcon = { + if (textFieldValue.text.isNotEmpty()) { + IconButton(onClick = { + onValueChange(TextFieldValue("")) + }) { + Icon(painterResource(Res.drawable.clear_text), null) + } } - } - }, - singleLine = true, - label = { Text(stringResource(Res.string.search)) } - ) + }, + singleLine = true, + label = { Text(stringResource(Res.string.search)) } + ) } ) LaunchedEffect("focus") { @@ -272,7 +274,8 @@ fun AppBarWithSearch( title: String, isDefault: Boolean = false, actions: @Composable RowScope.() -> Unit = {}, - onBack: (() -> Unit) + onBack: (() -> Unit), + onEdit: (() -> Unit) ) { AppBarWithSearch( actions = { actions(this) }, @@ -281,16 +284,12 @@ fun AppBarWithSearch( Surface( modifier = Modifier .fillMaxWidth() - .clickable(enabled = !isDefault) { onBack() }, + .clickable(enabled = !isDefault) { onEdit() }, shape = RoundedCornerShape(12.dp), color = Color.Transparent ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 14.dp), - verticalAlignment = Alignment.CenterVertically - ) { + Row(modifier = Modifier, verticalAlignment = Alignment.CenterVertically) { + BackButton { onBack() } Text(text = title, maxLines = 1) } } diff --git a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreenComponent.kt b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreenComponent.kt index 82fb6d7..63753e6 100644 --- a/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreenComponent.kt +++ b/apps/vbox/client/shared/src/commonMain/kotlin/ru/shadowsparky/vbox/shared/presentation/search/SearchScreenComponent.kt @@ -18,6 +18,7 @@ class SearchScreenComponent( val search: (String) -> Unit, val doBack: () -> Unit, private val searchRepository: SearchRepository, + val defaultRequest: String ) : ComponentContext by context { val info = searchRepository.search("").map { it.reversed() } private val componentScope = createComponentScope() @@ -50,7 +51,8 @@ class SearchScreenFactory( child, search = { root.nav(Route.Videos(it)) }, doBack = { root.onBack() }, - searchRepository + searchRepository, + route.request.orEmpty() ) return Child.SearchChild(comp) }