Use AsyncView in EditUserProfileView

This commit is contained in:
Benoit Marty 2023-11-03 16:35:34 +01:00 committed by Benoit Marty
parent 537e4cd4a7
commit 044b6ac018
7 changed files with 24 additions and 37 deletions

View file

@ -149,12 +149,11 @@ fun ConfigureRoomView(
onActionSelected = { state.eventSink(ConfigureRoomEvents.HandleAvatarAction(it)) } onActionSelected = { state.eventSink(ConfigureRoomEvents.HandleAvatarAction(it)) }
) )
val errorMessage = stringResource(R.string.screen_create_room_error_creating_room)
AsyncView( AsyncView(
async = state.createRoomAction, async = state.createRoomAction,
progressText = stringResource(CommonStrings.common_creating_room), progressText = stringResource(CommonStrings.common_creating_room),
onSuccess = { onRoomCreated(it) }, onSuccess = { onRoomCreated(it) },
errorTransform = { errorMessage }, errorMessage = { stringResource(R.string.screen_create_room_error_creating_room) },
onRetry = { state.eventSink(ConfigureRoomEvents.CreateRoom(state.config)) }, onRetry = { state.eventSink(ConfigureRoomEvents.CreateRoom(state.config)) },
onErrorDismiss = { state.eventSink(ConfigureRoomEvents.CancelCreateRoom) }, onErrorDismiss = { state.eventSink(ConfigureRoomEvents.CancelCreateRoom) },
) )

View file

@ -93,12 +93,11 @@ fun CreateRoomRootView(
} }
} }
val errorMessage = stringResource(R.string.screen_start_chat_error_starting_chat)
AsyncView( AsyncView(
async = state.startDmAction, async = state.startDmAction,
progressText = stringResource(CommonStrings.common_starting_chat), progressText = stringResource(CommonStrings.common_starting_chat),
onSuccess = { onOpenDM(it) }, onSuccess = { onOpenDM(it) },
errorTransform = { errorMessage }, errorMessage = { stringResource(R.string.screen_start_chat_error_starting_chat) },
onRetry = { onRetry = {
state.userListState.selectedUsers.firstOrNull() state.userListState.selectedUsers.firstOrNull()
?.let { state.eventSink(CreateRoomRootEvents.StartDM(it)) } ?.let { state.eventSink(CreateRoomRootEvents.StartDM(it)) }

View file

@ -63,12 +63,11 @@ fun ReportMessageView(
) { ) {
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
val isSending = state.result is Async.Loading val isSending = state.result is Async.Loading
val errorMessage = stringResource(CommonStrings.error_unknown)
AsyncView( AsyncView(
async = state.result, async = state.result,
showProgressDialog = false, showProgressDialog = false,
onSuccess = { onBackClicked() }, onSuccess = { onBackClicked() },
errorTransform = { errorMessage }, errorMessage = { stringResource(CommonStrings.error_unknown) },
onErrorDismiss = { state.eventSink(ReportMessageEvents.ClearError) } onErrorDismiss = { state.eventSink(ReportMessageEvents.ClearError) }
) )

View file

@ -78,10 +78,9 @@ fun NotificationSettingsView(
// onCallsNotificationsChanged = { state.eventSink(NotificationSettingsEvents.SetCallNotificationsEnabled(it)) }, // onCallsNotificationsChanged = { state.eventSink(NotificationSettingsEvents.SetCallNotificationsEnabled(it)) },
) )
} }
val errorMessage = stringResource(CommonStrings.screen_notification_settings_edit_failed_updating_default_mode)
AsyncView( AsyncView(
async = state.changeNotificationSettingAction, async = state.changeNotificationSettingAction,
errorTransform = { errorMessage }, errorMessage = { stringResource(CommonStrings.screen_notification_settings_edit_failed_updating_default_mode) },
onErrorDismiss = { state.eventSink(NotificationSettingsEvents.ClearNotificationChangeError) }, onErrorDismiss = { state.eventSink(NotificationSettingsEvents.ClearNotificationChangeError) },
onSuccess = {}, onSuccess = {},
) )

View file

@ -115,10 +115,9 @@ fun EditDefaultNotificationSettingView(
} }
} }
} }
val errorMessage = stringResource(CommonStrings.screen_notification_settings_edit_failed_updating_default_mode)
AsyncView( AsyncView(
async = state.changeNotificationSettingAction, async = state.changeNotificationSettingAction,
errorTransform = { errorMessage }, errorMessage = { stringResource(CommonStrings.screen_notification_settings_edit_failed_updating_default_mode) },
onErrorDismiss = { state.eventSink(EditDefaultNotificationSettingStateEvents.ClearError) }, onErrorDismiss = { state.eventSink(EditDefaultNotificationSettingStateEvents.ClearError) },
onSuccess = {}, onSuccess = {},
) )

View file

@ -31,7 +31,6 @@ import androidx.compose.material.ModalBottomSheetValue
import androidx.compose.material.rememberModalBottomSheetState import androidx.compose.material.rememberModalBottomSheetState
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -43,14 +42,12 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.element.android.features.preferences.impl.R import io.element.android.features.preferences.impl.R
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.designsystem.components.LabelledOutlinedTextField import io.element.android.libraries.designsystem.components.LabelledOutlinedTextField
import io.element.android.libraries.designsystem.components.ProgressDialog import io.element.android.libraries.designsystem.components.async.AsyncView
import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
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.theme.aliasScreenTitle import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
@ -150,24 +147,14 @@ fun EditUserProfileView(
onActionSelected = { state.eventSink(EditUserProfileEvents.HandleAvatarAction(it)) } onActionSelected = { state.eventSink(EditUserProfileEvents.HandleAvatarAction(it)) }
) )
when (state.saveAction) { AsyncView(
is Async.Loading -> { async = state.saveAction,
ProgressDialog(text = stringResource(R.string.screen_edit_profile_updating_details)) progressText = stringResource(R.string.screen_edit_profile_updating_details),
} onSuccess = { onProfileEdited() },
is Async.Failure -> { errorTitle = { stringResource(R.string.screen_edit_profile_error_title) },
ErrorDialog( errorMessage = { stringResource(R.string.screen_edit_profile_error) },
title = stringResource(R.string.screen_edit_profile_error_title), onErrorDismiss = { state.eventSink(EditUserProfileEvents.CancelSaveChanges) },
content = stringResource(R.string.screen_edit_profile_error), )
onDismiss = { state.eventSink(EditUserProfileEvents.CancelSaveChanges) },
)
}
is Async.Success -> {
LaunchedEffect(state.saveAction) {
onProfileEdited()
}
}
else -> Unit
}
} }
PermissionsView( PermissionsView(
state = state.cameraPermissionState, state = state.cameraPermissionState,

View file

@ -23,6 +23,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Async
import io.element.android.libraries.designsystem.components.ProgressDialog import io.element.android.libraries.designsystem.components.ProgressDialog
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialogDefaults
import io.element.android.libraries.designsystem.components.dialogs.RetryDialog import io.element.android.libraries.designsystem.components.dialogs.RetryDialog
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
@ -30,7 +31,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight
/** /**
* Render an Async object. * Render an Async object.
* - If Success, invoke the callback [onSuccess], only once. * - If Success, invoke the callback [onSuccess], only once.
* - If Failure, display a dialog with the error, which can be transformed, using [errorTransform]. When * - If Failure, display a dialog with the error, which can be transformed, using [errorMessage]. When
* closed, [onErrorDismiss] will be invoked. If [onRetry] is not null, a retry button will be displayed. * closed, [onErrorDismiss] will be invoked. If [onRetry] is not null, a retry button will be displayed.
* - When loading, display a loading dialog, if [showProgressDialog] is true, with on optional [progressText]. * - When loading, display a loading dialog, if [showProgressDialog] is true, with on optional [progressText].
*/ */
@ -42,9 +43,11 @@ fun <T> AsyncView(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
showProgressDialog: Boolean = true, showProgressDialog: Boolean = true,
progressText: String? = null, progressText: String? = null,
errorTransform: (Throwable) -> String = { it.message ?: it.toString() }, errorTitle: @Composable (Throwable) -> String = { ErrorDialogDefaults.title },
errorMessage: @Composable (Throwable) -> String = { it.message ?: it.toString() },
onRetry: (() -> Unit)? = null, onRetry: (() -> Unit)? = null,
) { ) {
when (async) { when (async) {
Async.Uninitialized -> Unit Async.Uninitialized -> Unit
is Async.Loading -> { is Async.Loading -> {
@ -59,13 +62,15 @@ fun <T> AsyncView(
if (onRetry == null) { if (onRetry == null) {
ErrorDialog( ErrorDialog(
modifier = modifier, modifier = modifier,
content = errorTransform(async.error), title = errorTitle(async.error),
content = errorMessage(async.error),
onDismiss = onErrorDismiss onDismiss = onErrorDismiss
) )
} else { } else {
RetryDialog( RetryDialog(
modifier = modifier, modifier = modifier,
content = errorTransform(async.error), title = errorTitle(async.error),
content = errorMessage(async.error),
onDismiss = onErrorDismiss, onDismiss = onErrorDismiss,
onRetry = onRetry, onRetry = onRetry,
) )