RoomMemberModerationEvents -> RoomMemberModerationEvent

This commit is contained in:
Benoit Marty
2026-08-25 10:18:21 +02:00
parent 4e9ec1b631
commit 17213ac93e
15 changed files with 53 additions and 53 deletions
@@ -43,7 +43,7 @@ import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPr
import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories
import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.TimelineItem
import io.element.android.features.roommembermoderation.api.ModerationAction import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationRenderer import io.element.android.features.roommembermoderation.api.RoomMemberModerationRenderer
import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab
import io.element.android.libraries.androidutils.system.openUrlInExternalApp import io.element.android.libraries.androidutils.system.openUrlInExternalApp
@@ -348,7 +348,7 @@ class MessagesNode(
onSelectAction = { action, target -> onSelectAction = { action, target ->
when (action) { when (action) {
is ModerationAction.DisplayProfile -> callback.navigateToRoomMemberDetails(target.userId) is ModerationAction.DisplayProfile -> callback.navigateToRoomMemberDetails(target.userId)
else -> state.roomMemberModerationState.eventSink(RoomMemberModerationEvents.ProcessAction(action, target)) else -> state.roomMemberModerationState.eventSink(RoomMemberModerationEvent.ProcessAction(action, target))
} }
}, },
onAvatarClick = { user -> onAvatarClick = { user ->
@@ -54,7 +54,7 @@ import io.element.android.features.messages.impl.timeline.model.event.captionOrN
import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState import io.element.android.features.messages.impl.timeline.protection.TimelineProtectionState
import io.element.android.features.messages.impl.voicemessages.composer.DefaultVoiceMessageComposerPresenter import io.element.android.features.messages.impl.voicemessages.composer.DefaultVoiceMessageComposerPresenter
import io.element.android.features.roomcall.api.RoomCallState import io.element.android.features.roomcall.api.RoomCallState
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.androidutils.clipboard.ClipboardHelper import io.element.android.libraries.androidutils.clipboard.ClipboardHelper
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
@@ -263,7 +263,7 @@ class MessagesPresenter(
} }
} }
is MessagesEvent.OnUserClicked -> { is MessagesEvent.OnUserClicked -> {
roomMemberModerationState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(event.user)) roomMemberModerationState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(event.user))
} }
MessagesEvent.StopLiveLocationShare -> { MessagesEvent.StopLiveLocationShare -> {
localCoroutineScope.launch { localCoroutineScope.launch {
@@ -38,7 +38,7 @@ import io.element.android.features.messages.impl.timeline.protection.TimelinePro
import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState
import io.element.android.features.roomcall.api.RoomCallState import io.element.android.features.roomcall.api.RoomCallState
import io.element.android.features.roomcall.api.aStandByCallState import io.element.android.features.roomcall.api.aStandByCallState
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
@@ -168,7 +168,7 @@ fun aRoomMemberModerationState(
permissions: RoomMemberModerationPermissions = RoomMemberModerationPermissions.DEFAULT, permissions: RoomMemberModerationPermissions = RoomMemberModerationPermissions.DEFAULT,
) = object : RoomMemberModerationState { ) = object : RoomMemberModerationState {
override val permissions: RoomMemberModerationPermissions = permissions override val permissions: RoomMemberModerationPermissions = permissions
override val eventSink: (RoomMemberModerationEvents) -> Unit = {} override val eventSink: (RoomMemberModerationEvent) -> Unit = {}
} }
fun aUserEventPermissions( fun aUserEventPermissions(
@@ -46,7 +46,7 @@ import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPr
import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories
import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.TimelineItem
import io.element.android.features.roommembermoderation.api.ModerationAction import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationRenderer import io.element.android.features.roommembermoderation.api.RoomMemberModerationRenderer
import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab
import io.element.android.libraries.androidutils.system.openUrlInExternalApp import io.element.android.libraries.androidutils.system.openUrlInExternalApp
@@ -343,7 +343,7 @@ class ThreadedMessagesNode(
onSelectAction = { action, target -> onSelectAction = { action, target ->
when (action) { when (action) {
is ModerationAction.DisplayProfile -> callback.navigateToRoomMemberDetails(target.userId) is ModerationAction.DisplayProfile -> callback.navigateToRoomMemberDetails(target.userId)
else -> state.roomMemberModerationState.eventSink(RoomMemberModerationEvents.ProcessAction(action, target)) else -> state.roomMemberModerationState.eventSink(RoomMemberModerationEvent.ProcessAction(action, target))
} }
}, },
onAvatarClick = { user -> onAvatarClick = { user ->
@@ -21,7 +21,7 @@ import dev.zacsweers.metro.AssistedInject
import im.vector.app.features.analytics.plan.MobileScreen import im.vector.app.features.analytics.plan.MobileScreen
import io.element.android.annotations.ContributesNode import io.element.android.annotations.ContributesNode
import io.element.android.features.roommembermoderation.api.ModerationAction import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationRenderer import io.element.android.features.roommembermoderation.api.RoomMemberModerationRenderer
import io.element.android.libraries.architecture.appyx.launchMolecule import io.element.android.libraries.architecture.appyx.launchMolecule
import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.callback
@@ -81,7 +81,7 @@ class RoomMemberListNode(
onSelectAction = { action, target -> onSelectAction = { action, target ->
when (action) { when (action) {
is ModerationAction.DisplayProfile -> openRoomMemberDetails(target.userId) is ModerationAction.DisplayProfile -> openRoomMemberDetails(target.userId)
else -> state.moderationState.eventSink(RoomMemberModerationEvents.ProcessAction(action, target)) else -> state.moderationState.eventSink(RoomMemberModerationEvent.ProcessAction(action, target))
} }
}, },
onAvatarClick = { user -> onAvatarClick = { user ->
@@ -19,7 +19,7 @@ import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import dev.zacsweers.metro.Inject import dev.zacsweers.metro.Inject
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents.ShowActionsForUser import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent.ShowActionsForUser
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
@@ -10,7 +10,7 @@ package io.element.android.features.roomdetails.impl.members
import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncData
@@ -115,7 +115,7 @@ fun aRoomMemberModerationState(
canBan = canBan, canBan = canBan,
canKick = canKick, canKick = canKick,
) )
override val eventSink: (RoomMemberModerationEvents) -> Unit = {} override val eventSink: (RoomMemberModerationEvent) -> Unit = {}
} }
} }
@@ -13,7 +13,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
/** /**
* Events sent to the moderation presenter through [RoomMemberModerationState.eventSink]. * Events sent to the moderation presenter through [RoomMemberModerationState.eventSink].
*/ */
interface RoomMemberModerationEvents { interface RoomMemberModerationEvent {
data class ShowActionsForUser(val user: MatrixUser) : RoomMemberModerationEvents data class ShowActionsForUser(val user: MatrixUser) : RoomMemberModerationEvent
data class ProcessAction(val action: ModerationAction, val targetUser: MatrixUser) : RoomMemberModerationEvents data class ProcessAction(val action: ModerationAction, val targetUser: MatrixUser) : RoomMemberModerationEvent
} }
@@ -19,7 +19,7 @@ interface RoomMemberModerationState {
val permissions: RoomMemberModerationPermissions val permissions: RoomMemberModerationPermissions
/** Where the host screen sends its events to open the actions of a member or run one of them. */ /** Where the host screen sends its events to open the actions of a member or run one of them. */
val eventSink: (RoomMemberModerationEvents) -> Unit val eventSink: (RoomMemberModerationEvent) -> Unit
} }
data class ModerationActionState( data class ModerationActionState(
@@ -8,9 +8,9 @@
package io.element.android.features.roommembermoderation.impl package io.element.android.features.roommembermoderation.impl
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
sealed interface InternalRoomMemberModerationEvents : RoomMemberModerationEvents { sealed interface InternalRoomMemberModerationEvents : RoomMemberModerationEvent {
data class DoKickUser(val reason: String) : InternalRoomMemberModerationEvents data class DoKickUser(val reason: String) : InternalRoomMemberModerationEvents
data class DoBanUser(val reason: String) : InternalRoomMemberModerationEvents data class DoBanUser(val reason: String) : InternalRoomMemberModerationEvents
data class DoUnbanUser(val reason: String) : InternalRoomMemberModerationEvents data class DoUnbanUser(val reason: String) : InternalRoomMemberModerationEvents
@@ -9,7 +9,7 @@
package io.element.android.features.roommembermoderation.impl package io.element.android.features.roommembermoderation.impl
import io.element.android.features.roommembermoderation.api.ModerationActionState import io.element.android.features.roommembermoderation.api.ModerationActionState
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
@@ -23,7 +23,7 @@ data class InternalRoomMemberModerationState(
val kickUserAsyncAction: AsyncAction<Unit>, val kickUserAsyncAction: AsyncAction<Unit>,
val banUserAsyncAction: AsyncAction<Unit>, val banUserAsyncAction: AsyncAction<Unit>,
val unbanUserAsyncAction: AsyncAction<Unit>, val unbanUserAsyncAction: AsyncAction<Unit>,
override val eventSink: (RoomMemberModerationEvents) -> Unit, override val eventSink: (RoomMemberModerationEvent) -> Unit,
) : RoomMemberModerationState { ) : RoomMemberModerationState {
val canDisplayActions = actions.isNotEmpty() val canDisplayActions = actions.isNotEmpty()
} }
@@ -11,7 +11,7 @@ package io.element.android.features.roommembermoderation.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.roommembermoderation.api.ModerationAction import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.ModerationActionState import io.element.android.features.roommembermoderation.api.ModerationActionState
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.preview.USER_NAME_ALICE import io.element.android.libraries.designsystem.preview.USER_NAME_ALICE
@@ -93,7 +93,7 @@ fun aRoomMembersModerationState(
kickUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized, kickUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
banUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized, banUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
unbanUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized, unbanUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (RoomMemberModerationEvents) -> Unit = {}, eventSink: (RoomMemberModerationEvent) -> Unit = {},
) = InternalRoomMemberModerationState( ) = InternalRoomMemberModerationState(
permissions = permissions, permissions = permissions,
selectedUser = selectedUser, selectedUser = selectedUser,
@@ -20,7 +20,7 @@ import dev.zacsweers.metro.Inject
import im.vector.app.features.analytics.plan.RoomModeration import im.vector.app.features.analytics.plan.RoomModeration
import io.element.android.features.roommembermoderation.api.ModerationAction import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.ModerationActionState import io.element.android.features.roommembermoderation.api.ModerationActionState
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.features.roommembermoderation.api.roomMemberModerationPermissions import io.element.android.features.roommembermoderation.api.roomMemberModerationPermissions
@@ -77,9 +77,9 @@ class RoomMemberModerationPresenter(
} }
val moderationActions = remember { mutableStateOf<ImmutableList<ModerationActionState>>(persistentListOf()) } val moderationActions = remember { mutableStateOf<ImmutableList<ModerationActionState>>(persistentListOf()) }
fun handleEvent(event: RoomMemberModerationEvents) { fun handleEvent(event: RoomMemberModerationEvent) {
when (event) { when (event) {
is RoomMemberModerationEvents.ShowActionsForUser -> { is RoomMemberModerationEvent.ShowActionsForUser -> {
selectedUser = event.user selectedUser = event.user
val member = room.membersStateFlow.value.roomMembers()?.firstOrNull { val member = room.membersStateFlow.value.roomMembers()?.firstOrNull {
it.userId == event.user.userId it.userId == event.user.userId
@@ -90,7 +90,7 @@ class RoomMemberModerationPresenter(
currentUserPowerLevel = currentUserPowerLevel, currentUserPowerLevel = currentUserPowerLevel,
) )
} }
is RoomMemberModerationEvents.ProcessAction -> { is RoomMemberModerationEvent.ProcessAction -> {
// First, hide any list of existing actions that could be displayed // First, hide any list of existing actions that could be displayed
moderationActions.value = persistentListOf() moderationActions.value = persistentListOf()
@@ -12,7 +12,7 @@ import app.cash.turbine.TurbineTestContext
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.features.roommembermoderation.api.ModerationAction import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.ModerationActionState import io.element.android.features.roommembermoderation.api.ModerationActionState
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
@@ -73,7 +73,7 @@ class RoomMemberModerationPresenterTest {
) )
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser)) initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(1) skipItems(1)
val updatedState = awaitState() val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser) assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -93,7 +93,7 @@ class RoomMemberModerationPresenterTest {
) )
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser)) initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(2) skipItems(2)
val updatedState = awaitState() val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser) assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -115,7 +115,7 @@ class RoomMemberModerationPresenterTest {
) )
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser)) initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(2) skipItems(2)
val updatedState = awaitState() val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser) assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -137,7 +137,7 @@ class RoomMemberModerationPresenterTest {
) )
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser)) initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(2) skipItems(2)
val updatedState = awaitState() val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser) assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -159,7 +159,7 @@ class RoomMemberModerationPresenterTest {
) )
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser)) initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(2) skipItems(2)
val updatedState = awaitState() val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser) assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -175,7 +175,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = aJoinedRoom()).test { createRoomMemberModerationPresenter(room = aJoinedRoom()).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink( initialState.eventSink(
RoomMemberModerationEvents.ProcessAction( RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser, targetUser = targetUser,
action = ModerationAction.KickUser action = ModerationAction.KickUser
) )
@@ -192,7 +192,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = aJoinedRoom()).test { createRoomMemberModerationPresenter(room = aJoinedRoom()).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink( initialState.eventSink(
RoomMemberModerationEvents.ProcessAction( RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser, targetUser = targetUser,
action = ModerationAction.BanUser action = ModerationAction.BanUser
) )
@@ -209,7 +209,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = aJoinedRoom()).test { createRoomMemberModerationPresenter(room = aJoinedRoom()).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink( initialState.eventSink(
RoomMemberModerationEvents.ProcessAction( RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser, targetUser = targetUser,
action = ModerationAction.UnbanUser action = ModerationAction.UnbanUser
) )
@@ -235,7 +235,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink( initialState.eventSink(
RoomMemberModerationEvents.ProcessAction( RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser, targetUser = targetUser,
action = ModerationAction.KickUser action = ModerationAction.KickUser
) )
@@ -265,7 +265,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink( initialState.eventSink(
RoomMemberModerationEvents.ProcessAction( RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser, targetUser = targetUser,
action = ModerationAction.BanUser action = ModerationAction.BanUser
) )
@@ -295,7 +295,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink( initialState.eventSink(
RoomMemberModerationEvents.ProcessAction( RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser, targetUser = targetUser,
action = ModerationAction.UnbanUser action = ModerationAction.UnbanUser
) )
@@ -320,7 +320,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = room).test { createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink( initialState.eventSink(
RoomMemberModerationEvents.ProcessAction( RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser, targetUser = targetUser,
action = ModerationAction.KickUser action = ModerationAction.KickUser
) )
@@ -340,7 +340,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = aJoinedRoom()).test { createRoomMemberModerationPresenter(room = aJoinedRoom()).test {
val initialState = awaitState() val initialState = awaitState()
initialState.eventSink( initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(targetUser = targetUser, action = ModerationAction.BanUser) RoomMemberModerationEvent.ProcessAction(targetUser = targetUser, action = ModerationAction.BanUser)
) )
skipItems(2) skipItems(2)
initialState.eventSink(InternalRoomMemberModerationEvents.Reset) initialState.eventSink(InternalRoomMemberModerationEvents.Reset)
@@ -16,7 +16,7 @@ import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.v2.runAndroidComposeUiTest import androidx.compose.ui.test.v2.runAndroidComposeUiTest
import io.element.android.features.roommembermoderation.api.ModerationAction import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.ModerationActionState import io.element.android.features.roommembermoderation.api.ModerationActionState
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvent
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.testtags.TestTags
@@ -34,7 +34,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking on display profile action calls onSelectAction`() = runAndroidComposeUiTest { fun `clicking on display profile action calls onSelectAction`() = runAndroidComposeUiTest {
val user = anAlice() val user = anAlice()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.DisplayProfile, user) { callback -> ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.DisplayProfile, user) { callback ->
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
@@ -55,7 +55,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking on kick user action calls onSelectAction`() = runAndroidComposeUiTest { fun `clicking on kick user action calls onSelectAction`() = runAndroidComposeUiTest {
val user = anAlice() val user = anAlice()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.KickUser, user) { callback -> ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.KickUser, user) { callback ->
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
@@ -76,7 +76,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking on ban user action calls onSelectAction`() = runAndroidComposeUiTest { fun `clicking on ban user action calls onSelectAction`() = runAndroidComposeUiTest {
val user = anAlice() val user = anAlice()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.BanUser, user) { callback -> ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.BanUser, user) { callback ->
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
@@ -97,7 +97,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking on unban user action calls onSelectAction`() = runAndroidComposeUiTest { fun `clicking on unban user action calls onSelectAction`() = runAndroidComposeUiTest {
val user = anAlice() val user = anAlice()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.UnbanUser, user) { callback -> ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.UnbanUser, user) { callback ->
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
@@ -117,7 +117,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking submit on kick confirmation dialog sends DoKickUser event`() = runAndroidComposeUiTest { fun `clicking submit on kick confirmation dialog sends DoKickUser event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>() val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
selectedUser = anAlice(), selectedUser = anAlice(),
@@ -131,7 +131,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking dismiss on kick confirmation dialog sends Reset event`() = runAndroidComposeUiTest { fun `clicking dismiss on kick confirmation dialog sends Reset event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>() val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
selectedUser = anAlice(), selectedUser = anAlice(),
@@ -145,7 +145,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking submit on ban confirmation dialog sends DoBanUser event`() = runAndroidComposeUiTest { fun `clicking submit on ban confirmation dialog sends DoBanUser event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>() val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
selectedUser = anAlice(), selectedUser = anAlice(),
@@ -159,7 +159,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking dismiss on ban confirmation dialog sends Reset event`() = runAndroidComposeUiTest { fun `clicking dismiss on ban confirmation dialog sends Reset event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>() val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
selectedUser = anAlice(), selectedUser = anAlice(),
@@ -173,7 +173,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking confirm on unban confirmation dialog sends DoUnbanUser event`() = runAndroidComposeUiTest { fun `clicking confirm on unban confirmation dialog sends DoUnbanUser event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>() val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
selectedUser = anAlice(), selectedUser = anAlice(),
@@ -187,7 +187,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `clicking dismiss on unban confirmation dialog sends Reset event`() = runAndroidComposeUiTest { fun `clicking dismiss on unban confirmation dialog sends Reset event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>() val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
selectedUser = anAlice(), selectedUser = anAlice(),
@@ -201,7 +201,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test @Test
fun `disabled actions are not clickable`() = runAndroidComposeUiTest { fun `disabled actions are not clickable`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
setRoomMemberModerationView( setRoomMemberModerationView(
aRoomMembersModerationState( aRoomMembersModerationState(
selectedUser = anAlice(), selectedUser = anAlice(),