Improve TextFieldDialog (#4512)
* Extract TextFieldDialog to its own file (no other change). * Add TextFieldDialogPreview Enhance TextFieldDialog * Let RoomMembersModerationView use TextFieldDialog * Update screenshots * Konsist. * Add modifier parameter. --------- Co-authored-by: ElementBot <android@element.io>
This commit is contained in:
parent
f0cc6e315e
commit
c65b54d3b7
35 changed files with 291 additions and 264 deletions
|
|
@ -1,14 +0,0 @@
|
|||
/*
|
||||
* Copyright 2025 New Vector Ltd.
|
||||
*
|
||||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
* Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
package io.element.android.features.roomdetails.impl.members.moderation
|
||||
|
||||
import io.element.android.libraries.architecture.AsyncAction
|
||||
|
||||
data class ConfirmingWithReason(
|
||||
val reason: String,
|
||||
) : AsyncAction.Confirming
|
||||
|
|
@ -12,8 +12,10 @@ import io.element.android.libraries.matrix.api.room.RoomMember
|
|||
|
||||
sealed interface RoomMembersModerationEvents {
|
||||
data class SelectRoomMember(val roomMember: RoomMember) : RoomMembersModerationEvents
|
||||
data class KickUser(val reason: String, val needsConfirmation: Boolean) : RoomMembersModerationEvents
|
||||
data class BanUser(val reason: String, val needsConfirmation: Boolean) : RoomMembersModerationEvents
|
||||
data object KickUser : RoomMembersModerationEvents
|
||||
data class DoKickUser(val reason: String) : RoomMembersModerationEvents
|
||||
data object BanUser : RoomMembersModerationEvents
|
||||
data class DoBanUser(val reason: String) : RoomMembersModerationEvents
|
||||
data class UnbanUser(val userId: UserId) : RoomMembersModerationEvents
|
||||
data object Reset : RoomMembersModerationEvents
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,24 +96,22 @@ class RoomMembersModerationPresenter @Inject constructor(
|
|||
}
|
||||
}
|
||||
is RoomMembersModerationEvents.KickUser -> {
|
||||
if (event.needsConfirmation) {
|
||||
kickUserAsyncAction.value = ConfirmingWithReason(event.reason)
|
||||
} else {
|
||||
selectedMember?.let {
|
||||
coroutineScope.kickUser(it.userId, event.reason, kickUserAsyncAction)
|
||||
}
|
||||
selectedMember = null
|
||||
kickUserAsyncAction.value = AsyncAction.ConfirmingNoParams
|
||||
}
|
||||
is RoomMembersModerationEvents.DoKickUser -> {
|
||||
selectedMember?.let {
|
||||
coroutineScope.kickUser(it.userId, event.reason, kickUserAsyncAction)
|
||||
}
|
||||
selectedMember = null
|
||||
}
|
||||
is RoomMembersModerationEvents.BanUser -> {
|
||||
if (event.needsConfirmation) {
|
||||
banUserAsyncAction.value = ConfirmingWithReason(event.reason)
|
||||
} else {
|
||||
selectedMember?.let {
|
||||
coroutineScope.banUser(it.userId, event.reason, banUserAsyncAction)
|
||||
}
|
||||
selectedMember = null
|
||||
banUserAsyncAction.value = AsyncAction.ConfirmingNoParams
|
||||
}
|
||||
is RoomMembersModerationEvents.DoBanUser -> {
|
||||
selectedMember?.let {
|
||||
coroutineScope.banUser(it.userId, event.reason, banUserAsyncAction)
|
||||
}
|
||||
selectedMember = null
|
||||
}
|
||||
is RoomMembersModerationEvents.UnbanUser -> {
|
||||
// We are already confirming when we are reaching this point
|
||||
|
|
|
|||
|
|
@ -39,11 +39,7 @@ class RoomMembersModerationStateProvider : PreviewParameterProvider<RoomMembersM
|
|||
),
|
||||
aRoomMembersModerationState(
|
||||
selectedRoomMember = anAlice(),
|
||||
kickUserAsyncAction = ConfirmingWithReason(""),
|
||||
),
|
||||
aRoomMembersModerationState(
|
||||
selectedRoomMember = anAlice(),
|
||||
kickUserAsyncAction = ConfirmingWithReason("A reason"),
|
||||
kickUserAsyncAction = AsyncAction.ConfirmingNoParams,
|
||||
),
|
||||
aRoomMembersModerationState(
|
||||
selectedRoomMember = anAlice(),
|
||||
|
|
@ -51,11 +47,7 @@ class RoomMembersModerationStateProvider : PreviewParameterProvider<RoomMembersM
|
|||
),
|
||||
aRoomMembersModerationState(
|
||||
selectedRoomMember = anAlice(),
|
||||
banUserAsyncAction = ConfirmingWithReason(""),
|
||||
),
|
||||
aRoomMembersModerationState(
|
||||
selectedRoomMember = anAlice(),
|
||||
banUserAsyncAction = ConfirmingWithReason("A reason"),
|
||||
banUserAsyncAction = AsyncAction.ConfirmingNoParams,
|
||||
),
|
||||
aRoomMembersModerationState(
|
||||
selectedRoomMember = anAlice(),
|
||||
|
|
|
|||
|
|
@ -38,9 +38,8 @@ import io.element.android.libraries.designsystem.components.async.rememberAsyncI
|
|||
import io.element.android.libraries.designsystem.components.avatar.Avatar
|
||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
|
||||
import io.element.android.libraries.designsystem.components.dialogs.ListDialog
|
||||
import io.element.android.libraries.designsystem.components.dialogs.TextFieldDialog
|
||||
import io.element.android.libraries.designsystem.components.list.ListItemContent
|
||||
import io.element.android.libraries.designsystem.components.list.TextFieldListItem
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||
import io.element.android.libraries.designsystem.theme.components.IconSource
|
||||
|
|
@ -74,10 +73,10 @@ fun RoomMembersModerationView(
|
|||
onDisplayMemberProfile(action.userId)
|
||||
}
|
||||
is ModerationAction.KickUser -> {
|
||||
state.eventSink(RoomMembersModerationEvents.KickUser(reason = "", needsConfirmation = true))
|
||||
state.eventSink(RoomMembersModerationEvents.KickUser)
|
||||
}
|
||||
is ModerationAction.BanUser -> {
|
||||
state.eventSink(RoomMembersModerationEvents.BanUser(reason = "", needsConfirmation = true))
|
||||
state.eventSink(RoomMembersModerationEvents.BanUser)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -90,45 +89,19 @@ fun RoomMembersModerationView(
|
|||
|
||||
when (val action = state.kickUserAsyncAction) {
|
||||
is AsyncAction.Confirming -> {
|
||||
if (action is ConfirmingWithReason) {
|
||||
ListDialog(
|
||||
title = stringResource(R.string.screen_room_member_list_kick_member_confirmation_title),
|
||||
submitText = stringResource(R.string.screen_room_member_list_kick_member_confirmation_action),
|
||||
onSubmit = {
|
||||
state.eventSink(
|
||||
RoomMembersModerationEvents.KickUser(
|
||||
reason = action.reason,
|
||||
needsConfirmation = false,
|
||||
)
|
||||
)
|
||||
},
|
||||
applyPaddingToContents = true,
|
||||
onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) },
|
||||
) {
|
||||
item {
|
||||
Text(
|
||||
text = stringResource(R.string.screen_room_member_list_kick_member_confirmation_description),
|
||||
style = ElementTheme.materialTypography.bodyMedium,
|
||||
)
|
||||
}
|
||||
item {
|
||||
TextFieldListItem(
|
||||
placeholder = stringResource(id = CommonStrings.common_reason),
|
||||
label = stringResource(id = CommonStrings.common_reason),
|
||||
withBorder = true,
|
||||
text = action.reason,
|
||||
onTextChange = { newText ->
|
||||
state.eventSink(
|
||||
RoomMembersModerationEvents.KickUser(
|
||||
reason = newText,
|
||||
needsConfirmation = true,
|
||||
)
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
TextFieldDialog(
|
||||
title = stringResource(R.string.screen_room_member_list_kick_member_confirmation_title),
|
||||
submitText = stringResource(R.string.screen_room_member_list_kick_member_confirmation_action),
|
||||
onSubmit = { reason ->
|
||||
state.eventSink(RoomMembersModerationEvents.DoKickUser(reason = reason))
|
||||
},
|
||||
onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) },
|
||||
placeholder = stringResource(id = CommonStrings.common_reason),
|
||||
label = stringResource(id = CommonStrings.common_reason),
|
||||
withBorder = true,
|
||||
content = stringResource(R.string.screen_room_member_list_kick_member_confirmation_description),
|
||||
value = "",
|
||||
)
|
||||
}
|
||||
is AsyncAction.Loading -> {
|
||||
LaunchedEffect(action) {
|
||||
|
|
@ -156,45 +129,19 @@ fun RoomMembersModerationView(
|
|||
|
||||
when (val action = state.banUserAsyncAction) {
|
||||
is AsyncAction.Confirming -> {
|
||||
if (action is ConfirmingWithReason) {
|
||||
ListDialog(
|
||||
title = stringResource(R.string.screen_room_member_list_ban_member_confirmation_title),
|
||||
submitText = stringResource(R.string.screen_room_member_list_ban_member_confirmation_action),
|
||||
onSubmit = {
|
||||
state.eventSink(
|
||||
RoomMembersModerationEvents.BanUser(
|
||||
reason = action.reason,
|
||||
needsConfirmation = false,
|
||||
)
|
||||
)
|
||||
},
|
||||
applyPaddingToContents = true,
|
||||
onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) },
|
||||
) {
|
||||
item {
|
||||
Text(
|
||||
text = stringResource(R.string.screen_room_member_list_ban_member_confirmation_description),
|
||||
style = ElementTheme.materialTypography.bodyMedium,
|
||||
)
|
||||
}
|
||||
item {
|
||||
TextFieldListItem(
|
||||
placeholder = stringResource(id = CommonStrings.common_reason),
|
||||
label = stringResource(id = CommonStrings.common_reason),
|
||||
withBorder = true,
|
||||
text = action.reason,
|
||||
onTextChange = { newText ->
|
||||
state.eventSink(
|
||||
RoomMembersModerationEvents.BanUser(
|
||||
reason = newText,
|
||||
needsConfirmation = true,
|
||||
)
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
TextFieldDialog(
|
||||
title = stringResource(R.string.screen_room_member_list_ban_member_confirmation_title),
|
||||
submitText = stringResource(R.string.screen_room_member_list_ban_member_confirmation_action),
|
||||
onSubmit = { reason ->
|
||||
state.eventSink(RoomMembersModerationEvents.DoBanUser(reason = reason))
|
||||
},
|
||||
onDismissRequest = { state.eventSink(RoomMembersModerationEvents.Reset) },
|
||||
placeholder = stringResource(id = CommonStrings.common_reason),
|
||||
label = stringResource(id = CommonStrings.common_reason),
|
||||
withBorder = true,
|
||||
content = stringResource(R.string.screen_room_member_list_ban_member_confirmation_description),
|
||||
value = "",
|
||||
)
|
||||
}
|
||||
is AsyncAction.Loading -> {
|
||||
LaunchedEffect(action) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue