@ -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,115 +161,120 @@ fun EditGroup(
)
)
}
}
) { paddingValues ->
) { paddingValues ->
Column ( modifier = Modifier . padding ( paddingValues ) ) {
Box {
Column ( modifier = Modifier . padding ( paddingValues ) ) {
GroupMinimumVersionBanner ( )
GroupMinimumVersionBanner ( )
// Group name title
// Group name title
Crossfade ( editingName != null , label = " Editable group name " ) { showNameEditing ->
Crossfade ( editingName != null , label = " Editable group name " ) { showNameEditing ->
if ( showNameEditing ) {
if ( showNameEditing ) {
GroupNameContainer {
GroupNameContainer {
IconButton (
IconButton (
modifier = Modifier . size ( LocalDimensions . current . spacing ) ,
modifier = Modifier . size ( LocalDimensions . current . spacing ) ,
onClick = onEditNameCancelClicked ) {
onClick = onEditNameCancelClicked
Icon (
) {
painter = painterResource ( R . drawable . ic _x ) ,
Icon (
contentDescription = stringResource ( R . string . AccessibilityId _cancel ) ,
painter = painterResource ( R . drawable . ic _x ) ,
tint = LocalColors . current . text ,
contentDescription = stringResource ( R . string . AccessibilityId _cancel ) ,
)
tint = LocalColors . current . text ,
}
)
}
SessionOutlinedTextField (
SessionOutlinedTextField (
modifier = Modifier . widthIn (
modifier = Modifier
min = LocalDimensions . current . mediumSpacing ,
. widthIn (
max = maxNameWidth
min = LocalDimensions . current . mediumSpacing ,
)
max = maxNameWidth
. qaTag ( stringResource ( R . string . AccessibilityId _groupName ) ) ,
)
text = editingName . orEmpty ( ) ,
. qaTag ( stringResource ( R . string . AccessibilityId _groupName ) ) ,
onChange = onEditingNameValueChanged ,
text = editingName . orEmpty ( ) ,
textStyle = LocalType . current . h8 ,
onChange = onEditingNameValueChanged ,
singleLine = true ,
textStyle = LocalType . current . h8 ,
innerPadding = PaddingValues (
singleLine = true ,
horizontal = LocalDimensions . current . spacing ,
innerPadding = PaddingValues (
vertical = LocalDimensions . current . smallSpacing
horizontal = LocalDimensions . current . spacing ,
vertical = LocalDimensions . current . smallSpacing
)
)
)
)
IconButton (
IconButton (
modifier = Modifier . size ( LocalDimensions . current . spacing ) ,
modifier = Modifier . size ( LocalDimensions . current . spacing ) ,
onClick = onEditNameConfirmed ) {
onClick = onEditNameConfirmed
Icon (
) {
painter = painterResource ( R . drawable . check ) ,
Icon (
contentDescription = stringResource ( R . string . AccessibilityId _confirm ) ,
painter = painterResource ( R . drawable . check ) ,
tint = LocalColors . current . text ,
contentDescription = stringResource ( R . string . AccessibilityId _confirm ) ,
)
tint = LocalColors . current . text ,
)
}
}
}
}
} else {
} else {
GroupNameContainer {
GroupNameContainer {
Spacer ( modifier = Modifier . weight ( 1f ) )
Spacer ( modifier = Modifier . weight ( 1f ) )
Text (
Text (
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
. padding ( vertical = LocalDimensions . current . smallSpacing ) ,
. widthIn ( max = maxNameWidth )
)
. padding ( vertical = LocalDimensions . current . smallSpacing ) ,
)
Box ( modifier = Modifier . weight ( 1f ) ) {
Box ( modifier = Modifier . weight ( 1f ) ) {
if ( canEditName ) {
if ( canEditName ) {
IconButton (
IconButton (
modifier = Modifier . qaTag ( stringResource ( R . string . AccessibilityId _groupName ) ) ,
modifier = Modifier . qaTag ( stringResource ( R . string . AccessibilityId _groupName ) ) ,
onClick = onEditNameClicked
onClick = onEditNameClicked
) {
) {
Icon (
Icon (
painterResource ( R . drawable . ic _baseline _edit _24 ) ,
painterResource ( R . drawable . ic _baseline _edit _24 ) ,
contentDescription = stringResource ( R . string . edit ) ,
contentDescription = stringResource ( R . string . edit ) ,
tint = LocalColors . current . text ,
tint = LocalColors . current . text ,
)
)
}
}
}
}
}
}
}
}
}
}
}
}
// Header & Add member button
Row (
modifier = Modifier . padding (
horizontal = LocalDimensions . current . smallSpacing ,
vertical = LocalDimensions . current . xxsSpacing
) ,
verticalAlignment = CenterVertically
) {
Text (
stringResource ( R . string . groupMembers ) ,
modifier = Modifier . weight ( 1f ) ,
style = LocalType . current . large ,
color = LocalColors . current . text
)
if ( showAddMembers ) {
// Header & Add member button
PrimaryOutlineButton (
Row (
stringResource ( R . string . membersInvite ) ,
modifier = Modifier . padding (
onClick = onAddMemberClick ,
horizontal = LocalDimensions . current . smallSpacing ,
modifier = Modifier . qaTag ( stringResource ( R . string . AccessibilityId _membersInvite ) )
vertical = LocalDimensions . current . xxsSpacing
) ,
verticalAlignment = CenterVertically
) {
Text (
stringResource ( R . string . groupMembers ) ,
modifier = Modifier . weight ( 1f ) ,
style = LocalType . current . large ,
color = LocalColors . current . text
)
)
if ( showAddMembers ) {
PrimaryOutlineButton (
stringResource ( R . string . membersInvite ) ,
onClick = onAddMemberClick ,
modifier = Modifier . qaTag ( stringResource ( R . string . AccessibilityId _membersInvite ) )
)
}
}
}
}
// List of members
// List of members
LazyColumn ( modifier = Modifier ) {
LazyColumn ( modifier = Modifier ) {
items ( members ) { member ->
items ( members ) { member ->
// Each member's view
// Each member's view
EditMemberItem (
EditMemberItem (
modifier = Modifier . fillMaxWidth ( ) ,
modifier = Modifier . fillMaxWidth ( ) ,
member = member ,
member = member ,
onClick = { onMemberClicked ( member ) }
onClick = { onMemberClicked ( member ) }
)
)
}
}
}
}
}
}
}
@ -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 ,
)
)
}
}
}
}