From eeef1b11ea655ce30d84d595487b120554549f28 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 3 Dec 2025 14:35:52 +0100 Subject: [PATCH] Iterate on Save change dialog. --- .../features/poll/impl/create/CreatePollView.kt | 5 +++-- .../impl/user/editprofile/EditUserProfileView.kt | 5 +++-- .../impl/permissions/ChangeRoomPermissionsView.kt | 13 +++++-------- .../impl/roles/ChangeRolesView.kt | 5 +++-- .../impl/roles/ChangeRolesViewTest.kt | 10 +++++----- .../roomdetailsedit/impl/RoomDetailsEditView.kt | 3 ++- .../impl/root/SecurityAndPrivacyView.kt | 3 ++- .../components/dialogs/SaveChangesDialog.kt | 15 +++++++++++---- .../push/impl/src/main/res/values/localazy.xml | 1 + .../ui-strings/src/main/res/values/localazy.xml | 1 + 10 files changed, 36 insertions(+), 25 deletions(-) diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt index 53caf33707..3220aa1c5c 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollView.kt @@ -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) { diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt index d6f0fcbd2c..4325aa1eb6 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/user/editprofile/EditUserProfileView.kt @@ -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) }, ) } } diff --git a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsView.kt b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsView.kt index 1e88d091c8..a1a19cdcc9 100644 --- a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsView.kt +++ b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsView.kt @@ -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 = {}, diff --git a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt index bab24d3f42..20abc70bb7 100644 --- a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt +++ b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt @@ -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 -> { diff --git a/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesViewTest.kt b/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesViewTest.kt index fd45e5408c..39967f9160 100644 --- a/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesViewTest.kt +++ b/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesViewTest.kt @@ -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() 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() 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 diff --git a/features/roomdetailsedit/impl/src/main/kotlin/io/element/android/features/roomdetailsedit/impl/RoomDetailsEditView.kt b/features/roomdetailsedit/impl/src/main/kotlin/io/element/android/features/roomdetailsedit/impl/RoomDetailsEditView.kt index 55a6d038dd..04a03fbcfe 100644 --- a/features/roomdetailsedit/impl/src/main/kotlin/io/element/android/features/roomdetailsedit/impl/RoomDetailsEditView.kt +++ b/features/roomdetailsedit/impl/src/main/kotlin/io/element/android/features/roomdetailsedit/impl/RoomDetailsEditView.kt @@ -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) } ) } diff --git a/features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyView.kt b/features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyView.kt index ad75580031..019eac665c 100644 --- a/features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyView.kt +++ b/features/securityandprivacy/impl/src/main/kotlin/io/element/android/features/securityandprivacy/impl/root/SecurityAndPrivacyView.kt @@ -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) } ) }, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/SaveChangesDialog.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/SaveChangesDialog.kt index b722480bb1..dc30b191a0 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/SaveChangesDialog.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/SaveChangesDialog.kt @@ -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 = {} ) } diff --git a/libraries/push/impl/src/main/res/values/localazy.xml b/libraries/push/impl/src/main/res/values/localazy.xml index 0764851647..935c3e600c 100644 --- a/libraries/push/impl/src/main/res/values/localazy.xml +++ b/libraries/push/impl/src/main/res/values/localazy.xml @@ -38,6 +38,7 @@ "%1$s invited you to join the room" "Me" "%1$s mentioned or replied" + "Invited you to join the space" "You are viewing the notification! Click me!" "Thread in %1$s" "%1$s: %2$s" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 8be01eb439..d422a4c35c 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -392,6 +392,7 @@ Are you sure you want to continue?" "Error" "Success" "Warning" + "You have unsaved changes." "Your changes have not been saved. Are you sure you want to go back?" "Save changes?" "The max file size allowed is: %1$s"