Using an immutable set for the selected users

This commit is contained in:
Maxime NATUREL 2023-03-15 15:26:07 +01:00 committed by Florian Renaud
parent d0158c06dc
commit f3c4c828b2
4 changed files with 18 additions and 12 deletions

View file

@ -18,11 +18,12 @@ package io.element.android.features.selectusers.api
import io.element.android.libraries.matrix.ui.model.MatrixUser
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableSet
data class SelectUsersState(
val searchQuery: String,
val searchResults: ImmutableList<MatrixUser>,
val selectedUsers: ImmutableList<MatrixUser>,
val selectedUsers: ImmutableSet<MatrixUser>,
val isSearchActive: Boolean,
val isMultiSelectionEnabled: Boolean,
val eventSink: (SelectUsersEvents) -> Unit,

View file

@ -20,6 +20,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.ui.model.MatrixUser
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.persistentSetOf
open class SelectUsersStateProvider : PreviewParameterProvider<SelectUsersState> {
override val values: Sequence<SelectUsersState>
@ -31,14 +32,14 @@ open class SelectUsersStateProvider : PreviewParameterProvider<SelectUsersState>
aSelectUsersState().copy(
isSearchActive = true,
searchQuery = "@someone:matrix.org",
selectedUsers = aListOfSelectedUsers(),
selectedUsers = aSetOfSelectedUsers(),
searchResults = aListOfResults(),
),
aSelectUsersState().copy(
isSearchActive = true,
searchQuery = "@someone:matrix.org",
isMultiSelectionEnabled = true,
selectedUsers = aListOfSelectedUsers(),
selectedUsers = aSetOfSelectedUsers(),
searchResults = aListOfResults(),
)
)
@ -48,12 +49,12 @@ fun aSelectUsersState() = SelectUsersState(
isSearchActive = false,
searchQuery = "",
searchResults = persistentListOf(),
selectedUsers = persistentListOf(),
selectedUsers = persistentSetOf(),
isMultiSelectionEnabled = false,
eventSink = {}
)
fun aListOfSelectedUsers() = persistentListOf(
fun aSetOfSelectedUsers() = persistentSetOf(
MatrixUser(id = UserId("@someone:matrix.org")),
MatrixUser(id = UserId("@someone:matrix.org"), username = "someone"),
)

View file

@ -59,6 +59,7 @@ import io.element.android.libraries.matrix.ui.components.MatrixUserRow
import io.element.android.libraries.matrix.ui.model.MatrixUser
import io.element.android.libraries.matrix.ui.model.getBestName
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableSet
import io.element.android.libraries.ui.strings.R as StringR
@Composable
@ -99,7 +100,7 @@ fun SelectUsersView(
fun SearchUserBar(
query: String,
results: ImmutableList<MatrixUser>,
selectedUsers: ImmutableList<MatrixUser>,
selectedUsers: ImmutableSet<MatrixUser>,
active: Boolean,
isMultiSelectionEnabled: Boolean,
modifier: Modifier = Modifier,
@ -192,7 +193,7 @@ fun SearchUserResultItem(
@Composable
fun SelectedUsersList(
selectedUsers: List<MatrixUser>,
selectedUsers: ImmutableSet<MatrixUser>,
modifier: Modifier = Modifier,
onUserRemoved: (MatrixUser) -> Unit = {},
) {
@ -200,7 +201,7 @@ fun SelectedUsersList(
modifier = modifier,
horizontalArrangement = Arrangement.spacedBy(24.dp),
) {
items(selectedUsers) { matrixUser ->
items(selectedUsers.toList()) { matrixUser ->
SelectedUser(
matrixUser = matrixUser,
onUserRemoved = onUserRemoved,

View file

@ -31,8 +31,11 @@ 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 kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableSet
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.persistentSetOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableSet
interface DefaultSelectUsersPresenter : Presenter<SelectUsersState> {
@ -41,8 +44,8 @@ interface DefaultSelectUsersPresenter : Presenter<SelectUsersState> {
@Composable
override fun present(): SelectUsersState {
var isSearchActive by rememberSaveable { mutableStateOf(false) }
val selectedUsers: MutableState<ImmutableList<MatrixUser>> = remember {
mutableStateOf(persistentListOf())
val selectedUsers: MutableState<ImmutableSet<MatrixUser>> = remember {
mutableStateOf(persistentSetOf())
}
var searchQuery by rememberSaveable { mutableStateOf("") }
val searchResults: MutableState<ImmutableList<MatrixUser>> = remember {
@ -53,8 +56,8 @@ interface DefaultSelectUsersPresenter : Presenter<SelectUsersState> {
when (event) {
is SelectUsersEvents.OnSearchActiveChanged -> isSearchActive = event.active
is SelectUsersEvents.UpdateSearchQuery -> searchQuery = event.query
is SelectUsersEvents.AddToSelection -> selectedUsers.value = selectedUsers.value.plus(event.matrixUser).toImmutableList()
is SelectUsersEvents.RemoveFromSelection -> selectedUsers.value = selectedUsers.value.minus(event.matrixUser).toImmutableList()
is SelectUsersEvents.AddToSelection -> selectedUsers.value = selectedUsers.value.plus(event.matrixUser).toImmutableSet()
is SelectUsersEvents.RemoveFromSelection -> selectedUsers.value = selectedUsers.value.minus(event.matrixUser).toImmutableSet()
}
}