change(room members): add reason to unban

This commit is contained in:
ganfra 2025-11-06 20:10:07 +01:00
parent e47c0b32d7
commit 5f2453b128
5 changed files with 17 additions and 10 deletions

View file

@ -12,6 +12,6 @@ import io.element.android.features.roommembermoderation.api.RoomMemberModeration
sealed interface InternalRoomMemberModerationEvents : RoomMemberModerationEvents { sealed interface InternalRoomMemberModerationEvents : RoomMemberModerationEvents {
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 object DoUnbanUser : InternalRoomMemberModerationEvents data class DoUnbanUser(val reason: String) : InternalRoomMemberModerationEvents
data object Reset : InternalRoomMemberModerationEvents data object Reset : InternalRoomMemberModerationEvents
} }

View file

@ -118,7 +118,7 @@ class RoomMemberModerationPresenter(
} }
is InternalRoomMemberModerationEvents.DoUnbanUser -> { is InternalRoomMemberModerationEvents.DoUnbanUser -> {
selectedUser?.let { selectedUser?.let {
coroutineScope.unbanUser(it.userId, unbanUserAsyncAction) coroutineScope.unbanUser(it.userId, event.reason, unbanUserAsyncAction)
} }
selectedUser = null selectedUser = null
} }
@ -197,10 +197,14 @@ class RoomMemberModerationPresenter(
private fun CoroutineScope.unbanUser( private fun CoroutineScope.unbanUser(
userId: UserId, userId: UserId,
reason: String,
unbanUserAction: MutableState<AsyncAction<Unit>>, unbanUserAction: MutableState<AsyncAction<Unit>>,
) = runActionAndWaitForMembershipChange(unbanUserAction) { ) = runActionAndWaitForMembershipChange(unbanUserAction) {
analyticsService.capture(RoomModeration(RoomModeration.Action.UnbanMember)) analyticsService.capture(RoomModeration(RoomModeration.Action.UnbanMember))
room.unbanUser(userId = userId) room.unbanUser(
userId = userId,
reason = reason.takeIf { it.isNotBlank() },
)
} }
private fun <T> CoroutineScope.runActionAndWaitForMembershipChange( private fun <T> CoroutineScope.runActionAndWaitForMembershipChange(

View file

@ -166,18 +166,21 @@ private fun RoomMemberAsyncActions(
} }
when (val action = state.unbanUserAsyncAction) { when (val action = state.unbanUserAsyncAction) {
is AsyncAction.Confirming -> { is AsyncAction.Confirming -> {
ConfirmationDialog( TextFieldDialog(
title = stringResource(R.string.screen_bottom_sheet_manage_room_member_unban_member_confirmation_title), title = stringResource(R.string.screen_bottom_sheet_manage_room_member_unban_member_confirmation_title),
content = stringResource(R.string.screen_bottom_sheet_manage_room_member_unban_member_confirmation_description),
submitText = stringResource(R.string.screen_bottom_sheet_manage_room_member_unban_member_confirmation_action), submitText = stringResource(R.string.screen_bottom_sheet_manage_room_member_unban_member_confirmation_action),
onSubmitClick = { onSubmit = { reason ->
val userDisplayName = selectedUser?.getBestName().orEmpty() val userDisplayName = selectedUser?.getBestName().orEmpty()
asyncIndicatorState.enqueue { asyncIndicatorState.enqueue {
AsyncIndicator.Loading(text = stringResource(R.string.screen_bottom_sheet_manage_room_member_unbanning_user, userDisplayName)) AsyncIndicator.Loading(text = stringResource(R.string.screen_bottom_sheet_manage_room_member_unbanning_user, userDisplayName))
} }
state.eventSink(InternalRoomMemberModerationEvents.DoUnbanUser) state.eventSink(InternalRoomMemberModerationEvents.DoUnbanUser(reason = reason))
}, },
onDismiss = { state.eventSink(InternalRoomMemberModerationEvents.Reset) }, onDismissRequest = { state.eventSink(InternalRoomMemberModerationEvents.Reset) },
placeholder = stringResource(id = CommonStrings.common_reason),
label = stringResource(id = CommonStrings.common_reason),
content = stringResource(R.string.screen_bottom_sheet_manage_room_member_unban_member_confirmation_description),
value = "",
) )
} }
is AsyncAction.Failure -> { is AsyncAction.Failure -> {

View file

@ -290,7 +290,7 @@ class RoomMemberModerationPresenterTest {
) )
) )
skipItems(2) skipItems(2)
initialState.eventSink(InternalRoomMemberModerationEvents.DoUnbanUser) initialState.eventSink(InternalRoomMemberModerationEvents.DoUnbanUser("Reason"))
skipItems(1) skipItems(1)
val loadingState = awaitState() val loadingState = awaitState()
assertThat(loadingState.unbanUserAsyncAction).isInstanceOf(AsyncAction.Loading::class.java) assertThat(loadingState.unbanUserAsyncAction).isInstanceOf(AsyncAction.Loading::class.java)

View file

@ -181,7 +181,7 @@ class RoomMemberModerationViewTest {
), ),
) )
rule.pressTag(TestTags.dialogPositive.value) rule.pressTag(TestTags.dialogPositive.value)
eventsRecorder.assertSingle(InternalRoomMemberModerationEvents.DoUnbanUser) eventsRecorder.assertSingle(InternalRoomMemberModerationEvents.DoUnbanUser(""))
} }
@Test @Test