change(roles and permissions): clean code

This commit is contained in:
ganfra 2025-11-05 15:31:48 +01:00
parent 288171ba90
commit fca62a333e
8 changed files with 22 additions and 23 deletions

View file

@ -96,7 +96,7 @@ class HomeFlowNode(
val isNewOwnerSelected = changeRoomMemberRolesNode.waitForCompletion() val isNewOwnerSelected = changeRoomMemberRolesNode.waitForCompletion()
withContext(NonCancellable) { withContext(NonCancellable) {
backstack.pop() backstack.pop()
if(isNewOwnerSelected) { if (isNewOwnerSelected) {
onNewOwnersSelected(changeRoomMemberRolesNode.roomId) onNewOwnersSelected(changeRoomMemberRolesNode.roomId)
} }
} }

View file

@ -10,7 +10,6 @@ package io.element.android.features.rolesandpermissions.api
import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.Node
import io.element.android.libraries.architecture.FeatureEntryPoint import io.element.android.libraries.architecture.FeatureEntryPoint
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.JoinedRoom

View file

@ -62,7 +62,7 @@ class RolesAndPermissionsFlowNode(
data object ChangeModerators : NavTarget data object ChangeModerators : NavTarget
@Parcelize @Parcelize
data object ChangeRoomPermissions: NavTarget data object ChangeRoomPermissions : NavTarget
} }
private val asyncIndicatorState = AsyncIndicatorState() private val asyncIndicatorState = AsyncIndicatorState()
@ -101,7 +101,6 @@ class RolesAndPermissionsFlowNode(
override fun openEditPermissions() { override fun openEditPermissions() {
backstack.push(NavTarget.ChangeRoomPermissions) backstack.push(NavTarget.ChangeRoomPermissions)
} }
} }
createNode<RolesAndPermissionsNode>( createNode<RolesAndPermissionsNode>(
buildContext = buildContext, buildContext = buildContext,
@ -127,8 +126,6 @@ class RolesAndPermissionsFlowNode(
} }
} }
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
Box(modifier = modifier) { Box(modifier = modifier) {

View file

@ -25,7 +25,6 @@ class ChangeRoomPermissionsNode(
@Assisted plugins: List<Plugin>, @Assisted plugins: List<Plugin>,
private val presenter: ChangeRoomPermissionsPresenter, private val presenter: ChangeRoomPermissionsPresenter,
) : Node(buildContext, plugins = plugins) { ) : Node(buildContext, plugins = plugins) {
interface Callback : Plugin { interface Callback : Plugin {
fun onComplete(changesSaved: Boolean) fun onComplete(changesSaved: Boolean)
} }

View file

@ -24,7 +24,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableMap
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -51,14 +51,22 @@ class ChangeRoomPermissionsPresenter(
) )
} }
internal fun buildItems(forSpace: Boolean) = persistentMapOf( private fun RoomPermissionsSection.shouldShow(isSpace: Boolean): Boolean {
RoomPermissionsSection.RoomDetails to itemsForSection(RoomPermissionsSection.RoomDetails), return when (this) {
RoomPermissionsSection.MessagesAndContent to itemsForSection(RoomPermissionsSection.MessagesAndContent), RoomPermissionsSection.RoomDetails -> true
RoomPermissionsSection.MembershipModeration to itemsForSection(RoomPermissionsSection.MembershipModeration), RoomPermissionsSection.MembershipModeration -> true
) RoomPermissionsSection.MessagesAndContent -> !isSpace
}
}
internal fun buildItems(isSpace: Boolean) =
RoomPermissionsSection.entries
.filter { section -> section.shouldShow(isSpace) }
.associateWith { itemsForSection(it) }
.toImmutableMap()
} }
private val items = buildItems(forSpace = room.info().isSpace) private val itemsBySection = buildItems(isSpace = room.info().isSpace)
private var initialPermissions by mutableStateOf<RoomPowerLevelsValues?>(null) private var initialPermissions by mutableStateOf<RoomPowerLevelsValues?>(null)
private var currentPermissions by mutableStateOf<RoomPowerLevelsValues?>(null) private var currentPermissions by mutableStateOf<RoomPowerLevelsValues?>(null)
@ -112,7 +120,7 @@ class ChangeRoomPermissionsPresenter(
} }
return ChangeRoomPermissionsState( return ChangeRoomPermissionsState(
currentPermissions = currentPermissions, currentPermissions = currentPermissions,
itemsBySection = items, itemsBySection = itemsBySection,
hasChanges = hasChanges, hasChanges = hasChanges,
saveAction = saveAction, saveAction = saveAction,
confirmExitAction = confirmExitAction, confirmExitAction = confirmExitAction,

View file

@ -25,9 +25,9 @@ data class ChangeRoomPermissionsState(
val saveAction: AsyncAction<Unit>, val saveAction: AsyncAction<Unit>,
val confirmExitAction: AsyncAction<Unit>, val confirmExitAction: AsyncAction<Unit>,
val eventSink: (ChangeRoomPermissionsEvent) -> Unit, val eventSink: (ChangeRoomPermissionsEvent) -> Unit,
){ ) {
fun selectedRoleForType(type: RoomPermissionType): SelectableRole? { fun selectedRoleForType(type: RoomPermissionType): SelectableRole? {
if(currentPermissions == null) return null if (currentPermissions == null) return null
val role = when (type) { val role = when (type) {
RoomPermissionType.BAN -> RoomMember.Role.forPowerLevel(currentPermissions.ban) RoomPermissionType.BAN -> RoomMember.Role.forPowerLevel(currentPermissions.ban)
RoomPermissionType.INVITE -> RoomMember.Role.forPowerLevel(currentPermissions.invite) RoomPermissionType.INVITE -> RoomMember.Role.forPowerLevel(currentPermissions.invite)
@ -38,14 +38,13 @@ data class ChangeRoomPermissionsState(
RoomPermissionType.ROOM_AVATAR -> RoomMember.Role.forPowerLevel(currentPermissions.roomAvatar) RoomPermissionType.ROOM_AVATAR -> RoomMember.Role.forPowerLevel(currentPermissions.roomAvatar)
RoomPermissionType.ROOM_TOPIC -> RoomMember.Role.forPowerLevel(currentPermissions.roomTopic) RoomPermissionType.ROOM_TOPIC -> RoomMember.Role.forPowerLevel(currentPermissions.roomTopic)
} }
return when(role){ return when (role) {
is RoomMember.Role.Owner, is RoomMember.Role.Owner,
RoomMember.Role.Admin -> SelectableRole.Admin RoomMember.Role.Admin -> SelectableRole.Admin
RoomMember.Role.Moderator -> SelectableRole.Moderator RoomMember.Role.Moderator -> SelectableRole.Moderator
RoomMember.Role.User -> SelectableRole.Everyone RoomMember.Role.User -> SelectableRole.Everyone
} }
} }
} }
enum class RoomPermissionsSection { enum class RoomPermissionsSection {
@ -54,7 +53,7 @@ enum class RoomPermissionsSection {
MembershipModeration, MembershipModeration,
} }
enum class SelectableRole: DropdownOption { enum class SelectableRole : DropdownOption {
Admin { Admin {
@Composable @Composable
@ReadOnlyComposable @ReadOnlyComposable
@ -72,7 +71,6 @@ enum class SelectableRole: DropdownOption {
} }
} }
enum class RoomPermissionType { enum class RoomPermissionType {
BAN, BAN,
INVITE, INVITE,

View file

@ -27,7 +27,6 @@ import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
import io.element.android.libraries.di.annotations.SessionCoroutineScope
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMember

View file

@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MenuAnchorType
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf