From 9e4e4b6124df1639e0de2ac022c78b384617ff82 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Thu, 9 Mar 2023 18:46:57 +0100 Subject: [PATCH] Show result when searching for matrix id --- .../impl/root/CreateRoomRootEvents.kt | 1 + .../impl/root/CreateRoomRootPresenter.kt | 22 ++++++++++++- .../impl/root/CreateRoomRootState.kt | 8 +++-- .../impl/root/CreateRoomRootStateProvider.kt | 7 +++- .../impl/root/CreateRoomRootView.kt | 32 +++++++++++++++---- .../matrix/ui/components/MatrixUserRow.kt | 8 ++--- 6 files changed, 63 insertions(+), 15 deletions(-) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt index 2159caf0aa..4562dd53de 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt @@ -17,6 +17,7 @@ package io.element.android.features.createroom.impl.root sealed interface CreateRoomRootEvents { + data class UpdateSearchQuery(val query: String): CreateRoomRootEvents object CreateRoom : CreateRoomRootEvents object InvitePeople : CreateRoomRootEvents } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt index 6ff99f421c..987534d090 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt @@ -17,7 +17,15 @@ package io.element.android.features.createroom.impl.root import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import com.bumble.appyx.core.collections.immutableListOf import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.matrix.api.core.MatrixPatterns +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.ui.model.MatrixUser import javax.inject.Inject class CreateRoomRootPresenter @Inject constructor() : Presenter { @@ -25,15 +33,27 @@ class CreateRoomRootPresenter @Inject constructor() : Presenter Unit // Todo Handle create room action CreateRoomRootEvents.InvitePeople -> Unit // Todo Handle invite people action + is CreateRoomRootEvents.UpdateSearchQuery -> { + searchQuery = event.query + } } } return CreateRoomRootState( - eventSink = ::handleEvents + eventSink = ::handleEvents, + searchQuery = searchQuery, + searchResults = searchResults, ) } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt index 3e47b322b7..d4d09ee0fc 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootState.kt @@ -16,8 +16,12 @@ package io.element.android.features.createroom.impl.root -// TODO add your ui models. Remove the eventSink if you don't have events. +import com.bumble.appyx.core.collections.ImmutableList +import io.element.android.libraries.matrix.ui.model.MatrixUser + // Do not use default value, so no member get forgotten in the presenters. data class CreateRoomRootState( - val eventSink: (CreateRoomRootEvents) -> Unit + val eventSink: (CreateRoomRootEvents) -> Unit, + val searchQuery: String, + val searchResults: ImmutableList, ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt index 4c3049d32f..ea26edb7df 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt @@ -17,6 +17,9 @@ package io.element.android.features.createroom.impl.root import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import com.bumble.appyx.core.collections.immutableListOf +import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.ui.model.MatrixUser open class CreateRoomRootStateProvider : PreviewParameterProvider { override val values: Sequence @@ -27,5 +30,7 @@ open class CreateRoomRootStateProvider : PreviewParameterProvider Unit = {}, ) { - var searchText by rememberSaveable { mutableStateOf("") } var isSearchActive by rememberSaveable { mutableStateOf(false) } Scaffold( modifier = modifier.fillMaxWidth(), @@ -80,11 +82,12 @@ fun CreateRoomRootView( ) { CreateRoomSearchBar( modifier = Modifier.fillMaxWidth(), - text = searchText, + query = state.searchQuery, placeHolderTitle = stringResource(StringR.string.search_for_someone), + results = state.searchResults, active = isSearchActive, onActiveChanged = { isSearchActive = it }, - onTextChanged = { searchText = it }, + onTextChanged = { state.eventSink(CreateRoomRootEvents.UpdateSearchQuery(it)) }, ) if (!isSearchActive) { @@ -123,8 +126,9 @@ fun CreateRoomRootViewTopBar( @OptIn(ExperimentalMaterial3Api::class) @Composable fun CreateRoomSearchBar( - text: String, + query: String, placeHolderTitle: String, + results: List, active: Boolean, modifier: Modifier = Modifier, onActiveChanged: (Boolean) -> Unit = {}, @@ -138,7 +142,7 @@ fun CreateRoomSearchBar( } DockedSearchBar( - query = text, + query = query, onQueryChange = onTextChanged, onSearch = { focusManager.clearFocus() }, active = active, @@ -155,7 +159,7 @@ fun CreateRoomSearchBar( { BackButton(onClick = { onActiveChanged(false) }) } } else null, trailingIcon = when { - active && text.isNotEmpty() -> { + active && query.isNotEmpty() -> { { IconButton(onClick = { onTextChanged("") }) { Icon(Icons.Default.Close, stringResource(StringR.string.a11y_clear)) @@ -175,7 +179,9 @@ fun CreateRoomSearchBar( }, shape = if (!active) SearchBarDefaults.dockedShape else SearchBarDefaults.fullScreenShape, colors = if (!active) SearchBarDefaults.colors() else SearchBarDefaults.colors(containerColor = Color.Transparent), - content = {}, + content = { + results.forEach { CreateRoomSearchResultItem(matrixUser = it) } + }, ) } @@ -199,6 +205,18 @@ fun CreateRoomActionButtonsList( } } +@Composable +fun CreateRoomSearchResultItem( + matrixUser: MatrixUser, + modifier: Modifier = Modifier, +) { + MatrixUserRow( + modifier = modifier.heightIn(min = 56.dp), + matrixUser = matrixUser, + avatarSize = AvatarSize.SMALL, + ) +} + @Composable fun CreateRoomActionButton( @DrawableRes iconRes: Int, diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt index aaa5e35b16..3e3a769e8b 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt @@ -34,6 +34,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.element.android.libraries.designsystem.components.avatar.Avatar +import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Text @@ -45,6 +46,7 @@ import io.element.android.libraries.matrix.ui.model.getBestName fun MatrixUserRow( matrixUser: MatrixUser, modifier: Modifier = Modifier, + avatarSize: AvatarSize = matrixUser.avatarData.size, onClick: () -> Unit = {}, ) { Row( @@ -56,13 +58,11 @@ fun MatrixUserRow( verticalAlignment = Alignment.CenterVertically ) { Avatar( - matrixUser.avatarData, + matrixUser.avatarData.copy(size = avatarSize), ) Column( modifier = Modifier - .padding(start = 12.dp, end = 4.dp, top = 12.dp, bottom = 12.dp) - .alignByBaseline() - .weight(1f) + .padding(start = 12.dp, end = 4.dp, top = 12.dp, bottom = 12.dp), ) { // Name Text(