Iterate on Save change dialog.

This commit is contained in:
Benoit Marty
2025-12-03 14:35:52 +01:00
committed by Benoit Marty
parent 5bd194b2b6
commit eeef1b11ea
10 changed files with 36 additions and 25 deletions

View File

@@ -66,8 +66,9 @@ fun CreatePollView(
BackHandler(onBack = navBack)
if (state.showBackConfirmation) {
SaveChangesDialog(
onSubmitClick = { state.eventSink(CreatePollEvents.NavBack) },
onDismiss = { state.eventSink(CreatePollEvents.HideConfirmation) }
onSaveClick = { state.eventSink(CreatePollEvents.Save) },
onDiscardClick = { state.eventSink(CreatePollEvents.NavBack) },
onDismiss = { state.eventSink(CreatePollEvents.HideConfirmation) },
)
}
if (state.showDeleteConfirmation) {

View File

@@ -147,8 +147,9 @@ fun EditUserProfileView(
when (confirming) {
is AsyncAction.ConfirmingCancellation -> {
SaveChangesDialog(
onSubmitClick = { state.eventSink(EditUserProfileEvents.Exit) },
onDismiss = { state.eventSink(EditUserProfileEvents.CloseDialog) }
onSaveClick = { state.eventSink(EditUserProfileEvents.Save) },
onDiscardClick = { state.eventSink(EditUserProfileEvents.Exit) },
onDismiss = { state.eventSink(EditUserProfileEvents.CloseDialog) },
)
}
}

View File

@@ -20,7 +20,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.features.rolesandpermissions.impl.R
import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.dialogs.SaveChangesDialog
import io.element.android.libraries.designsystem.components.preferences.PreferenceDropdown
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@@ -99,13 +99,10 @@ fun ChangeRoomPermissionsView(
async = state.confirmExitAction,
onSuccess = { onComplete(false) },
confirmationDialog = {
ConfirmationDialog(
title = stringResource(R.string.screen_room_change_role_unsaved_changes_title),
content = stringResource(R.string.screen_room_change_role_unsaved_changes_description),
submitText = stringResource(CommonStrings.action_save),
cancelText = stringResource(CommonStrings.action_discard),
onSubmitClick = { state.eventSink(ChangeRoomPermissionsEvent.Save) },
onDismiss = { state.eventSink(ChangeRoomPermissionsEvent.Exit) }
SaveChangesDialog(
onSaveClick = { state.eventSink(ChangeRoomPermissionsEvent.Save) },
onDiscardClick = { state.eventSink(ChangeRoomPermissionsEvent.Exit) },
onDismiss = { state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions) },
)
},
onErrorDismiss = {},

View File

@@ -172,8 +172,9 @@ fun ChangeRolesView(
when (confirming) {
is AsyncAction.ConfirmingCancellation -> {
SaveChangesDialog(
onSubmitClick = { state.eventSink(ChangeRolesEvent.Exit) },
onDismiss = { state.eventSink(ChangeRolesEvent.CloseDialog) }
onSaveClick = { state.eventSink(ChangeRolesEvent.Save) },
onDiscardClick = { state.eventSink(ChangeRolesEvent.Exit) },
onDismiss = { state.eventSink(ChangeRolesEvent.CloseDialog) },
)
}
is ConfirmingModifyingOwners -> {

View File

@@ -119,7 +119,7 @@ class ChangeRolesViewTest {
}
@Test
fun `exit confirmation dialog - submit exits the screen`() {
fun `exit confirmation dialog - discard exits the screen`() {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
state = aChangeRolesState(
@@ -128,12 +128,12 @@ class ChangeRolesViewTest {
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_ok)
rule.clickOn(CommonStrings.action_discard)
eventsRecorder.assertSingle(ChangeRolesEvent.Exit)
}
@Test
fun `exit confirmation dialog - cancel removes the dialog`() {
fun `exit confirmation dialog - save emits the save event`() {
val eventsRecorder = EventsRecorder<ChangeRolesEvent>()
rule.setChangeRolesContent(
state = aChangeRolesState(
@@ -142,8 +142,8 @@ class ChangeRolesViewTest {
eventSink = eventsRecorder,
),
)
rule.clickOn(CommonStrings.action_cancel)
eventsRecorder.assertSingle(ChangeRolesEvent.CloseDialog)
rule.clickOn(CommonStrings.action_save)
eventsRecorder.assertSingle(ChangeRolesEvent.Save)
}
@Test

View File

@@ -159,7 +159,8 @@ fun RoomDetailsEditView(
confirmationDialog = {
if (state.saveAction == AsyncAction.ConfirmingCancellation) {
SaveChangesDialog(
onSubmitClick = { state.eventSink(RoomDetailsEditEvents.OnBackPress) },
onSaveClick = { state.eventSink(RoomDetailsEditEvents.Save) },
onDiscardClick = { state.eventSink(RoomDetailsEditEvents.OnBackPress) },
onDismiss = { state.eventSink(RoomDetailsEditEvents.CloseDialog) }
)
}

View File

@@ -144,7 +144,8 @@ fun SecurityAndPrivacyView(
onErrorDismiss = { },
confirmationDialog = {
SaveChangesDialog(
onSubmitClick = { state.eventSink(SecurityAndPrivacyEvents.Exit) },
onSaveClick = { state.eventSink(SecurityAndPrivacyEvents.Save) },
onDiscardClick = { state.eventSink(SecurityAndPrivacyEvents.Exit) },
onDismiss = { state.eventSink(SecurityAndPrivacyEvents.DismissExitConfirmation) }
)
},

View File

@@ -17,16 +17,22 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun SaveChangesDialog(
onSubmitClick: () -> Unit,
onSaveClick: () -> Unit,
onDiscardClick: () -> Unit,
onDismiss: () -> Unit,
modifier: Modifier = Modifier,
title: String = stringResource(CommonStrings.dialog_unsaved_changes_title),
content: String = stringResource(CommonStrings.dialog_unsaved_changes_description_android),
content: String = stringResource(CommonStrings.dialog_unsaved_changes_description),
submitText: String = stringResource(CommonStrings.action_save),
cancelText: String = stringResource(CommonStrings.action_discard),
) = ConfirmationDialog(
modifier = modifier,
title = title,
content = content,
onSubmitClick = onSubmitClick,
submitText = submitText,
cancelText = cancelText,
onSubmitClick = onSaveClick,
onCancelClick = onDiscardClick,
onDismiss = onDismiss,
)
@@ -34,7 +40,8 @@ fun SaveChangesDialog(
@Composable
internal fun SaveChangesDialogPreview() = ElementPreview {
SaveChangesDialog(
onSubmitClick = {},
onSaveClick = {},
onDiscardClick = {},
onDismiss = {}
)
}

View File

@@ -38,6 +38,7 @@
<string name="notification_room_invite_body_with_sender">"%1$s invited you to join the room"</string>
<string name="notification_sender_me">"Me"</string>
<string name="notification_sender_mention_reply">"%1$s mentioned or replied"</string>
<string name="notification_space_invite_body">"Invited you to join the space"</string>
<string name="notification_test_push_notification_content">"You are viewing the notification! Click me!"</string>
<string name="notification_thread_in_room">"Thread in %1$s"</string>
<string name="notification_ticker_text_dm">"%1$s: %2$s"</string>

View File

@@ -392,6 +392,7 @@ Are you sure you want to continue?"</string>
<string name="dialog_title_error">"Error"</string>
<string name="dialog_title_success">"Success"</string>
<string name="dialog_title_warning">"Warning"</string>
<string name="dialog_unsaved_changes_description">"You have unsaved changes."</string>
<string name="dialog_unsaved_changes_description_android">"Your changes have not been saved. Are you sure you want to go back?"</string>
<string name="dialog_unsaved_changes_title">"Save changes?"</string>
<string name="dialog_video_quality_selector_subtitle_file_size">"The max file size allowed is: %1$s"</string>