Added progress indicator for group editing (#875)

* Added progress indicator for group editing

* Max size on AndroidView and remove background, add semantics

* More update

* Reuse LoadingDialog

* Comment
pull/1709/head
SessionHero01 4 months ago committed by GitHub
parent 6b7afb8969
commit 46653d9229
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -264,6 +264,9 @@ class GroupManagerV2Impl @Inject constructor(
subAccountTokens = subAccountTokens subAccountTokens = subAccountTokens
) )
// Before we send the invitation, we need to make sure the configs are pushed
configFactory.waitUntilGroupConfigsPushed(group)
// Call the API // Call the API
try { try {
val swarmNode = SnodeAPI.getSingleTargetSnode(group.hexString).await() val swarmNode = SnodeAPI.getSingleTargetSnode(group.hexString).await()

@ -28,6 +28,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Alignment.Companion.CenterHorizontally
import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Alignment.Companion.CenterVertically
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
@ -53,9 +54,10 @@ import org.thoughtcrime.securesms.groups.getLabel
import org.thoughtcrime.securesms.ui.AlertDialog import org.thoughtcrime.securesms.ui.AlertDialog
import org.thoughtcrime.securesms.ui.DialogButtonModel import org.thoughtcrime.securesms.ui.DialogButtonModel
import org.thoughtcrime.securesms.ui.GetString import org.thoughtcrime.securesms.ui.GetString
import org.thoughtcrime.securesms.ui.components.BackAppBar import org.thoughtcrime.securesms.ui.LoadingDialog
import org.thoughtcrime.securesms.ui.components.ActionSheet import org.thoughtcrime.securesms.ui.components.ActionSheet
import org.thoughtcrime.securesms.ui.components.ActionSheetItemData import org.thoughtcrime.securesms.ui.components.ActionSheetItemData
import org.thoughtcrime.securesms.ui.components.BackAppBar
import org.thoughtcrime.securesms.ui.components.PrimaryOutlineButton import org.thoughtcrime.securesms.ui.components.PrimaryOutlineButton
import org.thoughtcrime.securesms.ui.components.SessionOutlinedTextField import org.thoughtcrime.securesms.ui.components.SessionOutlinedTextField
import org.thoughtcrime.securesms.ui.components.annotatedStringResource import org.thoughtcrime.securesms.ui.components.annotatedStringResource
@ -99,6 +101,7 @@ fun EditGroupScreen(
onMemberClicked = viewModel::onMemberClicked, onMemberClicked = viewModel::onMemberClicked,
hideActionSheet = viewModel::hideActionBottomSheet, hideActionSheet = viewModel::hideActionBottomSheet,
clickedMember = viewModel.clickedMember.collectAsState().value, clickedMember = viewModel.clickedMember.collectAsState().value,
showLoading = viewModel.inProgress.collectAsState().value,
) )
} }
@ -119,7 +122,7 @@ fun EditGroupScreen(
@Serializable @Serializable
private object RouteEditGroup private object RouteEditGroup
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
@Composable @Composable
fun EditGroup( fun EditGroup(
onBack: () -> Unit, onBack: () -> Unit,
@ -141,6 +144,7 @@ fun EditGroup(
members: List<GroupMemberState>, members: List<GroupMemberState>,
showAddMembers: Boolean, showAddMembers: Boolean,
showingError: String?, showingError: String?,
showLoading: Boolean,
onErrorDismissed: () -> Unit, onErrorDismissed: () -> Unit,
) { ) {
val (showingConfirmRemovingMember, setShowingConfirmRemovingMember) = remember { val (showingConfirmRemovingMember, setShowingConfirmRemovingMember) = remember {
@ -157,8 +161,8 @@ fun EditGroup(
) )
} }
) { paddingValues -> ) { paddingValues ->
Box {
Column(modifier = Modifier.padding(paddingValues)) { Column(modifier = Modifier.padding(paddingValues)) {
GroupMinimumVersionBanner() GroupMinimumVersionBanner()
// Group name title // Group name title
@ -167,7 +171,8 @@ fun EditGroup(
GroupNameContainer { GroupNameContainer {
IconButton( IconButton(
modifier = Modifier.size(LocalDimensions.current.spacing), modifier = Modifier.size(LocalDimensions.current.spacing),
onClick = onEditNameCancelClicked) { onClick = onEditNameCancelClicked
) {
Icon( Icon(
painter = painterResource(R.drawable.ic_x), painter = painterResource(R.drawable.ic_x),
contentDescription = stringResource(R.string.AccessibilityId_cancel), contentDescription = stringResource(R.string.AccessibilityId_cancel),
@ -176,7 +181,8 @@ fun EditGroup(
} }
SessionOutlinedTextField( SessionOutlinedTextField(
modifier = Modifier.widthIn( modifier = Modifier
.widthIn(
min = LocalDimensions.current.mediumSpacing, min = LocalDimensions.current.mediumSpacing,
max = maxNameWidth max = maxNameWidth
) )
@ -193,7 +199,8 @@ fun EditGroup(
IconButton( IconButton(
modifier = Modifier.size(LocalDimensions.current.spacing), modifier = Modifier.size(LocalDimensions.current.spacing),
onClick = onEditNameConfirmed) { onClick = onEditNameConfirmed
) {
Icon( Icon(
painter = painterResource(R.drawable.check), painter = painterResource(R.drawable.check),
contentDescription = stringResource(R.string.AccessibilityId_confirm), contentDescription = stringResource(R.string.AccessibilityId_confirm),
@ -210,7 +217,8 @@ fun EditGroup(
text = groupName, text = groupName,
style = LocalType.current.h4, style = LocalType.current.h4,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
modifier = Modifier.widthIn(max = maxNameWidth) modifier = Modifier
.widthIn(max = maxNameWidth)
.padding(vertical = LocalDimensions.current.smallSpacing), .padding(vertical = LocalDimensions.current.smallSpacing),
) )
@ -270,6 +278,7 @@ fun EditGroup(
} }
} }
} }
}
if (clickedMember != null) { if (clickedMember != null) {
MemberActionSheet( MemberActionSheet(
@ -305,6 +314,10 @@ fun EditGroup(
) )
} }
if (showLoading) {
LoadingDialog()
}
val context = LocalContext.current val context = LocalContext.current
LaunchedEffect(showingError) { LaunchedEffect(showingError) {
@ -515,7 +528,8 @@ private fun EditGroupPreview3() {
onErrorDismissed = {}, onErrorDismissed = {},
onMemberClicked = {}, onMemberClicked = {},
hideActionSheet = {}, hideActionSheet = {},
clickedMember = null clickedMember = null,
showLoading = true,
) )
} }
} }
@ -589,7 +603,8 @@ private fun EditGroupPreview() {
onErrorDismissed = {}, onErrorDismissed = {},
onMemberClicked = {}, onMemberClicked = {},
hideActionSheet = {}, hideActionSheet = {},
clickedMember = null clickedMember = null,
showLoading = false,
) )
} }
} }
@ -655,7 +670,8 @@ private fun EditGroupEditNamePreview() {
onErrorDismissed = {}, onErrorDismissed = {},
onMemberClicked = {}, onMemberClicked = {},
hideActionSheet = {}, hideActionSheet = {},
clickedMember = null clickedMember = null,
showLoading = false,
) )
} }
} }

@ -128,7 +128,8 @@ fun AlertDialog(
text = it, text = it,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = LocalType.current.h7, style = LocalType.current.h7,
modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing) modifier = Modifier
.padding(bottom = LocalDimensions.current.xxsSpacing)
.qaTag(stringResource(R.string.AccessibilityId_modalTitle)) .qaTag(stringResource(R.string.AccessibilityId_modalTitle))
) )
} }
@ -281,6 +282,17 @@ fun LoadingDialog(
modifier = modifier, modifier = modifier,
onDismissRequest = {}, onDismissRequest = {},
content = { content = {
if (title.isNullOrBlank()) {
Box {
CircularProgressIndicator(
modifier = Modifier.align(Alignment.Center),
//TODO: Leave this as hardcoded color for now as the dialog background (scrim)
// always seems to be dark. Can can revisit later when we have more control over
// the scrim color.
color = Color.White
)
}
} else {
DialogBg { DialogBg {
Column( Column(
modifier = Modifier modifier = Modifier
@ -293,10 +305,10 @@ fun LoadingDialog(
Spacer(modifier = Modifier.height(LocalDimensions.current.spacing)) Spacer(modifier = Modifier.height(LocalDimensions.current.spacing))
title?.let {
Text( Text(
it, title,
modifier = Modifier.align(Alignment.CenterHorizontally) modifier = Modifier
.align(Alignment.CenterHorizontally)
.qaTag(stringResource(R.string.AccessibilityId_modalTitle)), .qaTag(stringResource(R.string.AccessibilityId_modalTitle)),
style = LocalType.current.large style = LocalType.current.large
) )

Loading…
Cancel
Save