From 759cd0f0e0518e846609ece5c22debff6911b946 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 16 Dec 2024 12:09:14 +0100 Subject: [PATCH] knock requests : manage remaining ui states --- .../impl/list/KnockRequestsListPresenter.kt | 7 +- .../impl/list/KnockRequestsListView.kt | 87 ++++++++++++++++--- 2 files changed, 78 insertions(+), 16 deletions(-) diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt index 04bc48dd4b..3a0d4ba7ae 100644 --- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt +++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt @@ -58,7 +58,9 @@ class KnockRequestsListPresenter @Inject constructor( actionTarget = KnockRequestsActionTarget.DeclineAndBan(event.knockRequest) } KnockRequestsListEvents.ResetCurrentAction -> { + asyncAction.value = AsyncAction.Uninitialized actionTarget = KnockRequestsActionTarget.None + targetActionConfirmed = false } KnockRequestsListEvents.RetryCurrentAction -> { retryCount++ @@ -103,10 +105,7 @@ class KnockRequestsListPresenter @Inject constructor( asyncAction.value = AsyncAction.ConfirmingNoParams } } - KnockRequestsActionTarget.None -> { - targetActionConfirmed = false - asyncAction.value = AsyncAction.Uninitialized - } + KnockRequestsActionTarget.None -> Unit } } diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt index 58ac4984f4..e928b3a726 100644 --- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt +++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListView.kt @@ -11,6 +11,7 @@ import androidx.compose.animation.animateContentSize import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Arrangement.spacedBy import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -72,7 +73,6 @@ 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.TextButton import io.element.android.libraries.designsystem.theme.components.TopAppBar -import io.element.android.libraries.matrix.api.timeline.item.virtual.VirtualTimelineItem import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList @@ -137,10 +137,18 @@ private fun KnockRequestsListContent( } } is AsyncData.Loading -> { - CircularProgressIndicator( - modifier = Modifier.align(Alignment.Center), - color = ElementTheme.colors.iconPrimary, - ) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = spacedBy(16.dp), + modifier = Modifier.align(Alignment.Center) + ) { + CircularProgressIndicator(color = ElementTheme.colors.iconPrimary) + Text( + text = stringResource(R.string.screen_knock_requests_list_initial_loading_title), + style = ElementTheme.typography.fontBodyLgRegular, + color = ElementTheme.colors.textPrimary, + ) + } } else -> Unit } @@ -186,23 +194,78 @@ private fun KnockRequestsActionsView( onSuccess = { onDismiss() }, onErrorDismiss = onDismiss, confirmationDialog = { - ConfirmationDialog( - title = "Confirmation", - content = "Are you sure?", - onSubmitClick = onConfirm, + KnockRequestActionConfirmation( + actionTarget = actionTarget, + onSubmit = onConfirm, onDismiss = onDismiss, ) }, progressDialog = { - ProgressDialog( - text = "Loading", - ) + KnockRequestActionProgress(target = actionTarget) + }, + errorMessage = { + when (actionTarget) { + is KnockRequestsActionTarget.Accept -> stringResource(R.string.screen_knock_requests_list_accept_failed_alert_description) + is KnockRequestsActionTarget.Decline -> stringResource(R.string.screen_knock_requests_list_accept_failed_alert_description) + is KnockRequestsActionTarget.DeclineAndBan -> stringResource(R.string.screen_knock_requests_list_accept_failed_alert_description) + KnockRequestsActionTarget.AcceptAll -> stringResource(R.string.screen_knock_requests_list_accept_failed_alert_description) + else -> "" + } }, onRetry = onRetry, ) } } +@Composable +private fun KnockRequestActionConfirmation( + actionTarget: KnockRequestsActionTarget, + onSubmit: () -> Unit, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, +) { + val (title, content) = when (actionTarget) { + KnockRequestsActionTarget.AcceptAll -> Pair( + stringResource(R.string.screen_knock_requests_list_accept_all_alert_title), + stringResource(R.string.screen_knock_requests_list_accept_all_alert_description), + ) + is KnockRequestsActionTarget.Decline -> Pair( + stringResource(R.string.screen_knock_requests_list_decline_alert_title), + stringResource(R.string.screen_knock_requests_list_decline_alert_description, actionTarget.knockRequest.getBestName()), + ) + is KnockRequestsActionTarget.DeclineAndBan -> Pair( + stringResource(R.string.screen_knock_requests_list_ban_alert_title), + stringResource(R.string.screen_knock_requests_list_ban_alert_description, actionTarget.knockRequest.getBestName()), + ) + else -> return + } + ConfirmationDialog( + title = title, + content = content, + onSubmitClick = onSubmit, + onDismiss = onDismiss, + modifier = modifier, + ) +} + +@Composable +private fun KnockRequestActionProgress( + target: KnockRequestsActionTarget, + modifier: Modifier = Modifier, +) { + val progressText = when (target) { + is KnockRequestsActionTarget.Accept -> stringResource(R.string.screen_knock_requests_list_accept_loading_title) + is KnockRequestsActionTarget.Decline -> stringResource(R.string.screen_knock_requests_list_decline_loading_title) + is KnockRequestsActionTarget.DeclineAndBan -> stringResource(R.string.screen_knock_requests_list_ban_loading_title) + KnockRequestsActionTarget.AcceptAll -> stringResource(R.string.screen_knock_requests_list_accept_all_loading_title) + else -> return + } + ProgressDialog( + text = progressText, + modifier = modifier, + ) +} + @Composable private fun KnockRequestsList( knockRequests: ImmutableList,