DefaultInvitePeopleEvents -> DefaultInvitePeopleEvent

This commit is contained in:
Benoit Marty
2026-08-25 09:56:59 +02:00
parent 983d05fc13
commit 55a7d278c9
4 changed files with 35 additions and 35 deletions
@@ -11,9 +11,9 @@ package io.element.android.features.invitepeople.impl
import io.element.android.features.invitepeople.api.InvitePeopleEvent import io.element.android.features.invitepeople.api.InvitePeopleEvent
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
sealed interface DefaultInvitePeopleEvents : InvitePeopleEvent { sealed interface DefaultInvitePeopleEvent : InvitePeopleEvent {
data class ToggleUser(val user: MatrixUser) : DefaultInvitePeopleEvents data class ToggleUser(val user: MatrixUser) : DefaultInvitePeopleEvent
data class OnSearchActiveChanged(val active: Boolean) : DefaultInvitePeopleEvents data class OnSearchActiveChanged(val active: Boolean) : DefaultInvitePeopleEvent
data object DismissUnknownUsersModal : DefaultInvitePeopleEvents data object DismissUnknownUsersModal : DefaultInvitePeopleEvent
data object RemoveUnknownUsers : DefaultInvitePeopleEvents data object RemoveUnknownUsers : DefaultInvitePeopleEvent
} }
@@ -182,23 +182,23 @@ class DefaultInvitePeoplePresenter(
fun handleEvent(event: InvitePeopleEvent) { fun handleEvent(event: InvitePeopleEvent) {
when (event) { when (event) {
// Dedicated `when` for exhaustivity. // Dedicated `when` for exhaustivity.
is DefaultInvitePeopleEvents -> when (event) { is DefaultInvitePeopleEvent -> when (event) {
is DefaultInvitePeopleEvents.OnSearchActiveChanged -> { is DefaultInvitePeopleEvent.OnSearchActiveChanged -> {
searchActive = event.active searchActive = event.active
if (!event.active) { if (!event.active) {
queryState.clearText() queryState.clearText()
} }
} }
is DefaultInvitePeopleEvents.ToggleUser -> { is DefaultInvitePeopleEvent.ToggleUser -> {
selectedUsers.toggleUser(event.user) selectedUsers.toggleUser(event.user)
searchResults.toggleUser(event.user) searchResults.toggleUser(event.user)
// suggestions will automatically update via derivedStateOf when selectedUsers changes // suggestions will automatically update via derivedStateOf when selectedUsers changes
} }
is DefaultInvitePeopleEvents.DismissUnknownUsersModal -> { is DefaultInvitePeopleEvent.DismissUnknownUsersModal -> {
sendInvitesAction.value = AsyncAction.Uninitialized sendInvitesAction.value = AsyncAction.Uninitialized
} }
is DefaultInvitePeopleEvents.RemoveUnknownUsers -> { is DefaultInvitePeopleEvent.RemoveUnknownUsers -> {
val usersToRemove = selectedUsers.value.filter { it in unknownUsers } val usersToRemove = selectedUsers.value.filter { it in unknownUsers }
usersToRemove.forEach { user -> usersToRemove.forEach { user ->
selectedUsers.toggleUser(user) selectedUsers.toggleUser(user)
@@ -102,7 +102,7 @@ private fun InvitePeopleContentView(
verticalArrangement = Arrangement.spacedBy(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp),
) { ) {
fun toggleUser(user: MatrixUser) { fun toggleUser(user: MatrixUser) {
state.eventSink(DefaultInvitePeopleEvents.ToggleUser(user)) state.eventSink(DefaultInvitePeopleEvent.ToggleUser(user))
} }
InvitePeopleSearchBar( InvitePeopleSearchBar(
@@ -114,7 +114,7 @@ private fun InvitePeopleContentView(
active = state.isSearchActive, active = state.isSearchActive,
onActiveChange = { onActiveChange = {
state.eventSink( state.eventSink(
DefaultInvitePeopleEvents.OnSearchActiveChanged( DefaultInvitePeopleEvent.OnSearchActiveChanged(
it it
) )
) )
@@ -144,7 +144,7 @@ private fun InvitePeopleContentView(
CheckableUserRow( CheckableUserRow(
checked = invitableUser.isSelected, checked = invitableUser.isSelected,
onCheckedChange = { onCheckedChange = {
state.eventSink(DefaultInvitePeopleEvents.ToggleUser(invitableUser.matrixUser)) state.eventSink(DefaultInvitePeopleEvent.ToggleUser(invitableUser.matrixUser))
}, },
data = CheckableUserRowData.Resolved( data = CheckableUserRowData.Resolved(
avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem), avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem),
@@ -163,9 +163,9 @@ private fun InvitePeopleContentView(
if (state.sendInvitesAction is ConfirmingUnknownUserInvitation) { if (state.sendInvitesAction is ConfirmingUnknownUserInvitation) {
InvitePeopleConfirmModal( InvitePeopleConfirmModal(
users = state.sendInvitesAction.users, users = state.sendInvitesAction.users,
onDismiss = { state.eventSink.invoke(DefaultInvitePeopleEvents.DismissUnknownUsersModal) }, onDismiss = { state.eventSink.invoke(DefaultInvitePeopleEvent.DismissUnknownUsersModal) },
onInvite = { state.eventSink.invoke(InvitePeopleEvent.SendInvites) }, onInvite = { state.eventSink.invoke(InvitePeopleEvent.SendInvites) },
onRemove = { state.eventSink.invoke(DefaultInvitePeopleEvents.RemoveUnknownUsers) } onRemove = { state.eventSink.invoke(DefaultInvitePeopleEvent.RemoveUnknownUsers) }
) )
} }
} }
@@ -88,7 +88,7 @@ internal class DefaultInvitePeoplePresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
skipItems(1) skipItems(1)
initialState.eventSink(DefaultInvitePeopleEvents.OnSearchActiveChanged(true)) initialState.eventSink(DefaultInvitePeopleEvent.OnSearchActiveChanged(true))
val resultState = awaitItemAsDefault() val resultState = awaitItemAsDefault()
assertThat(resultState.isSearchActive).isTrue() assertThat(resultState.isSearchActive).isTrue()
@@ -290,18 +290,18 @@ internal class DefaultInvitePeoplePresenterTest {
skipItems(1) skipItems(1)
// When we toggle a user not in the list, they are added // When we toggle a user not in the list, they are added
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(aMatrixUser())) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(aMatrixUser()))
assertThat(awaitItemAsDefault().selectedUsers).containsExactly(aMatrixUser()) assertThat(awaitItemAsDefault().selectedUsers).containsExactly(aMatrixUser())
// Toggling a different user also adds them // Toggling a different user also adds them
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(aMatrixUser(id = A_USER_ID_2.value))) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(aMatrixUser(id = A_USER_ID_2.value)))
assertThat(awaitItemAsDefault().selectedUsers).containsExactly( assertThat(awaitItemAsDefault().selectedUsers).containsExactly(
aMatrixUser(), aMatrixUser(),
aMatrixUser(id = A_USER_ID_2.value) aMatrixUser(id = A_USER_ID_2.value)
) )
// Toggling the first user removes them // Toggling the first user removes them
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(aMatrixUser())) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(aMatrixUser()))
assertThat(awaitItemAsDefault().selectedUsers).containsExactly(aMatrixUser(id = A_USER_ID_2.value)) assertThat(awaitItemAsDefault().selectedUsers).containsExactly(aMatrixUser(id = A_USER_ID_2.value))
} }
} }
@@ -319,7 +319,7 @@ internal class DefaultInvitePeoplePresenterTest {
val selectedUser = aMatrixUser(displayName = "John Doe") val selectedUser = aMatrixUser(displayName = "John Doe")
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser)) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(selectedUser))
initialState.searchQuery.setTextAndPlaceCursorAtEnd("some query") initialState.searchQuery.setTextAndPlaceCursorAtEnd("some query")
skipItems(1) skipItems(1)
@@ -373,7 +373,7 @@ internal class DefaultInvitePeoplePresenterTest {
} }
// And then a user is toggled // And then a user is toggled
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser)) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(selectedUser))
skipItems(1) skipItems(1)
val resultState = awaitItemAsDefault() val resultState = awaitItemAsDefault()
@@ -414,7 +414,7 @@ internal class DefaultInvitePeoplePresenterTest {
repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser)
skipItems(1) skipItems(1)
// And then a user is toggled // And then a user is toggled
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser)) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(selectedUser))
skipItems(1) skipItems(1)
val resultState = awaitItemAsDefault() val resultState = awaitItemAsDefault()
// The results are updated... // The results are updated...
@@ -468,7 +468,7 @@ internal class DefaultInvitePeoplePresenterTest {
repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser) repository.emitStateWithUsers(users = aMatrixUserList() + selectedUser)
skipItems(1) skipItems(1)
// And then a user is toggled // And then a user is toggled
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(selectedUser)) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(selectedUser))
skipItems(1) skipItems(1)
val resultState = awaitItemAsDefault() val resultState = awaitItemAsDefault()
// The results are updated... // The results are updated...
@@ -645,11 +645,11 @@ internal class DefaultInvitePeoplePresenterTest {
skipItems(1) skipItems(1)
// When we toggle a user not in the list, they are added, and we fetch their identity. // When we toggle a user not in the list, they are added, and we fetch their identity.
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(alice)) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(alice))
delay(100) delay(100)
awaitItemAsDefault().eventSink(DefaultInvitePeopleEvents.ToggleUser(bob)) awaitItemAsDefault().eventSink(DefaultInvitePeopleEvent.ToggleUser(bob))
delay(100) delay(100)
awaitItemAsDefault().eventSink(DefaultInvitePeopleEvents.ToggleUser(charlie)) awaitItemAsDefault().eventSink(DefaultInvitePeopleEvent.ToggleUser(charlie))
delay(100) delay(100)
// If we do not have their identity cached, or fail to fetch it, we should mark them as unknown. // If we do not have their identity cached, or fail to fetch it, we should mark them as unknown.
@@ -712,11 +712,11 @@ internal class DefaultInvitePeoplePresenterTest {
skipItems(1) skipItems(1)
// When we toggle a user not in the list, they are added, and we fetch their identity. // When we toggle a user not in the list, they are added, and we fetch their identity.
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(alice)) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(alice))
delay(100) delay(100)
awaitItemAsDefault().eventSink(DefaultInvitePeopleEvents.ToggleUser(bob)) awaitItemAsDefault().eventSink(DefaultInvitePeopleEvent.ToggleUser(bob))
delay(100) delay(100)
awaitItemAsDefault().eventSink(DefaultInvitePeopleEvents.ToggleUser(charlie)) awaitItemAsDefault().eventSink(DefaultInvitePeopleEvent.ToggleUser(charlie))
delay(100) delay(100)
// And the search is matching Alice and Bob // And the search is matching Alice and Bob
@@ -751,7 +751,7 @@ internal class DefaultInvitePeoplePresenterTest {
awaitItemAsDefault().run { awaitItemAsDefault().run {
assertThat(sendInvitesAction).isInstanceOf(ConfirmingUnknownUserInvitation::class.java) assertThat(sendInvitesAction).isInstanceOf(ConfirmingUnknownUserInvitation::class.java)
assertThat(canInvite).isTrue() assertThat(canInvite).isTrue()
eventSink(DefaultInvitePeopleEvents.RemoveUnknownUsers) eventSink(DefaultInvitePeopleEvent.RemoveUnknownUsers)
} }
// Selecting "remove" should remove all unknown users, but keeps those who are known. // Selecting "remove" should remove all unknown users, but keeps those who are known.
@@ -794,11 +794,11 @@ internal class DefaultInvitePeoplePresenterTest {
skipItems(1) skipItems(1)
// When we toggle a user not in the list, they are added, and we fetch their identity. // When we toggle a user not in the list, they are added, and we fetch their identity.
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(alice)) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(alice))
delay(100) delay(100)
awaitItemAsDefault().eventSink(DefaultInvitePeopleEvents.ToggleUser(bob)) awaitItemAsDefault().eventSink(DefaultInvitePeopleEvent.ToggleUser(bob))
delay(100) delay(100)
awaitItemAsDefault().eventSink(DefaultInvitePeopleEvents.ToggleUser(charlie)) awaitItemAsDefault().eventSink(DefaultInvitePeopleEvent.ToggleUser(charlie))
delay(100) delay(100)
awaitItemAsDefault().run { awaitItemAsDefault().run {
@@ -816,7 +816,7 @@ internal class DefaultInvitePeoplePresenterTest {
awaitItemAsDefault().run { awaitItemAsDefault().run {
assertThat(sendInvitesAction).isInstanceOf(ConfirmingUnknownUserInvitation::class.java) assertThat(sendInvitesAction).isInstanceOf(ConfirmingUnknownUserInvitation::class.java)
assertThat(canInvite).isTrue() assertThat(canInvite).isTrue()
eventSink(DefaultInvitePeopleEvents.DismissUnknownUsersModal) eventSink(DefaultInvitePeopleEvent.DismissUnknownUsersModal)
} }
// Dismissing should not modify the selection at all // Dismissing should not modify the selection at all
@@ -853,7 +853,7 @@ internal class DefaultInvitePeoplePresenterTest {
skipItems(1) skipItems(1)
// We want to add a new user to a DM // We want to add a new user to a DM
initialState.eventSink(DefaultInvitePeopleEvents.ToggleUser(alice)) initialState.eventSink(DefaultInvitePeopleEvent.ToggleUser(alice))
// And we send the invites // And we send the invites
initialState.eventSink(InvitePeopleEvent.SendInvites) initialState.eventSink(InvitePeopleEvent.SendInvites)