UserListEvents -> UserListEvent

This commit is contained in:
Benoit Marty
2026-08-25 10:28:07 +02:00
parent cf7d5ab4b4
commit 51a4704854
6 changed files with 26 additions and 26 deletions
@@ -24,7 +24,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
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 io.element.android.features.startchat.impl.userlist.UserListEvents import io.element.android.features.startchat.impl.userlist.UserListEvent
import io.element.android.features.startchat.impl.userlist.UserListState import io.element.android.features.startchat.impl.userlist.UserListState
import io.element.android.features.startchat.impl.userlist.UserListStatePreviewParam import io.element.android.features.startchat.impl.userlist.UserListStatePreviewParam
import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarSize
@@ -63,13 +63,13 @@ fun UserListView(
showLoader = state.showSearchLoader, showLoader = state.showSearchLoader,
isMultiSelectionEnable = state.isMultiSelectionEnabled, isMultiSelectionEnable = state.isMultiSelectionEnabled,
showBackButton = showBackButton, showBackButton = showBackButton,
onActiveChange = { state.eventSink(UserListEvents.OnSearchActiveChanged(it)) }, onActiveChange = { state.eventSink(UserListEvent.OnSearchActiveChanged(it)) },
onUserSelect = { onUserSelect = {
state.eventSink(UserListEvents.AddToSelection(it)) state.eventSink(UserListEvent.AddToSelection(it))
onSelectUser(it) onSelectUser(it)
}, },
onUserDeselect = { onUserDeselect = {
state.eventSink(UserListEvents.RemoveFromSelection(it)) state.eventSink(UserListEvent.RemoveFromSelection(it))
onDeselectUser(it) onDeselectUser(it)
}, },
) )
@@ -80,7 +80,7 @@ fun UserListView(
selectedUsers = state.selectedUsers, selectedUsers = state.selectedUsers,
autoScroll = true, autoScroll = true,
onUserRemove = { onUserRemove = {
state.eventSink(UserListEvents.RemoveFromSelection(it)) state.eventSink(UserListEvent.RemoveFromSelection(it))
onDeselectUser(it) onDeselectUser(it)
}, },
) )
@@ -104,10 +104,10 @@ fun UserListView(
checked = isSelected, checked = isSelected,
onCheckedChange = { onCheckedChange = {
if (isSelected) { if (isSelected) {
state.eventSink(UserListEvents.RemoveFromSelection(recentDirectRoom.matrixUser)) state.eventSink(UserListEvent.RemoveFromSelection(recentDirectRoom.matrixUser))
onDeselectUser(recentDirectRoom.matrixUser) onDeselectUser(recentDirectRoom.matrixUser)
} else { } else {
state.eventSink(UserListEvents.AddToSelection(recentDirectRoom.matrixUser)) state.eventSink(UserListEvent.AddToSelection(recentDirectRoom.matrixUser))
onSelectUser(recentDirectRoom.matrixUser) onSelectUser(recentDirectRoom.matrixUser)
} }
}, },
@@ -85,11 +85,11 @@ class DefaultUserListPresenter(
}.launchIn(this) }.launchIn(this)
} }
fun handleEvent(event: UserListEvents) { fun handleEvent(event: UserListEvent) {
when (event) { when (event) {
is UserListEvents.OnSearchActiveChanged -> isSearchActive = event.active is UserListEvent.OnSearchActiveChanged -> isSearchActive = event.active
is UserListEvents.AddToSelection -> userListDataStore.selectUser(event.matrixUser) is UserListEvent.AddToSelection -> userListDataStore.selectUser(event.matrixUser)
is UserListEvents.RemoveFromSelection -> userListDataStore.removeUserFromSelection(event.matrixUser) is UserListEvent.RemoveFromSelection -> userListDataStore.removeUserFromSelection(event.matrixUser)
} }
} }
@@ -10,8 +10,8 @@ package io.element.android.features.startchat.impl.userlist
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
sealed interface UserListEvents { sealed interface UserListEvent {
data class AddToSelection(val matrixUser: MatrixUser) : UserListEvents data class AddToSelection(val matrixUser: MatrixUser) : UserListEvent
data class RemoveFromSelection(val matrixUser: MatrixUser) : UserListEvents data class RemoveFromSelection(val matrixUser: MatrixUser) : UserListEvent
data class OnSearchActiveChanged(val active: Boolean) : UserListEvents data class OnSearchActiveChanged(val active: Boolean) : UserListEvent
} }
@@ -23,7 +23,7 @@ data class UserListState(
val isSearchActive: Boolean, val isSearchActive: Boolean,
val selectionMode: SelectionMode, val selectionMode: SelectionMode,
val recentDirectRooms: ImmutableList<RecentDirectRoom>, val recentDirectRooms: ImmutableList<RecentDirectRoom>,
val eventSink: (UserListEvents) -> Unit, val eventSink: (UserListEvent) -> Unit,
) { ) {
val isMultiSelectionEnabled = selectionMode == SelectionMode.Multiple val isMultiSelectionEnabled = selectionMode == SelectionMode.Multiple
} }
@@ -68,7 +68,7 @@ fun aUserListState(
showSearchLoader: Boolean = false, showSearchLoader: Boolean = false,
selectionMode: SelectionMode = SelectionMode.Single, selectionMode: SelectionMode = SelectionMode.Single,
recentDirectRooms: List<RecentDirectRoom> = emptyList(), recentDirectRooms: List<RecentDirectRoom> = emptyList(),
eventSink: (UserListEvents) -> Unit = {}, eventSink: (UserListEvent) -> Unit = {},
) = UserListState( ) = UserListState(
searchQuery = TextFieldState(initialText = searchQuery), searchQuery = TextFieldState(initialText = searchQuery),
isSearchActive = isSearchActive, isSearchActive = isSearchActive,
@@ -80,7 +80,7 @@ class DefaultUserListPresenterTest {
presenter.test { presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(UserListEvents.OnSearchActiveChanged(true)) initialState.eventSink(UserListEvent.OnSearchActiveChanged(true))
assertThat(awaitItem().isSearchActive).isTrue() assertThat(awaitItem().isSearchActive).isTrue()
val matrixIdQuery = "@name:matrix.org" val matrixIdQuery = "@name:matrix.org"
@@ -93,7 +93,7 @@ class DefaultUserListPresenterTest {
assertThat(awaitItem().searchQuery.text.toString()).isEqualTo(notMatrixIdQuery) assertThat(awaitItem().searchQuery.text.toString()).isEqualTo(notMatrixIdQuery)
assertThat(userRepository.providedQuery).isEqualTo(notMatrixIdQuery) assertThat(userRepository.providedQuery).isEqualTo(notMatrixIdQuery)
initialState.eventSink(UserListEvents.OnSearchActiveChanged(false)) initialState.eventSink(UserListEvent.OnSearchActiveChanged(false))
assertThat(awaitItem().isSearchActive).isFalse() assertThat(awaitItem().isSearchActive).isFalse()
} }
} }
@@ -190,22 +190,22 @@ class DefaultUserListPresenterTest {
val userABis = aMatrixUser("@userA:domain", "A") val userABis = aMatrixUser("@userA:domain", "A")
val userC = aMatrixUser("@userC:domain", "C") val userC = aMatrixUser("@userC:domain", "C")
initialState.eventSink(UserListEvents.AddToSelection(userA)) initialState.eventSink(UserListEvent.AddToSelection(userA))
assertThat(awaitItem().selectedUsers).containsExactly(userA) assertThat(awaitItem().selectedUsers).containsExactly(userA)
initialState.eventSink(UserListEvents.AddToSelection(userB)) initialState.eventSink(UserListEvent.AddToSelection(userB))
assertThat(awaitItem().selectedUsers).containsExactly(userA, userB) assertThat(awaitItem().selectedUsers).containsExactly(userA, userB)
initialState.eventSink(UserListEvents.AddToSelection(userABis)) initialState.eventSink(UserListEvent.AddToSelection(userABis))
initialState.eventSink(UserListEvents.AddToSelection(userC)) initialState.eventSink(UserListEvent.AddToSelection(userC))
// duplicated users should be ignored // duplicated users should be ignored
assertThat(awaitItem().selectedUsers).containsExactly(userA, userB, userC) assertThat(awaitItem().selectedUsers).containsExactly(userA, userB, userC)
initialState.eventSink(UserListEvents.RemoveFromSelection(userB)) initialState.eventSink(UserListEvent.RemoveFromSelection(userB))
assertThat(awaitItem().selectedUsers).containsExactly(userA, userC) assertThat(awaitItem().selectedUsers).containsExactly(userA, userC)
initialState.eventSink(UserListEvents.RemoveFromSelection(userA)) initialState.eventSink(UserListEvent.RemoveFromSelection(userA))
assertThat(awaitItem().selectedUsers).containsExactly(userC) assertThat(awaitItem().selectedUsers).containsExactly(userC)
initialState.eventSink(UserListEvents.RemoveFromSelection(userC)) initialState.eventSink(UserListEvent.RemoveFromSelection(userC))
assertThat(awaitItem().selectedUsers).isEmpty() assertThat(awaitItem().selectedUsers).isEmpty()
} }
} }