Change type of SecureBackupEnableState.enableAction from AsyncData to AsyncAction

This commit is contained in:
Benoit Marty 2024-01-19 20:25:40 +01:00 committed by Benoit Marty
parent 3cb75c3f31
commit fa09b70411
5 changed files with 24 additions and 31 deletions

View file

@ -22,7 +22,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import io.element.android.features.securebackup.impl.loggerTagDisable import io.element.android.features.securebackup.impl.loggerTagDisable
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.architecture.runCatchingUpdatingState
import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.api.encryption.EncryptionService
@ -36,14 +36,14 @@ class SecureBackupEnablePresenter @Inject constructor(
) : Presenter<SecureBackupEnableState> { ) : Presenter<SecureBackupEnableState> {
@Composable @Composable
override fun present(): SecureBackupEnableState { override fun present(): SecureBackupEnableState {
val enableAction = remember { mutableStateOf<AsyncData<Unit>>(AsyncData.Uninitialized) } val enableAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
fun handleEvents(event: SecureBackupEnableEvents) { fun handleEvents(event: SecureBackupEnableEvents) {
when (event) { when (event) {
is SecureBackupEnableEvents.EnableBackup -> is SecureBackupEnableEvents.EnableBackup ->
coroutineScope.enableBackup(enableAction) coroutineScope.enableBackup(enableAction)
SecureBackupEnableEvents.DismissDialog -> { SecureBackupEnableEvents.DismissDialog -> {
enableAction.value = AsyncData.Uninitialized enableAction.value = AsyncAction.Uninitialized
} }
} }
} }
@ -54,7 +54,7 @@ class SecureBackupEnablePresenter @Inject constructor(
) )
} }
private fun CoroutineScope.enableBackup(action: MutableState<AsyncData<Unit>>) = launch { private fun CoroutineScope.enableBackup(action: MutableState<AsyncAction<Unit>>) = launch {
suspend { suspend {
Timber.tag(loggerTagDisable.value).d("Calling encryptionService.enableBackups()") Timber.tag(loggerTagDisable.value).d("Calling encryptionService.enableBackups()")
encryptionService.enableBackups().getOrThrow() encryptionService.enableBackups().getOrThrow()

View file

@ -16,9 +16,9 @@
package io.element.android.features.securebackup.impl.enable package io.element.android.features.securebackup.impl.enable
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncAction
data class SecureBackupEnableState( data class SecureBackupEnableState(
val enableAction: AsyncData<Unit>, val enableAction: AsyncAction<Unit>,
val eventSink: (SecureBackupEnableEvents) -> Unit val eventSink: (SecureBackupEnableEvents) -> Unit
) )

View file

@ -17,20 +17,20 @@
package io.element.android.features.securebackup.impl.enable package io.element.android.features.securebackup.impl.enable
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncAction
open class SecureBackupEnableStateProvider : PreviewParameterProvider<SecureBackupEnableState> { open class SecureBackupEnableStateProvider : PreviewParameterProvider<SecureBackupEnableState> {
override val values: Sequence<SecureBackupEnableState> override val values: Sequence<SecureBackupEnableState>
get() = sequenceOf( get() = sequenceOf(
aSecureBackupEnableState(), aSecureBackupEnableState(),
aSecureBackupEnableState(enableAction = AsyncData.Loading()), aSecureBackupEnableState(enableAction = AsyncAction.Loading),
aSecureBackupEnableState(enableAction = AsyncData.Failure(Exception("Failed to enable"))), aSecureBackupEnableState(enableAction = AsyncAction.Failure(Exception("Failed to enable"))),
// Add other states here // Add other states here
) )
} }
fun aSecureBackupEnableState( fun aSecureBackupEnableState(
enableAction: AsyncData<Unit> = AsyncData.Uninitialized, enableAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
) = SecureBackupEnableState( ) = SecureBackupEnableState(
enableAction = enableAction, enableAction = enableAction,
eventSink = {} eventSink = {}

View file

@ -19,16 +19,14 @@ package io.element.android.features.securebackup.impl.enable
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.features.securebackup.impl.R import io.element.android.features.securebackup.impl.R
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.atomic.pages.FlowStepPage import io.element.android.libraries.designsystem.atomic.pages.FlowStepPage
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.Button
@ -41,11 +39,6 @@ fun SecureBackupEnableView(
onBackClicked: () -> Unit, onBackClicked: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
LaunchedEffect(state.enableAction) {
if (state.enableAction is AsyncData.Success) {
onDone()
}
}
FlowStepPage( FlowStepPage(
modifier = modifier, modifier = modifier,
onBackClicked = onBackClicked, onBackClicked = onBackClicked,
@ -53,12 +46,12 @@ fun SecureBackupEnableView(
iconVector = ImageVector.vectorResource(CommonDrawables.ic_key), iconVector = ImageVector.vectorResource(CommonDrawables.ic_key),
buttons = { Buttons(state = state) } buttons = { Buttons(state = state) }
) )
if (state.enableAction is AsyncData.Failure) { AsyncActionView(
ErrorDialog( async = state.enableAction,
content = state.enableAction.error.let { it.message ?: it.toString() }, progressDialog = { },
onDismiss = { state.eventSink.invoke(SecureBackupEnableEvents.DismissDialog) }, onSuccess = { onDone() },
) onErrorDismiss = { state.eventSink.invoke(SecureBackupEnableEvents.DismissDialog) }
} )
} }
@Composable @Composable

View file

@ -20,7 +20,7 @@ import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow import app.cash.molecule.moleculeFlow
import app.cash.turbine.test import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.encryption.EncryptionService import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.test.AN_EXCEPTION import io.element.android.libraries.matrix.test.AN_EXCEPTION
import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService import io.element.android.libraries.matrix.test.encryption.FakeEncryptionService
@ -40,7 +40,7 @@ class SecureBackupEnablePresenterTest {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.enableAction).isEqualTo(AsyncData.Uninitialized) assertThat(initialState.enableAction).isEqualTo(AsyncAction.Uninitialized)
} }
} }
@ -53,9 +53,9 @@ class SecureBackupEnablePresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(SecureBackupEnableEvents.EnableBackup) initialState.eventSink(SecureBackupEnableEvents.EnableBackup)
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.enableAction).isInstanceOf(AsyncData.Loading::class.java) assertThat(loadingState.enableAction).isInstanceOf(AsyncAction.Loading::class.java)
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.enableAction).isEqualTo(AsyncData.Success(Unit)) assertThat(finalState.enableAction).isEqualTo(AsyncAction.Success(Unit))
} }
} }
@ -70,12 +70,12 @@ class SecureBackupEnablePresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink(SecureBackupEnableEvents.EnableBackup) initialState.eventSink(SecureBackupEnableEvents.EnableBackup)
val loadingState = awaitItem() val loadingState = awaitItem()
assertThat(loadingState.enableAction).isInstanceOf(AsyncData.Loading::class.java) assertThat(loadingState.enableAction).isInstanceOf(AsyncAction.Loading::class.java)
val errorState = awaitItem() val errorState = awaitItem()
assertThat(errorState.enableAction).isEqualTo(AsyncData.Failure<Unit>(AN_EXCEPTION)) assertThat(errorState.enableAction).isEqualTo(AsyncAction.Failure(AN_EXCEPTION))
errorState.eventSink(SecureBackupEnableEvents.DismissDialog) errorState.eventSink(SecureBackupEnableEvents.DismissDialog)
val finalState = awaitItem() val finalState = awaitItem()
assertThat(finalState.enableAction).isEqualTo(AsyncData.Uninitialized) assertThat(finalState.enableAction).isEqualTo(AsyncAction.Uninitialized)
} }
} }