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.model.TimelineItem
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.libraries.androidutils.browser.openUrlInChromeCustomTab
import io.element.android.libraries.androidutils.system.openUrlInExternalApp
@@ -348,7 +348,7 @@ class MessagesNode(
onSelectAction = { action, target ->
when (action) {
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 ->
@@ -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.voicemessages.composer.DefaultVoiceMessageComposerPresenter
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.libraries.androidutils.clipboard.ClipboardHelper
import io.element.android.libraries.architecture.AsyncData
@@ -263,7 +263,7 @@ class MessagesPresenter(
}
}
is MessagesEvent.OnUserClicked -> {
roomMemberModerationState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(event.user))
roomMemberModerationState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(event.user))
}
MessagesEvent.StopLiveLocationShare -> {
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.roomcall.api.RoomCallState
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.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncData
@@ -168,7 +168,7 @@ fun aRoomMemberModerationState(
permissions: RoomMemberModerationPermissions = RoomMemberModerationPermissions.DEFAULT,
) = object : RoomMemberModerationState {
override val permissions: RoomMemberModerationPermissions = permissions
override val eventSink: (RoomMemberModerationEvents) -> Unit = {}
override val eventSink: (RoomMemberModerationEvent) -> Unit = {}
}
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.model.TimelineItem
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.libraries.androidutils.browser.openUrlInChromeCustomTab
import io.element.android.libraries.androidutils.system.openUrlInExternalApp
@@ -343,7 +343,7 @@ class ThreadedMessagesNode(
onSelectAction = { action, target ->
when (action) {
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 ->
@@ -21,7 +21,7 @@ import dev.zacsweers.metro.AssistedInject
import im.vector.app.features.analytics.plan.MobileScreen
import io.element.android.annotations.ContributesNode
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.libraries.architecture.appyx.launchMolecule
import io.element.android.libraries.architecture.callback
@@ -81,7 +81,7 @@ class RoomMemberListNode(
onSelectAction = { action, target ->
when (action) {
is ModerationAction.DisplayProfile -> openRoomMemberDetails(target.userId)
else -> state.moderationState.eventSink(RoomMemberModerationEvents.ProcessAction(action, target))
else -> state.moderationState.eventSink(RoomMemberModerationEvent.ProcessAction(action, target))
}
},
onAvatarClick = { user ->
@@ -19,7 +19,7 @@ import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
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.libraries.architecture.AsyncData
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.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.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncData
@@ -115,7 +115,7 @@ fun aRoomMemberModerationState(
canBan = canBan,
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].
*/
interface RoomMemberModerationEvents {
data class ShowActionsForUser(val user: MatrixUser) : RoomMemberModerationEvents
data class ProcessAction(val action: ModerationAction, val targetUser: MatrixUser) : RoomMemberModerationEvents
interface RoomMemberModerationEvent {
data class ShowActionsForUser(val user: MatrixUser) : RoomMemberModerationEvent
data class ProcessAction(val action: ModerationAction, val targetUser: MatrixUser) : RoomMemberModerationEvent
}
@@ -19,7 +19,7 @@ interface RoomMemberModerationState {
val permissions: RoomMemberModerationPermissions
/** 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(
@@ -8,9 +8,9 @@
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 DoBanUser(val reason: String) : InternalRoomMemberModerationEvents
data class DoUnbanUser(val reason: String) : InternalRoomMemberModerationEvents
@@ -9,7 +9,7 @@
package io.element.android.features.roommembermoderation.impl
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.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncAction
@@ -23,7 +23,7 @@ data class InternalRoomMemberModerationState(
val kickUserAsyncAction: AsyncAction<Unit>,
val banUserAsyncAction: AsyncAction<Unit>,
val unbanUserAsyncAction: AsyncAction<Unit>,
override val eventSink: (RoomMemberModerationEvents) -> Unit,
override val eventSink: (RoomMemberModerationEvent) -> Unit,
) : RoomMemberModerationState {
val canDisplayActions = actions.isNotEmpty()
}
@@ -11,7 +11,7 @@ package io.element.android.features.roommembermoderation.impl
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.roommembermoderation.api.ModerationAction
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.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.preview.USER_NAME_ALICE
@@ -93,7 +93,7 @@ fun aRoomMembersModerationState(
kickUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
banUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
unbanUserAsyncAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (RoomMemberModerationEvents) -> Unit = {},
eventSink: (RoomMemberModerationEvent) -> Unit = {},
) = InternalRoomMemberModerationState(
permissions = permissions,
selectedUser = selectedUser,
@@ -20,7 +20,7 @@ import dev.zacsweers.metro.Inject
import im.vector.app.features.analytics.plan.RoomModeration
import io.element.android.features.roommembermoderation.api.ModerationAction
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.RoomMemberModerationState
import io.element.android.features.roommembermoderation.api.roomMemberModerationPermissions
@@ -77,9 +77,9 @@ class RoomMemberModerationPresenter(
}
val moderationActions = remember { mutableStateOf<ImmutableList<ModerationActionState>>(persistentListOf()) }
fun handleEvent(event: RoomMemberModerationEvents) {
fun handleEvent(event: RoomMemberModerationEvent) {
when (event) {
is RoomMemberModerationEvents.ShowActionsForUser -> {
is RoomMemberModerationEvent.ShowActionsForUser -> {
selectedUser = event.user
val member = room.membersStateFlow.value.roomMembers()?.firstOrNull {
it.userId == event.user.userId
@@ -90,7 +90,7 @@ class RoomMemberModerationPresenter(
currentUserPowerLevel = currentUserPowerLevel,
)
}
is RoomMemberModerationEvents.ProcessAction -> {
is RoomMemberModerationEvent.ProcessAction -> {
// First, hide any list of existing actions that could be displayed
moderationActions.value = persistentListOf()
@@ -12,7 +12,7 @@ import app.cash.turbine.TurbineTestContext
import com.google.common.truth.Truth.assertThat
import io.element.android.features.roommembermoderation.api.ModerationAction
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.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncAction
@@ -73,7 +73,7 @@ class RoomMemberModerationPresenterTest {
)
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser))
initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(1)
val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -93,7 +93,7 @@ class RoomMemberModerationPresenterTest {
)
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser))
initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(2)
val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -115,7 +115,7 @@ class RoomMemberModerationPresenterTest {
)
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser))
initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(2)
val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -137,7 +137,7 @@ class RoomMemberModerationPresenterTest {
)
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser))
initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(2)
val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -159,7 +159,7 @@ class RoomMemberModerationPresenterTest {
)
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(RoomMemberModerationEvents.ShowActionsForUser(targetUser))
initialState.eventSink(RoomMemberModerationEvent.ShowActionsForUser(targetUser))
skipItems(2)
val updatedState = awaitState()
assertThat(updatedState.selectedUser).isEqualTo(targetUser)
@@ -175,7 +175,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = aJoinedRoom()).test {
val initialState = awaitState()
initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(
RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser,
action = ModerationAction.KickUser
)
@@ -192,7 +192,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = aJoinedRoom()).test {
val initialState = awaitState()
initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(
RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser,
action = ModerationAction.BanUser
)
@@ -209,7 +209,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = aJoinedRoom()).test {
val initialState = awaitState()
initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(
RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser,
action = ModerationAction.UnbanUser
)
@@ -235,7 +235,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(
RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser,
action = ModerationAction.KickUser
)
@@ -265,7 +265,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(
RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser,
action = ModerationAction.BanUser
)
@@ -295,7 +295,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(
RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser,
action = ModerationAction.UnbanUser
)
@@ -320,7 +320,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = room).test {
val initialState = awaitState()
initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(
RoomMemberModerationEvent.ProcessAction(
targetUser = targetUser,
action = ModerationAction.KickUser
)
@@ -340,7 +340,7 @@ class RoomMemberModerationPresenterTest {
createRoomMemberModerationPresenter(room = aJoinedRoom()).test {
val initialState = awaitState()
initialState.eventSink(
RoomMemberModerationEvents.ProcessAction(targetUser = targetUser, action = ModerationAction.BanUser)
RoomMemberModerationEvent.ProcessAction(targetUser = targetUser, action = ModerationAction.BanUser)
)
skipItems(2)
initialState.eventSink(InternalRoomMemberModerationEvents.Reset)
@@ -16,7 +16,7 @@ import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.v2.runAndroidComposeUiTest
import io.element.android.features.roommembermoderation.api.ModerationAction
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.matrix.api.user.MatrixUser
import io.element.android.libraries.testtags.TestTags
@@ -34,7 +34,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking on display profile action calls onSelectAction`() = runAndroidComposeUiTest {
val user = anAlice()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.DisplayProfile, user) { callback ->
setRoomMemberModerationView(
aRoomMembersModerationState(
@@ -55,7 +55,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking on kick user action calls onSelectAction`() = runAndroidComposeUiTest {
val user = anAlice()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.KickUser, user) { callback ->
setRoomMemberModerationView(
aRoomMembersModerationState(
@@ -76,7 +76,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking on ban user action calls onSelectAction`() = runAndroidComposeUiTest {
val user = anAlice()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.BanUser, user) { callback ->
setRoomMemberModerationView(
aRoomMembersModerationState(
@@ -97,7 +97,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking on unban user action calls onSelectAction`() = runAndroidComposeUiTest {
val user = anAlice()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
ensureCalledOnceWithTwoParams<ModerationAction, MatrixUser>(ModerationAction.UnbanUser, user) { callback ->
setRoomMemberModerationView(
aRoomMembersModerationState(
@@ -117,7 +117,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking submit on kick confirmation dialog sends DoKickUser event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView(
aRoomMembersModerationState(
selectedUser = anAlice(),
@@ -131,7 +131,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking dismiss on kick confirmation dialog sends Reset event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView(
aRoomMembersModerationState(
selectedUser = anAlice(),
@@ -145,7 +145,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking submit on ban confirmation dialog sends DoBanUser event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView(
aRoomMembersModerationState(
selectedUser = anAlice(),
@@ -159,7 +159,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking dismiss on ban confirmation dialog sends Reset event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView(
aRoomMembersModerationState(
selectedUser = anAlice(),
@@ -173,7 +173,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking confirm on unban confirmation dialog sends DoUnbanUser event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView(
aRoomMembersModerationState(
selectedUser = anAlice(),
@@ -187,7 +187,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `clicking dismiss on unban confirmation dialog sends Reset event`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>()
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>()
setRoomMemberModerationView(
aRoomMembersModerationState(
selectedUser = anAlice(),
@@ -201,7 +201,7 @@ class RoomMemberModerationViewTest : RobolectricTest() {
@Test
fun `disabled actions are not clickable`() = runAndroidComposeUiTest {
val eventsRecorder = EventsRecorder<RoomMemberModerationEvents>(expectEvents = false)
val eventsRecorder = EventsRecorder<RoomMemberModerationEvent>(expectEvents = false)
setRoomMemberModerationView(
aRoomMembersModerationState(
selectedUser = anAlice(),