BlockedUsersEvents -> BlockedUsersEvent

This commit is contained in:
Benoit Marty
2026-08-25 10:08:17 +02:00
parent e6be199d4a
commit d8e7031709
7 changed files with 35 additions and 35 deletions
@@ -10,9 +10,9 @@ package io.element.android.features.preferences.impl.blockedusers
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
sealed interface BlockedUsersEvents { sealed interface BlockedUsersEvent {
data class Unblock(val userId: UserId) : BlockedUsersEvents data class Unblock(val userId: UserId) : BlockedUsersEvent
data class CopyToClipboard(val userId: UserId) : BlockedUsersEvents data class CopyToClipboard(val userId: UserId) : BlockedUsersEvent
data object ConfirmUnblock : BlockedUsersEvents data object ConfirmUnblock : BlockedUsersEvent
data object Cancel : BlockedUsersEvents data object Cancel : BlockedUsersEvent
} }
@@ -74,23 +74,23 @@ class BlockedUsersPresenter(
val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState()
fun handleEvent(event: BlockedUsersEvents) { fun handleEvent(event: BlockedUsersEvent) {
when (event) { when (event) {
is BlockedUsersEvents.Unblock -> { is BlockedUsersEvent.Unblock -> {
pendingUserToUnblock = event.userId pendingUserToUnblock = event.userId
unblockUserAction.value = AsyncAction.ConfirmingNoParams unblockUserAction.value = AsyncAction.ConfirmingNoParams
} }
is BlockedUsersEvents.CopyToClipboard -> { is BlockedUsersEvent.CopyToClipboard -> {
clipboardHelper.copyPlainText(event.userId.value) clipboardHelper.copyPlainText(event.userId.value)
snackbarDispatcher.post(SnackbarMessage(CommonStrings.common_copied_to_clipboard)) snackbarDispatcher.post(SnackbarMessage(CommonStrings.common_copied_to_clipboard))
} }
BlockedUsersEvents.ConfirmUnblock -> { BlockedUsersEvent.ConfirmUnblock -> {
pendingUserToUnblock?.let { pendingUserToUnblock?.let {
coroutineScope.unblockUser(it, unblockUserAction) coroutineScope.unblockUser(it, unblockUserAction)
pendingUserToUnblock = null pendingUserToUnblock = null
} }
} }
BlockedUsersEvents.Cancel -> { BlockedUsersEvent.Cancel -> {
pendingUserToUnblock = null pendingUserToUnblock = null
unblockUserAction.value = AsyncAction.Uninitialized unblockUserAction.value = AsyncAction.Uninitialized
} }
@@ -17,5 +17,5 @@ data class BlockedUsersState(
val blockedUsers: ImmutableList<MatrixUser>, val blockedUsers: ImmutableList<MatrixUser>,
val unblockUserAction: AsyncAction<Unit>, val unblockUserAction: AsyncAction<Unit>,
val snackbarMessage: SnackbarMessage?, val snackbarMessage: SnackbarMessage?,
val eventSink: (BlockedUsersEvents) -> Unit, val eventSink: (BlockedUsersEvent) -> Unit,
) )
@@ -32,7 +32,7 @@ internal fun aBlockedUsersState(
blockedUsers: List<MatrixUser> = aMatrixUserList(), blockedUsers: List<MatrixUser> = aMatrixUserList(),
unblockUserAction: AsyncAction<Unit> = AsyncAction.Uninitialized, unblockUserAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
snackbarMessage: SnackbarMessage? = null, snackbarMessage: SnackbarMessage? = null,
eventSink: (BlockedUsersEvents) -> Unit = {}, eventSink: (BlockedUsersEvent) -> Unit = {},
): BlockedUsersState { ): BlockedUsersState {
return BlockedUsersState( return BlockedUsersState(
blockedUsers = blockedUsers.toImmutableList(), blockedUsers = blockedUsers.toImmutableList(),
@@ -64,8 +64,8 @@ fun BlockedUsersView(
items(state.blockedUsers) { matrixUser -> items(state.blockedUsers) { matrixUser ->
BlockedUserItem( BlockedUserItem(
matrixUser = matrixUser, matrixUser = matrixUser,
onClick = { state.eventSink(BlockedUsersEvents.Unblock(it)) }, onClick = { state.eventSink(BlockedUsersEvent.Unblock(it)) },
onLongClick = { state.eventSink(BlockedUsersEvents.CopyToClipboard(it)) }, onLongClick = { state.eventSink(BlockedUsersEvent.CopyToClipboard(it)) },
) )
} }
} }
@@ -99,8 +99,8 @@ fun BlockedUsersView(
title = stringResource(R.string.screen_blocked_users_unblock_alert_title), title = stringResource(R.string.screen_blocked_users_unblock_alert_title),
content = stringResource(R.string.screen_blocked_users_unblock_alert_description), content = stringResource(R.string.screen_blocked_users_unblock_alert_description),
submitText = stringResource(R.string.screen_blocked_users_unblock_alert_action), submitText = stringResource(R.string.screen_blocked_users_unblock_alert_action),
onSubmitClick = { state.eventSink(BlockedUsersEvents.ConfirmUnblock) }, onSubmitClick = { state.eventSink(BlockedUsersEvent.ConfirmUnblock) },
onDismiss = { state.eventSink(BlockedUsersEvents.Cancel) } onDismiss = { state.eventSink(BlockedUsersEvent.Cancel) }
) )
} }
else -> Unit else -> Unit
@@ -33,7 +33,7 @@ import org.junit.Test
class BlockedUserViewTest : RobolectricTest() { class BlockedUserViewTest : RobolectricTest() {
@Test @Test
fun `clicking on back invokes back callback`() = runAndroidComposeUiTest { fun `clicking on back invokes back callback`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<BlockedUsersEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<BlockedUsersEvent>(expectEvents = false)
ensureCalledOnce { callback -> ensureCalledOnce { callback ->
setBlockedUsersView( setBlockedUsersView(
aBlockedUsersState( aBlockedUsersState(
@@ -47,7 +47,7 @@ class BlockedUserViewTest : RobolectricTest() {
@Test @Test
fun `clicking on a user emits the expected Event`() = runAndroidComposeUiTest { fun `clicking on a user emits the expected Event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<BlockedUsersEvents>() val eventsRecorder = EventsRecorder<BlockedUsersEvent>()
val userList = aMatrixUserList() val userList = aMatrixUserList()
setBlockedUsersView( setBlockedUsersView(
aBlockedUsersState( aBlockedUsersState(
@@ -56,12 +56,12 @@ class BlockedUserViewTest : RobolectricTest() {
), ),
) )
onNodeWithText(userList.first().displayName.orEmpty()).performClick() onNodeWithText(userList.first().displayName.orEmpty()).performClick()
eventsRecorder.assertSingle(BlockedUsersEvents.Unblock(userList.first().userId)) eventsRecorder.assertSingle(BlockedUsersEvent.Unblock(userList.first().userId))
} }
@Test @Test
fun `long clicking on a user emits the expected Event`() = runAndroidComposeUiTest { fun `long clicking on a user emits the expected Event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<BlockedUsersEvents>() val eventsRecorder = EventsRecorder<BlockedUsersEvent>()
val userList = aMatrixUserList() val userList = aMatrixUserList()
setBlockedUsersView( setBlockedUsersView(
aBlockedUsersState( aBlockedUsersState(
@@ -70,12 +70,12 @@ class BlockedUserViewTest : RobolectricTest() {
), ),
) )
onNodeWithText(userList.first().displayName.orEmpty()).performTouchInput { longClick() } onNodeWithText(userList.first().displayName.orEmpty()).performTouchInput { longClick() }
eventsRecorder.assertSingle(BlockedUsersEvents.CopyToClipboard(userList.first().userId)) eventsRecorder.assertSingle(BlockedUsersEvent.CopyToClipboard(userList.first().userId))
} }
@Test @Test
fun `clicking on cancel sends a BlockedUsersEvents`() = runAndroidComposeUiTest { fun `clicking on cancel sends a BlockedUsersEvent`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<BlockedUsersEvents>() val eventsRecorder = EventsRecorder<BlockedUsersEvent>()
setBlockedUsersView( setBlockedUsersView(
aBlockedUsersState( aBlockedUsersState(
unblockUserAction = AsyncAction.ConfirmingNoParams, unblockUserAction = AsyncAction.ConfirmingNoParams,
@@ -83,12 +83,12 @@ class BlockedUserViewTest : RobolectricTest() {
), ),
) )
clickOn(CommonStrings.action_cancel) clickOn(CommonStrings.action_cancel)
eventsRecorder.assertSingle(BlockedUsersEvents.Cancel) eventsRecorder.assertSingle(BlockedUsersEvent.Cancel)
} }
@Test @Test
fun `clicking on confirm sends a BlockedUsersEvents`() = runAndroidComposeUiTest { fun `clicking on confirm sends a BlockedUsersEvent`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<BlockedUsersEvents>() val eventsRecorder = EventsRecorder<BlockedUsersEvent>()
setBlockedUsersView( setBlockedUsersView(
aBlockedUsersState( aBlockedUsersState(
unblockUserAction = AsyncAction.ConfirmingNoParams, unblockUserAction = AsyncAction.ConfirmingNoParams,
@@ -96,7 +96,7 @@ class BlockedUserViewTest : RobolectricTest() {
), ),
) )
clickOn(R.string.screen_blocked_users_unblock_alert_action) clickOn(R.string.screen_blocked_users_unblock_alert_action)
eventsRecorder.assertSingle(BlockedUsersEvents.ConfirmUnblock) eventsRecorder.assertSingle(BlockedUsersEvent.ConfirmUnblock)
} }
} }
@@ -118,10 +118,10 @@ class BlockedUsersPresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(BlockedUsersEvents.Unblock(A_USER_ID)) initialState.eventSink(BlockedUsersEvent.Unblock(A_USER_ID))
assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Confirming::class.java) assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Confirming::class.java)
initialState.eventSink(BlockedUsersEvents.ConfirmUnblock) initialState.eventSink(BlockedUsersEvent.ConfirmUnblock)
assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Loading::class.java)
assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Success::class.java) assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Success::class.java)
@@ -141,10 +141,10 @@ class BlockedUsersPresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(BlockedUsersEvents.Unblock(A_USER_ID)) initialState.eventSink(BlockedUsersEvent.Unblock(A_USER_ID))
assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Confirming::class.java) assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Confirming::class.java)
initialState.eventSink(BlockedUsersEvents.ConfirmUnblock) initialState.eventSink(BlockedUsersEvent.ConfirmUnblock)
assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Loading::class.java)
assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Failure::class.java) assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Failure::class.java)
@@ -163,10 +163,10 @@ class BlockedUsersPresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(BlockedUsersEvents.Unblock(A_USER_ID)) initialState.eventSink(BlockedUsersEvent.Unblock(A_USER_ID))
assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Confirming::class.java) assertThat(awaitItem().unblockUserAction).isInstanceOf(AsyncAction.Confirming::class.java)
initialState.eventSink(BlockedUsersEvents.Cancel) initialState.eventSink(BlockedUsersEvent.Cancel)
assertThat(awaitItem().unblockUserAction).isEqualTo(AsyncAction.Uninitialized) assertThat(awaitItem().unblockUserAction).isEqualTo(AsyncAction.Uninitialized)
} }
@@ -187,7 +187,7 @@ class BlockedUsersPresenterTest {
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.snackbarMessage).isNull() assertThat(initialState.snackbarMessage).isNull()
initialState.eventSink(BlockedUsersEvents.CopyToClipboard(A_USER_ID)) initialState.eventSink(BlockedUsersEvent.CopyToClipboard(A_USER_ID))
assertThat(clipboardHelper.clipboardContents).isEqualTo(A_USER_ID.value) assertThat(clipboardHelper.clipboardContents).isEqualTo(A_USER_ID.value)
assertThat(awaitItem().snackbarMessage?.messageResId).isEqualTo(CommonStrings.common_copied_to_clipboard) assertThat(awaitItem().snackbarMessage?.messageResId).isEqualTo(CommonStrings.common_copied_to_clipboard)
@@ -201,7 +201,7 @@ class BlockedUsersPresenterTest {
moleculeFlow(RecompositionMode.Immediate) { moleculeFlow(RecompositionMode.Immediate) {
presenter.present() presenter.present()
}.test { }.test {
awaitItem().eventSink(BlockedUsersEvents.ConfirmUnblock) awaitItem().eventSink(BlockedUsersEvent.ConfirmUnblock)
ensureAllEventsConsumed() ensureAllEventsConsumed()
} }
} }