Let SearchBar/SearchField use TextFieldState

This commit is contained in:
ganfra 2026-01-22 16:34:22 +01:00
parent 87619e50e8
commit fa1b32f0ba
48 changed files with 197 additions and 298 deletions

View file

@ -11,9 +11,7 @@ import io.element.android.libraries.matrix.ui.model.SelectRoomInfo
sealed interface AddRoomToSpaceEvent {
data class ToggleRoom(val room: SelectRoomInfo) : AddRoomToSpaceEvent
data class UpdateSearchQuery(val query: String) : AddRoomToSpaceEvent
data class OnSearchActiveChanged(val active: Boolean) : AddRoomToSpaceEvent
data object Save : AddRoomToSpaceEvent
data object CloseSearch : AddRoomToSpaceEvent
data object ResetSaveAction : AddRoomToSpaceEvent
}

View file

@ -7,6 +7,8 @@
package io.element.android.features.space.impl.addroom
import androidx.compose.foundation.text.input.clearText
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
@ -43,7 +45,7 @@ class AddRoomToSpacePresenter(
@Composable
override fun present(): AddRoomToSpaceState {
var selectedRooms: ImmutableList<SelectRoomInfo> by remember { mutableStateOf(persistentListOf()) }
var searchQuery by remember { mutableStateOf("") }
var searchQuery = rememberTextFieldState()
var isSearchActive by remember { mutableStateOf(false) }
val saveAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
@ -51,8 +53,8 @@ class AddRoomToSpacePresenter(
val dataSource = remember { dataSourceFactory.create(coroutineScope) }
// Update search query in data source
LaunchedEffect(searchQuery) {
dataSource.setSearchQuery(searchQuery)
LaunchedEffect(searchQuery.text) {
dataSource.setSearchQuery(searchQuery.text.toString())
}
LaunchedEffect(isSearchActive) {
dataSource.setIsActive(isSearchActive)
@ -65,7 +67,7 @@ class AddRoomToSpacePresenter(
derivedStateOf {
when {
filteredRooms.isNotEmpty() -> SearchBarResultState.Results(filteredRooms)
isSearchActive && searchQuery.isNotEmpty() -> SearchBarResultState.NoResultsFound()
isSearchActive && searchQuery.text.isNotEmpty() -> SearchBarResultState.NoResultsFound()
else -> SearchBarResultState.Initial()
}
}
@ -80,19 +82,12 @@ class AddRoomToSpacePresenter(
(selectedRooms + event.room).toImmutableList()
}
}
is AddRoomToSpaceEvent.UpdateSearchQuery -> {
searchQuery = event.query
}
is AddRoomToSpaceEvent.OnSearchActiveChanged -> {
isSearchActive = event.active
if (!event.active) {
searchQuery = ""
searchQuery.clearText()
}
}
AddRoomToSpaceEvent.CloseSearch -> {
isSearchActive = false
searchQuery = ""
}
AddRoomToSpaceEvent.Save -> {
coroutineScope.addRoomsToSpace(
selectedRooms = selectedRooms,

View file

@ -7,13 +7,14 @@
package io.element.android.features.space.impl.addroom
import androidx.compose.foundation.text.input.TextFieldState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
import io.element.android.libraries.matrix.ui.model.SelectRoomInfo
import kotlinx.collections.immutable.ImmutableList
data class AddRoomToSpaceState(
val searchQuery: String,
val searchQuery: TextFieldState,
val isSearchActive: Boolean,
val searchResults: SearchBarResultState<ImmutableList<SelectRoomInfo>>,
val selectedRooms: ImmutableList<SelectRoomInfo>,

View file

@ -7,6 +7,7 @@
package io.element.android.features.space.impl.addroom
import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
@ -69,7 +70,7 @@ internal fun anAddRoomToSpaceState(
eventSink: (AddRoomToSpaceEvent) -> Unit = {},
): AddRoomToSpaceState {
return AddRoomToSpaceState(
searchQuery = searchQuery,
searchQuery = TextFieldState(searchQuery),
searchResults = searchResults,
selectedRooms = selectedRooms,
isSearchActive = isSearchActive,

View file

@ -64,7 +64,7 @@ fun AddRoomToSpaceView(
fun onBack() {
if (state.isSearchActive) {
state.eventSink(AddRoomToSpaceEvent.CloseSearch)
state.eventSink(AddRoomToSpaceEvent.OnSearchActiveChanged(false))
} else {
onBackClick()
}
@ -105,12 +105,11 @@ fun AddRoomToSpaceView(
SearchBar(
modifier = Modifier.fillMaxWidth(),
placeHolderTitle = stringResource(CommonStrings.action_search),
query = state.searchQuery,
onQueryChange = { state.eventSink(AddRoomToSpaceEvent.UpdateSearchQuery(it)) },
queryState = state.searchQuery,
active = state.isSearchActive,
onActiveChange = { state.eventSink(AddRoomToSpaceEvent.OnSearchActiveChanged(it)) },
resultState = state.searchResults,
showBackButton = false,
resultState = state.searchResults,
contentPrefix = {
if (state.selectedRooms.isNotEmpty()) {
SelectedRoomsRow(