misc: Provide ConfigureRoomState.availableVisibilityOptions from the presenter (#6024)

It seems better to handle the filtering logic there than on the view.

Besides this, hide knocking for spaces even if the knocking feature is enabled. We don't want to have knocking in spaces yet.
This commit is contained in:
Jorge Martin Espinosa 2026-01-19 10:54:00 +01:00 committed by GitHub
parent 666a5f4f74
commit acf919f2fb
4 changed files with 18 additions and 10 deletions

View file

@ -124,6 +124,14 @@ class ConfigureRoomPresenter(
val localCoroutineScope = rememberCoroutineScope() val localCoroutineScope = rememberCoroutineScope()
val createRoomAction: MutableState<AsyncAction<RoomId>> = remember { mutableStateOf(AsyncAction.Uninitialized) } val createRoomAction: MutableState<AsyncAction<RoomId>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
val availableVisibilityOptions = remember(isSpace, isKnockFeatureEnabled) {
listOfNotNull(
RoomVisibilityItem.Public,
RoomVisibilityItem.AskToJoin.takeIf { !isSpace && isKnockFeatureEnabled },
RoomVisibilityItem.Private,
).toImmutableList()
}
fun createRoom(config: CreateRoomConfig) { fun createRoom(config: CreateRoomConfig) {
createRoomAction.value = AsyncAction.Uninitialized createRoomAction.value = AsyncAction.Uninitialized
localCoroutineScope.createRoom(config, createRoomAction) localCoroutineScope.createRoom(config, createRoomAction)
@ -155,13 +163,13 @@ class ConfigureRoomPresenter(
} }
return ConfigureRoomState( return ConfigureRoomState(
isKnockFeatureEnabled = isKnockFeatureEnabled,
config = createRoomConfig, config = createRoomConfig,
avatarActions = avatarActions, avatarActions = avatarActions,
createRoomAction = createRoomAction.value, createRoomAction = createRoomAction.value,
cameraPermissionState = cameraPermissionState, cameraPermissionState = cameraPermissionState,
homeserverName = homeserverName, homeserverName = homeserverName,
roomAddressValidity = roomAddressValidity.value, roomAddressValidity = roomAddressValidity.value,
availableVisibilityOptions = availableVisibilityOptions,
eventSink = ::handleEvent, eventSink = ::handleEvent,
) )
} }

View file

@ -16,13 +16,13 @@ import io.element.android.libraries.permissions.api.PermissionsState
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
data class ConfigureRoomState( data class ConfigureRoomState(
val isKnockFeatureEnabled: Boolean,
val config: CreateRoomConfig, val config: CreateRoomConfig,
val avatarActions: ImmutableList<AvatarAction>, val avatarActions: ImmutableList<AvatarAction>,
val createRoomAction: AsyncAction<RoomId>, val createRoomAction: AsyncAction<RoomId>,
val cameraPermissionState: PermissionsState, val cameraPermissionState: PermissionsState,
val roomAddressValidity: RoomAddressValidity, val roomAddressValidity: RoomAddressValidity,
val homeserverName: String, val homeserverName: String,
val availableVisibilityOptions: ImmutableList<RoomVisibilityItem>,
val eventSink: (ConfigureRoomEvents) -> Unit val eventSink: (ConfigureRoomEvents) -> Unit
) { ) {
val isValid: Boolean = config.roomName?.isNotEmpty() == true && val isValid: Boolean = config.roomName?.isNotEmpty() == true &&

View file

@ -101,14 +101,17 @@ fun aConfigureRoomState(
cameraPermissionState: PermissionsState = aPermissionsState(showDialog = false), cameraPermissionState: PermissionsState = aPermissionsState(showDialog = false),
homeserverName: String = "matrix.org", homeserverName: String = "matrix.org",
roomAddressValidity: RoomAddressValidity = RoomAddressValidity.Valid, roomAddressValidity: RoomAddressValidity = RoomAddressValidity.Valid,
availableVisibilityOptions: List<RoomVisibilityItem> = RoomVisibilityItem.entries.filter {
if (!isKnockFeatureEnabled) it != RoomVisibilityItem.AskToJoin else true
},
eventSink: (ConfigureRoomEvents) -> Unit = { }, eventSink: (ConfigureRoomEvents) -> Unit = { },
) = ConfigureRoomState( ) = ConfigureRoomState(
config = config, config = config,
isKnockFeatureEnabled = isKnockFeatureEnabled,
avatarActions = avatarActions.toImmutableList(), avatarActions = avatarActions.toImmutableList(),
createRoomAction = createRoomAction, createRoomAction = createRoomAction,
cameraPermissionState = cameraPermissionState, cameraPermissionState = cameraPermissionState,
homeserverName = homeserverName, homeserverName = homeserverName,
roomAddressValidity = roomAddressValidity, roomAddressValidity = roomAddressValidity,
availableVisibilityOptions = availableVisibilityOptions.toImmutableList(),
eventSink = eventSink, eventSink = eventSink,
) )

View file

@ -65,6 +65,7 @@ import io.element.android.libraries.matrix.ui.components.AvatarPickerView
import io.element.android.libraries.matrix.ui.room.address.RoomAddressField import io.element.android.libraries.matrix.ui.room.address.RoomAddressField
import io.element.android.libraries.permissions.api.PermissionsView import io.element.android.libraries.permissions.api.PermissionsView
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList
import kotlin.jvm.optionals.getOrNull import kotlin.jvm.optionals.getOrNull
@Composable @Composable
@ -120,6 +121,7 @@ fun ConfigureRoomView(
) )
RoomVisibilityAndAccessOptions( RoomVisibilityAndAccessOptions(
options = state.availableVisibilityOptions,
selected = when (state.config.roomVisibility) { selected = when (state.config.roomVisibility) {
is RoomVisibilityState.Private -> RoomVisibilityItem.Private is RoomVisibilityState.Private -> RoomVisibilityItem.Private
is RoomVisibilityState.Public -> when (state.config.roomVisibility.roomAccess) { is RoomVisibilityState.Public -> when (state.config.roomVisibility.roomAccess) {
@ -127,7 +129,6 @@ fun ConfigureRoomView(
RoomAccess.Anyone -> RoomVisibilityItem.Public RoomAccess.Anyone -> RoomVisibilityItem.Public
} }
}, },
isKnockingEnabled = state.isKnockFeatureEnabled,
onOptionClick = { onOptionClick = {
focusManager.clearFocus() focusManager.clearFocus()
state.eventSink(ConfigureRoomEvents.RoomVisibilityChanged(it)) state.eventSink(ConfigureRoomEvents.RoomVisibilityChanged(it))
@ -279,8 +280,8 @@ private fun ConfigureRoomOptions(
@Composable @Composable
private fun RoomVisibilityAndAccessOptions( private fun RoomVisibilityAndAccessOptions(
options: ImmutableList<RoomVisibilityItem>,
selected: RoomVisibilityItem, selected: RoomVisibilityItem,
isKnockingEnabled: Boolean,
onOptionClick: (RoomVisibilityItem) -> Unit, onOptionClick: (RoomVisibilityItem) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
@ -288,11 +289,7 @@ private fun RoomVisibilityAndAccessOptions(
title = stringResource(R.string.screen_create_room_room_access_section_title), title = stringResource(R.string.screen_create_room_room_access_section_title),
modifier = modifier, modifier = modifier,
) { ) {
RoomVisibilityItem.entries.forEach { item -> options.forEach { item ->
if (item == RoomVisibilityItem.AskToJoin && !isKnockingEnabled) {
return@forEach
}
val isSelected = item == selected val isSelected = item == selected
ListItem( ListItem(
leadingContent = ListItemContent.Custom { leadingContent = ListItemContent.Custom {