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
@@ -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,
@@ -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"),
) )
@@ -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,
@@ -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()
} }
} }