@ -25,28 +25,65 @@ import androidx.compose.ui.res.stringResource
@@ -25,28 +25,65 @@ import androidx.compose.ui.res.stringResource
import io.element.android.features.roomdetails.impl.R
import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsEvents
import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsState
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.core.bool.orFalse
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.dialogs.RetryDialog
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
internal fun BlockUserSection ( state : RoomMemberDetailsState , modifier : Modifier = Modifier ) {
PreferenceCategory ( showDivider = false , modifier = modifier ) {
if ( state . isBlocked ) {
PreferenceText (
title = stringResource ( R . string . screen _dm _details _unblock _user ) ,
icon = Icons . Outlined . Block ,
onClick = { state . eventSink ( RoomMemberDetailsEvents . UnblockUser ( needsConfirmation = true ) ) } ,
)
} else {
PreferenceText (
title = stringResource ( R . string . screen _dm _details _block _user ) ,
icon = Icons . Outlined . Block ,
tintColor = MaterialTheme . colorScheme . error ,
onClick = { state . eventSink ( RoomMemberDetailsEvents . BlockUser ( needsConfirmation = true ) ) } ,
)
when ( state . isBlocked ) {
is Async . Failure -> PreferenceBlockUser ( isBlocked = state . isBlocked . prevData , isLoading = false , eventSink = state . eventSink )
is Async . Loading -> PreferenceBlockUser ( isBlocked = state . isBlocked . prevData , isLoading = true , eventSink = state . eventSink )
is Async . Success -> PreferenceBlockUser ( isBlocked = state . isBlocked . data , isLoading = false , eventSink = state . eventSink )
Async . Uninitialized -> PreferenceBlockUser ( isBlocked = null , isLoading = true , eventSink = state . eventSink )
}
}
if ( state . isBlocked is Async . Failure ) {
RetryDialog (
content = stringResource ( CommonStrings . error _unknown ) ,
onDismiss = { state . eventSink ( RoomMemberDetailsEvents . ClearBlockUserError ) } ,
onRetry = {
val event = when ( state . isBlocked . prevData ) {
true -> RoomMemberDetailsEvents . UnblockUser ( needsConfirmation = false )
false -> RoomMemberDetailsEvents . BlockUser ( needsConfirmation = false )
null -> /*Should not happen */ RoomMemberDetailsEvents . ClearBlockUserError
}
state . eventSink ( event )
} ,
)
}
}
@Composable
private fun PreferenceBlockUser (
isBlocked : Boolean ? ,
isLoading : Boolean ,
eventSink : ( RoomMemberDetailsEvents ) -> Unit ,
modifier : Modifier = Modifier ,
) {
if ( isBlocked . orFalse ( ) ) {
PreferenceText (
title = stringResource ( R . string . screen _dm _details _unblock _user ) ,
icon = Icons . Outlined . Block ,
onClick = { if ( !is Loading ) eventSink ( RoomMemberDetailsEvents . UnblockUser ( needsConfirmation = true ) ) } ,
loadingCurrentValue = isLoading ,
modifier = modifier ,
)
} else {
PreferenceText (
title = stringResource ( R . string . screen _dm _details _block _user ) ,
icon = Icons . Outlined . Block ,
tintColor = MaterialTheme . colorScheme . error ,
onClick = { if ( !is Loading ) eventSink ( RoomMemberDetailsEvents . BlockUser ( needsConfirmation = true ) ) } ,
loadingCurrentValue = isLoading ,
modifier = modifier ,
)
}
}
@Composable