change(room members): add reason to unban

This commit is contained in:
ganfra 2025-11-06 20:10:07 +01:00
parent 1d72057391
commit 8d76dd9161
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 {
data class DoKickUser(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
}

View file

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

View file

@ -166,18 +166,21 @@ private fun RoomMemberAsyncActions(
}
when (val action = state.unbanUserAsyncAction) {
is AsyncAction.Confirming -> {
ConfirmationDialog(
TextFieldDialog(
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),
onSubmitClick = {
onSubmit = { reason ->
val userDisplayName = selectedUser?.getBestName().orEmpty()
asyncIndicatorState.enqueue {
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 -> {

View file

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

View file

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