Use AsyncView in EditUserProfileView
This commit is contained in:
parent
537e4cd4a7
commit
044b6ac018
7 changed files with 24 additions and 37 deletions
|
|
@ -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) },
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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)) }
|
||||||
|
|
|
||||||
|
|
@ -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) }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 = {},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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 = {},
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue