diff --git a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenter.kt b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenter.kt index b356ca33d2..99f5723bf9 100644 --- a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenter.kt +++ b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenter.kt @@ -73,8 +73,7 @@ class ChangeRoomPermissionsPresenter( private var initialPermissions by mutableStateOf(null) private var currentPermissions by mutableStateOf(null) - private var saveAction by mutableStateOf>(AsyncAction.Uninitialized) - private var confirmExitAction by mutableStateOf>(AsyncAction.Uninitialized) + private var saveAction by mutableStateOf>(AsyncAction.Uninitialized) @Composable override fun present(): ChangeRoomPermissionsState { @@ -109,15 +108,14 @@ class ChangeRoomPermissionsPresenter( } is ChangeRoomPermissionsEvent.Save -> coroutineScope.save() is ChangeRoomPermissionsEvent.Exit -> { - confirmExitAction = if (!hasChanges || confirmExitAction.isConfirming()) { - AsyncAction.Success(Unit) + saveAction = if (!hasChanges || saveAction == AsyncAction.ConfirmingCancellation) { + AsyncAction.Success(false) } else { - AsyncAction.ConfirmingNoParams + AsyncAction.ConfirmingCancellation } } is ChangeRoomPermissionsEvent.ResetPendingActions -> { saveAction = AsyncAction.Uninitialized - confirmExitAction = AsyncAction.Uninitialized } } } @@ -126,7 +124,6 @@ class ChangeRoomPermissionsPresenter( itemsBySection = itemsBySection, hasChanges = hasChanges, saveAction = saveAction, - confirmExitAction = confirmExitAction, eventSink = ::handleEvent, ) } @@ -147,7 +144,7 @@ class ChangeRoomPermissionsPresenter( .onSuccess { analyticsService.trackPermissionChangeAnalytics(initialPermissions, updatedRoomPowerLevels) initialPermissions = currentPermissions - saveAction = AsyncAction.Success(Unit) + saveAction = AsyncAction.Success(true) } .onFailure { saveAction = AsyncAction.Failure(it) diff --git a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsState.kt b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsState.kt index 2dc2c816d6..0dde54db89 100644 --- a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsState.kt +++ b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsState.kt @@ -23,8 +23,7 @@ data class ChangeRoomPermissionsState( val currentPermissions: RoomPowerLevelsValues?, val itemsBySection: ImmutableMap>, val hasChanges: Boolean, - val saveAction: AsyncAction, - val confirmExitAction: AsyncAction, + val saveAction: AsyncAction, val eventSink: (ChangeRoomPermissionsEvent) -> Unit, ) { fun selectedRoleForType(type: RoomPermissionType): SelectableRole? { diff --git a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsStateProvider.kt b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsStateProvider.kt index d64c85f8cf..6280e4fd8f 100644 --- a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsStateProvider.kt +++ b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsStateProvider.kt @@ -25,7 +25,7 @@ class ChangeRoomPermissionsStateProvider : PreviewParameterProvider> = ChangeRoomPermissionsPresenter.buildItems(false), hasChanges: Boolean = false, - saveAction: AsyncAction = AsyncAction.Uninitialized, - confirmExitAction: AsyncAction = AsyncAction.Uninitialized, + saveAction: AsyncAction = AsyncAction.Uninitialized, eventSink: (ChangeRoomPermissionsEvent) -> Unit = {}, ) = ChangeRoomPermissionsState( currentPermissions = currentPermissions, itemsBySection = itemsBySection.toImmutableMap(), hasChanges = hasChanges, saveAction = saveAction, - confirmExitAction = confirmExitAction, eventSink = eventSink, ) 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 a1a19cdcc9..5ae8203eb4 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 @@ -18,6 +18,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.features.rolesandpermissions.impl.R +import io.element.android.libraries.architecture.AsyncAction 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.SaveChangesDialog @@ -91,21 +92,19 @@ fun ChangeRoomPermissionsView( AsyncActionView( async = state.saveAction, - onSuccess = { onComplete(true) }, - onErrorDismiss = { state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions) } - ) - - AsyncActionView( - async = state.confirmExitAction, - onSuccess = { onComplete(false) }, - confirmationDialog = { - SaveChangesDialog( - onSaveClick = { state.eventSink(ChangeRoomPermissionsEvent.Save) }, - onDiscardClick = { state.eventSink(ChangeRoomPermissionsEvent.Exit) }, - onDismiss = { state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions) }, - ) + onSuccess = { onComplete(it) }, + confirmationDialog = { confirming -> + when (confirming) { + is AsyncAction.ConfirmingCancellation -> { + SaveChangesDialog( + onSaveClick = { state.eventSink(ChangeRoomPermissionsEvent.Save) }, + onDiscardClick = { state.eventSink(ChangeRoomPermissionsEvent.Exit) }, + onDismiss = { state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions) }, + ) + } + } }, - onErrorDismiss = {}, + onErrorDismiss = { state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions) } ) } diff --git a/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenterTest.kt b/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenterTest.kt index 7c328c9bad..d666ec3ccc 100644 --- a/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenterTest.kt +++ b/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsPresenterTest.kt @@ -39,7 +39,6 @@ class ChangeRoomPermissionsPresenterTest { assertThat(this.itemsBySection).isNotEmpty() assertThat(this.hasChanges).isFalse() assertThat(this.saveAction).isEqualTo(AsyncAction.Uninitialized) - assertThat(this.confirmExitAction).isEqualTo(AsyncAction.Uninitialized) } // Updated state, permissions loaded @@ -162,7 +161,7 @@ class ChangeRoomPermissionsPresenterTest { assertThat(awaitItem().hasChanges).isFalse() awaitItem().run { assertThat(currentPermissions?.roomName).isEqualTo(Moderator.powerLevel) - assertThat(saveAction).isEqualTo(AsyncAction.Success(Unit)) + assertThat(saveAction).isEqualTo(AsyncAction.Success(true)) } assertThat(analyticsService.capturedEvents).containsExactlyElementsIn( listOf( @@ -243,10 +242,10 @@ class ChangeRoomPermissionsPresenterTest { assertThat(awaitItem().hasChanges).isTrue() state.eventSink(ChangeRoomPermissionsEvent.Exit) - assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.ConfirmingNoParams) + assertThat(awaitItem().saveAction).isEqualTo(AsyncAction.ConfirmingCancellation) state.eventSink(ChangeRoomPermissionsEvent.Exit) - assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Success(Unit)) + assertThat(awaitItem().saveAction).isEqualTo(AsyncAction.Success(false)) } } @@ -260,7 +259,7 @@ class ChangeRoomPermissionsPresenterTest { state.eventSink(ChangeRoomPermissionsEvent.Exit) - assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Success(Unit)) + assertThat(awaitItem().saveAction).isEqualTo(AsyncAction.Success(false)) } } diff --git a/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsViewTest.kt b/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsViewTest.kt index 915359cfcf..065fe5992d 100644 --- a/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsViewTest.kt +++ b/features/rolesandpermissions/impl/src/test/kotlin/io/element/android/features/rolesandpermissions/impl/permissions/ChangeRoomPermissionsViewTest.kt @@ -76,7 +76,7 @@ class ChangeRoomPermissionsViewTest { rule.setChangeRoomPermissionsRule( state = aChangeRoomPermissionsState( hasChanges = true, - confirmExitAction = AsyncAction.ConfirmingNoParams, + saveAction = AsyncAction.ConfirmingCancellation, eventSink = recorder, ), ) @@ -90,7 +90,7 @@ class ChangeRoomPermissionsViewTest { rule.setChangeRoomPermissionsRule( state = aChangeRoomPermissionsState( hasChanges = true, - confirmExitAction = AsyncAction.ConfirmingNoParams, + saveAction = AsyncAction.ConfirmingCancellation, eventSink = recorder, ), ) @@ -136,9 +136,23 @@ class ChangeRoomPermissionsViewTest { rule.setChangeRoomPermissionsRule( state = aChangeRoomPermissionsState( hasChanges = true, - saveAction = AsyncAction.Success(Unit), + saveAction = AsyncAction.Success(true), ), - onComplete = callback + onComplete = callback, + ) + rule.clickOn(CommonStrings.action_save) + } + } + + @Test + fun `a cancellation exits the screen`() { + ensureCalledOnceWithParam(false) { callback -> + rule.setChangeRoomPermissionsRule( + state = aChangeRoomPermissionsState( + hasChanges = true, + saveAction = AsyncAction.Success(false), + ), + onComplete = callback, ) rule.clickOn(CommonStrings.action_save) }