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 25a1c2936d
commit 70a8b7395b
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 io.element.android.libraries.matrix.ui.model.MatrixUser
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableSet
data class SelectUsersState( data class SelectUsersState(
val searchQuery: String, val searchQuery: String,
val searchResults: ImmutableList<MatrixUser>, val searchResults: ImmutableList<MatrixUser>,
val selectedUsers: ImmutableList<MatrixUser>, val selectedUsers: ImmutableSet<MatrixUser>,
val isSearchActive: Boolean, val isSearchActive: Boolean,
val isMultiSelectionEnabled: Boolean, val isMultiSelectionEnabled: Boolean,
val eventSink: (SelectUsersEvents) -> Unit, 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.api.core.UserId
import io.element.android.libraries.matrix.ui.model.MatrixUser import io.element.android.libraries.matrix.ui.model.MatrixUser
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.persistentSetOf
open class SelectUsersStateProvider : PreviewParameterProvider<SelectUsersState> { open class SelectUsersStateProvider : PreviewParameterProvider<SelectUsersState> {
override val values: Sequence<SelectUsersState> override val values: Sequence<SelectUsersState>
@ -31,14 +32,14 @@ open class SelectUsersStateProvider : PreviewParameterProvider<SelectUsersState>
aSelectUsersState().copy( aSelectUsersState().copy(
isSearchActive = true, isSearchActive = true,
searchQuery = "@someone:matrix.org", searchQuery = "@someone:matrix.org",
selectedUsers = aListOfSelectedUsers(), selectedUsers = aSetOfSelectedUsers(),
searchResults = aListOfResults(), searchResults = aListOfResults(),
), ),
aSelectUsersState().copy( aSelectUsersState().copy(
isSearchActive = true, isSearchActive = true,
searchQuery = "@someone:matrix.org", searchQuery = "@someone:matrix.org",
isMultiSelectionEnabled = true, isMultiSelectionEnabled = true,
selectedUsers = aListOfSelectedUsers(), selectedUsers = aSetOfSelectedUsers(),
searchResults = aListOfResults(), searchResults = aListOfResults(),
) )
) )
@ -48,12 +49,12 @@ fun aSelectUsersState() = SelectUsersState(
isSearchActive = false, isSearchActive = false,
searchQuery = "", searchQuery = "",
searchResults = persistentListOf(), searchResults = persistentListOf(),
selectedUsers = persistentListOf(), selectedUsers = persistentSetOf(),
isMultiSelectionEnabled = false, isMultiSelectionEnabled = false,
eventSink = {} eventSink = {}
) )
fun aListOfSelectedUsers() = persistentListOf( fun aSetOfSelectedUsers() = persistentSetOf(
MatrixUser(id = UserId("@someone:matrix.org")), MatrixUser(id = UserId("@someone:matrix.org")),
MatrixUser(id = UserId("@someone:matrix.org"), username = "someone"), 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.MatrixUser
import io.element.android.libraries.matrix.ui.model.getBestName import io.element.android.libraries.matrix.ui.model.getBestName
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableSet
import io.element.android.libraries.ui.strings.R as StringR import io.element.android.libraries.ui.strings.R as StringR
@Composable @Composable
@ -99,7 +100,7 @@ fun SelectUsersView(
fun SearchUserBar( fun SearchUserBar(
query: String, query: String,
results: ImmutableList<MatrixUser>, results: ImmutableList<MatrixUser>,
selectedUsers: ImmutableList<MatrixUser>, selectedUsers: ImmutableSet<MatrixUser>,
active: Boolean, active: Boolean,
isMultiSelectionEnabled: Boolean, isMultiSelectionEnabled: Boolean,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@ -192,7 +193,7 @@ fun SearchUserResultItem(
@Composable @Composable
fun SelectedUsersList( fun SelectedUsersList(
selectedUsers: List<MatrixUser>, selectedUsers: ImmutableSet<MatrixUser>,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onUserRemoved: (MatrixUser) -> Unit = {}, onUserRemoved: (MatrixUser) -> Unit = {},
) { ) {
@ -200,7 +201,7 @@ fun SelectedUsersList(
modifier = modifier, modifier = modifier,
horizontalArrangement = Arrangement.spacedBy(24.dp), horizontalArrangement = Arrangement.spacedBy(24.dp),
) { ) {
items(selectedUsers) { matrixUser -> items(selectedUsers.toList()) { matrixUser ->
SelectedUser( SelectedUser(
matrixUser = matrixUser, matrixUser = matrixUser,
onUserRemoved = onUserRemoved, 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.api.core.UserId
import io.element.android.libraries.matrix.ui.model.MatrixUser import io.element.android.libraries.matrix.ui.model.MatrixUser
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableSet
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.persistentSetOf
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableSet
interface DefaultSelectUsersPresenter : Presenter<SelectUsersState> { interface DefaultSelectUsersPresenter : Presenter<SelectUsersState> {
@ -41,8 +44,8 @@ interface DefaultSelectUsersPresenter : Presenter<SelectUsersState> {
@Composable @Composable
override fun present(): SelectUsersState { override fun present(): SelectUsersState {
var isSearchActive by rememberSaveable { mutableStateOf(false) } var isSearchActive by rememberSaveable { mutableStateOf(false) }
val selectedUsers: MutableState<ImmutableList<MatrixUser>> = remember { val selectedUsers: MutableState<ImmutableSet<MatrixUser>> = remember {
mutableStateOf(persistentListOf()) mutableStateOf(persistentSetOf())
} }
var searchQuery by rememberSaveable { mutableStateOf("") } var searchQuery by rememberSaveable { mutableStateOf("") }
val searchResults: MutableState<ImmutableList<MatrixUser>> = remember { val searchResults: MutableState<ImmutableList<MatrixUser>> = remember {
@ -53,8 +56,8 @@ interface DefaultSelectUsersPresenter : Presenter<SelectUsersState> {
when (event) { when (event) {
is SelectUsersEvents.OnSearchActiveChanged -> isSearchActive = event.active is SelectUsersEvents.OnSearchActiveChanged -> isSearchActive = event.active
is SelectUsersEvents.UpdateSearchQuery -> searchQuery = event.query is SelectUsersEvents.UpdateSearchQuery -> searchQuery = event.query
is SelectUsersEvents.AddToSelection -> selectedUsers.value = selectedUsers.value.plus(event.matrixUser).toImmutableList() is SelectUsersEvents.AddToSelection -> selectedUsers.value = selectedUsers.value.plus(event.matrixUser).toImmutableSet()
is SelectUsersEvents.RemoveFromSelection -> selectedUsers.value = selectedUsers.value.minus(event.matrixUser).toImmutableList() is SelectUsersEvents.RemoveFromSelection -> selectedUsers.value = selectedUsers.value.minus(event.matrixUser).toImmutableSet()
} }
} }