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 2e353848f9
commit 2c635c04a9
4 changed files with 18 additions and 10 deletions
@@ -124,6 +124,14 @@ class ConfigureRoomPresenter(
val localCoroutineScope = rememberCoroutineScope()
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) {
createRoomAction.value = AsyncAction.Uninitialized
localCoroutineScope.createRoom(config, createRoomAction)
@@ -155,13 +163,13 @@ class ConfigureRoomPresenter(
}
return ConfigureRoomState(
isKnockFeatureEnabled = isKnockFeatureEnabled,
config = createRoomConfig,
avatarActions = avatarActions,
createRoomAction = createRoomAction.value,
cameraPermissionState = cameraPermissionState,
homeserverName = homeserverName,
roomAddressValidity = roomAddressValidity.value,
availableVisibilityOptions = availableVisibilityOptions,
eventSink = ::handleEvent,
)
}
@@ -16,13 +16,13 @@ import io.element.android.libraries.permissions.api.PermissionsState
import kotlinx.collections.immutable.ImmutableList
data class ConfigureRoomState(
val isKnockFeatureEnabled: Boolean,
val config: CreateRoomConfig,
val avatarActions: ImmutableList<AvatarAction>,
val createRoomAction: AsyncAction<RoomId>,
val cameraPermissionState: PermissionsState,
val roomAddressValidity: RoomAddressValidity,
val homeserverName: String,
val availableVisibilityOptions: ImmutableList<RoomVisibilityItem>,
val eventSink: (ConfigureRoomEvents) -> Unit
) {
val isValid: Boolean = config.roomName?.isNotEmpty() == true &&
@@ -101,14 +101,17 @@ fun aConfigureRoomState(
cameraPermissionState: PermissionsState = aPermissionsState(showDialog = false),
homeserverName: String = "matrix.org",
roomAddressValidity: RoomAddressValidity = RoomAddressValidity.Valid,
availableVisibilityOptions: List<RoomVisibilityItem> = RoomVisibilityItem.entries.filter {
if (!isKnockFeatureEnabled) it != RoomVisibilityItem.AskToJoin else true
},
eventSink: (ConfigureRoomEvents) -> Unit = { },
) = ConfigureRoomState(
config = config,
isKnockFeatureEnabled = isKnockFeatureEnabled,
avatarActions = avatarActions.toImmutableList(),
createRoomAction = createRoomAction,
cameraPermissionState = cameraPermissionState,
homeserverName = homeserverName,
roomAddressValidity = roomAddressValidity,
availableVisibilityOptions = availableVisibilityOptions.toImmutableList(),
eventSink = eventSink,
)
@@ -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.permissions.api.PermissionsView
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList
import kotlin.jvm.optionals.getOrNull
@Composable
@@ -120,6 +121,7 @@ fun ConfigureRoomView(
)
RoomVisibilityAndAccessOptions(
options = state.availableVisibilityOptions,
selected = when (state.config.roomVisibility) {
is RoomVisibilityState.Private -> RoomVisibilityItem.Private
is RoomVisibilityState.Public -> when (state.config.roomVisibility.roomAccess) {
@@ -127,7 +129,6 @@ fun ConfigureRoomView(
RoomAccess.Anyone -> RoomVisibilityItem.Public
}
},
isKnockingEnabled = state.isKnockFeatureEnabled,
onOptionClick = {
focusManager.clearFocus()
state.eventSink(ConfigureRoomEvents.RoomVisibilityChanged(it))
@@ -279,8 +280,8 @@ private fun ConfigureRoomOptions(
@Composable
private fun RoomVisibilityAndAccessOptions(
options: ImmutableList<RoomVisibilityItem>,
selected: RoomVisibilityItem,
isKnockingEnabled: Boolean,
onOptionClick: (RoomVisibilityItem) -> Unit,
modifier: Modifier = Modifier,
) {
@@ -288,11 +289,7 @@ private fun RoomVisibilityAndAccessOptions(
title = stringResource(R.string.screen_create_room_room_access_section_title),
modifier = modifier,
) {
RoomVisibilityItem.entries.forEach { item ->
if (item == RoomVisibilityItem.AskToJoin && !isKnockingEnabled) {
return@forEach
}
options.forEach { item ->
val isSelected = item == selected
ListItem(
leadingContent = ListItemContent.Custom {