Show result when searching for matrix id
This commit is contained in:
parent
567ff3eb15
commit
33890aca70
6 changed files with 63 additions and 15 deletions
|
|
@ -17,6 +17,7 @@
|
||||||
package io.element.android.features.createroom.impl.root
|
package io.element.android.features.createroom.impl.root
|
||||||
|
|
||||||
sealed interface CreateRoomRootEvents {
|
sealed interface CreateRoomRootEvents {
|
||||||
|
data class UpdateSearchQuery(val query: String): CreateRoomRootEvents
|
||||||
object CreateRoom : CreateRoomRootEvents
|
object CreateRoom : CreateRoomRootEvents
|
||||||
object InvitePeople : CreateRoomRootEvents
|
object InvitePeople : CreateRoomRootEvents
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,15 @@
|
||||||
package io.element.android.features.createroom.impl.root
|
package io.element.android.features.createroom.impl.root
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
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.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
|
import javax.inject.Inject
|
||||||
|
|
||||||
class CreateRoomRootPresenter @Inject constructor() : Presenter<CreateRoomRootState> {
|
class CreateRoomRootPresenter @Inject constructor() : Presenter<CreateRoomRootState> {
|
||||||
|
|
@ -25,15 +33,27 @@ class CreateRoomRootPresenter @Inject constructor() : Presenter<CreateRoomRootSt
|
||||||
@Composable
|
@Composable
|
||||||
override fun present(): CreateRoomRootState {
|
override fun present(): CreateRoomRootState {
|
||||||
|
|
||||||
|
var searchQuery by rememberSaveable { mutableStateOf("") }
|
||||||
|
val searchResults = if (MatrixPatterns.isUserId(searchQuery)) {
|
||||||
|
immutableListOf(MatrixUser(UserId(searchQuery)))
|
||||||
|
} else {
|
||||||
|
immutableListOf()
|
||||||
|
}
|
||||||
|
|
||||||
fun handleEvents(event: CreateRoomRootEvents) {
|
fun handleEvents(event: CreateRoomRootEvents) {
|
||||||
when (event) {
|
when (event) {
|
||||||
CreateRoomRootEvents.CreateRoom -> Unit // Todo Handle create room action
|
CreateRoomRootEvents.CreateRoom -> Unit // Todo Handle create room action
|
||||||
CreateRoomRootEvents.InvitePeople -> Unit // Todo Handle invite people action
|
CreateRoomRootEvents.InvitePeople -> Unit // Todo Handle invite people action
|
||||||
|
is CreateRoomRootEvents.UpdateSearchQuery -> {
|
||||||
|
searchQuery = event.query
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return CreateRoomRootState(
|
return CreateRoomRootState(
|
||||||
eventSink = ::handleEvents
|
eventSink = ::handleEvents,
|
||||||
|
searchQuery = searchQuery,
|
||||||
|
searchResults = searchResults,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,12 @@
|
||||||
|
|
||||||
package io.element.android.features.createroom.impl.root
|
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.
|
// Do not use default value, so no member get forgotten in the presenters.
|
||||||
data class CreateRoomRootState(
|
data class CreateRoomRootState(
|
||||||
val eventSink: (CreateRoomRootEvents) -> Unit
|
val eventSink: (CreateRoomRootEvents) -> Unit,
|
||||||
|
val searchQuery: String,
|
||||||
|
val searchResults: ImmutableList<MatrixUser>,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,9 @@
|
||||||
package io.element.android.features.createroom.impl.root
|
package io.element.android.features.createroom.impl.root
|
||||||
|
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
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<CreateRoomRootState> {
|
open class CreateRoomRootStateProvider : PreviewParameterProvider<CreateRoomRootState> {
|
||||||
override val values: Sequence<CreateRoomRootState>
|
override val values: Sequence<CreateRoomRootState>
|
||||||
|
|
@ -27,5 +30,7 @@ open class CreateRoomRootStateProvider : PreviewParameterProvider<CreateRoomRoot
|
||||||
}
|
}
|
||||||
|
|
||||||
fun aCreateRoomRootState() = CreateRoomRootState(
|
fun aCreateRoomRootState() = CreateRoomRootState(
|
||||||
eventSink = {}
|
eventSink = {},
|
||||||
|
searchQuery = "@someone:example.org",
|
||||||
|
searchResults = immutableListOf(MatrixUser(UserId("@someone:example.org"))),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
import io.element.android.libraries.designsystem.components.button.BackButton
|
import io.element.android.libraries.designsystem.components.button.BackButton
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||||
|
|
@ -54,6 +55,8 @@ import io.element.android.libraries.designsystem.theme.components.Icon
|
||||||
import io.element.android.libraries.designsystem.theme.components.IconButton
|
import io.element.android.libraries.designsystem.theme.components.IconButton
|
||||||
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
import io.element.android.libraries.designsystem.theme.components.Scaffold
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
|
import io.element.android.libraries.matrix.ui.components.MatrixUserRow
|
||||||
|
import io.element.android.libraries.matrix.ui.model.MatrixUser
|
||||||
import io.element.android.libraries.designsystem.R as DrawableR
|
import io.element.android.libraries.designsystem.R as DrawableR
|
||||||
import io.element.android.libraries.ui.strings.R as StringR
|
import io.element.android.libraries.ui.strings.R as StringR
|
||||||
|
|
||||||
|
|
@ -64,7 +67,6 @@ fun CreateRoomRootView(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onClosePressed: () -> Unit = {},
|
onClosePressed: () -> Unit = {},
|
||||||
) {
|
) {
|
||||||
var searchText by rememberSaveable { mutableStateOf("") }
|
|
||||||
var isSearchActive by rememberSaveable { mutableStateOf(false) }
|
var isSearchActive by rememberSaveable { mutableStateOf(false) }
|
||||||
Scaffold(
|
Scaffold(
|
||||||
modifier = modifier.fillMaxWidth(),
|
modifier = modifier.fillMaxWidth(),
|
||||||
|
|
@ -80,11 +82,12 @@ fun CreateRoomRootView(
|
||||||
) {
|
) {
|
||||||
CreateRoomSearchBar(
|
CreateRoomSearchBar(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
text = searchText,
|
query = state.searchQuery,
|
||||||
placeHolderTitle = stringResource(StringR.string.search_for_someone),
|
placeHolderTitle = stringResource(StringR.string.search_for_someone),
|
||||||
|
results = state.searchResults,
|
||||||
active = isSearchActive,
|
active = isSearchActive,
|
||||||
onActiveChanged = { isSearchActive = it },
|
onActiveChanged = { isSearchActive = it },
|
||||||
onTextChanged = { searchText = it },
|
onTextChanged = { state.eventSink(CreateRoomRootEvents.UpdateSearchQuery(it)) },
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!isSearchActive) {
|
if (!isSearchActive) {
|
||||||
|
|
@ -123,8 +126,9 @@ fun CreateRoomRootViewTopBar(
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun CreateRoomSearchBar(
|
fun CreateRoomSearchBar(
|
||||||
text: String,
|
query: String,
|
||||||
placeHolderTitle: String,
|
placeHolderTitle: String,
|
||||||
|
results: List<MatrixUser>,
|
||||||
active: Boolean,
|
active: Boolean,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
onActiveChanged: (Boolean) -> Unit = {},
|
onActiveChanged: (Boolean) -> Unit = {},
|
||||||
|
|
@ -138,7 +142,7 @@ fun CreateRoomSearchBar(
|
||||||
}
|
}
|
||||||
|
|
||||||
DockedSearchBar(
|
DockedSearchBar(
|
||||||
query = text,
|
query = query,
|
||||||
onQueryChange = onTextChanged,
|
onQueryChange = onTextChanged,
|
||||||
onSearch = { focusManager.clearFocus() },
|
onSearch = { focusManager.clearFocus() },
|
||||||
active = active,
|
active = active,
|
||||||
|
|
@ -155,7 +159,7 @@ fun CreateRoomSearchBar(
|
||||||
{ BackButton(onClick = { onActiveChanged(false) }) }
|
{ BackButton(onClick = { onActiveChanged(false) }) }
|
||||||
} else null,
|
} else null,
|
||||||
trailingIcon = when {
|
trailingIcon = when {
|
||||||
active && text.isNotEmpty() -> {
|
active && query.isNotEmpty() -> {
|
||||||
{
|
{
|
||||||
IconButton(onClick = { onTextChanged("") }) {
|
IconButton(onClick = { onTextChanged("") }) {
|
||||||
Icon(Icons.Default.Close, stringResource(StringR.string.a11y_clear))
|
Icon(Icons.Default.Close, stringResource(StringR.string.a11y_clear))
|
||||||
|
|
@ -175,7 +179,9 @@ fun CreateRoomSearchBar(
|
||||||
},
|
},
|
||||||
shape = if (!active) SearchBarDefaults.dockedShape else SearchBarDefaults.fullScreenShape,
|
shape = if (!active) SearchBarDefaults.dockedShape else SearchBarDefaults.fullScreenShape,
|
||||||
colors = if (!active) SearchBarDefaults.colors() else SearchBarDefaults.colors(containerColor = Color.Transparent),
|
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
|
@Composable
|
||||||
fun CreateRoomActionButton(
|
fun CreateRoomActionButton(
|
||||||
@DrawableRes iconRes: Int,
|
@DrawableRes iconRes: Int,
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
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.ElementPreviewDark
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
|
|
@ -45,6 +46,7 @@ import io.element.android.libraries.matrix.ui.model.getBestName
|
||||||
fun MatrixUserRow(
|
fun MatrixUserRow(
|
||||||
matrixUser: MatrixUser,
|
matrixUser: MatrixUser,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
avatarSize: AvatarSize = matrixUser.avatarData.size,
|
||||||
onClick: () -> Unit = {},
|
onClick: () -> Unit = {},
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
|
|
@ -56,13 +58,11 @@ fun MatrixUserRow(
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
) {
|
) {
|
||||||
Avatar(
|
Avatar(
|
||||||
matrixUser.avatarData,
|
matrixUser.avatarData.copy(size = avatarSize),
|
||||||
)
|
)
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(start = 12.dp, end = 4.dp, top = 12.dp, bottom = 12.dp)
|
.padding(start = 12.dp, end = 4.dp, top = 12.dp, bottom = 12.dp),
|
||||||
.alignByBaseline()
|
|
||||||
.weight(1f)
|
|
||||||
) {
|
) {
|
||||||
// Name
|
// Name
|
||||||
Text(
|
Text(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue