misc(power level) : use new api

This commit is contained in:
ganfra 2025-12-08 22:23:07 +01:00
parent 44535243ef
commit d654280e30
29 changed files with 312 additions and 334 deletions

View file

@ -30,10 +30,9 @@ 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.RoomMember
import io.element.android.libraries.matrix.api.room.RoomMembershipState
import io.element.android.libraries.matrix.api.room.powerlevels.permissionsAsState
import io.element.android.libraries.matrix.api.room.roomMembers
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.room.canBanAsState
import io.element.android.libraries.matrix.ui.room.canKickAsState
import io.element.android.libraries.matrix.ui.room.userPowerLevelAsState
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.ImmutableList
@ -56,8 +55,12 @@ class RoomMemberModerationPresenter(
override fun present(): RoomMemberModerationState {
val coroutineScope = rememberCoroutineScope()
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
val canBan = room.canBanAsState(syncUpdateFlow.value)
val canKick = room.canKickAsState(syncUpdateFlow.value)
val permissions by room.permissionsAsState(Permissions()) { perms ->
Permissions(
canKick = perms.canOwnUserKick(),
canBan = perms.canOwnUserBan(),
)
}
val currentUserMemberPowerLevel = room.userPowerLevelAsState(syncUpdateFlow.value)
val kickUserAsyncAction =
@ -80,8 +83,7 @@ class RoomMemberModerationPresenter(
}
moderationActions.value = computeModerationActions(
member = member,
canKick = canKick.value,
canBan = canBan.value,
permissions = permissions,
currentUserMemberPowerLevel = currentUserMemberPowerLevel.value,
)
}
@ -134,8 +136,8 @@ class RoomMemberModerationPresenter(
}
return InternalRoomMemberModerationState(
canKick = canKick.value,
canBan = canBan.value,
canKick = permissions.canKick,
canBan = permissions.canBan,
selectedUser = selectedUser,
actions = moderationActions.value,
kickUserAsyncAction = kickUserAsyncAction.value,
@ -147,8 +149,7 @@ class RoomMemberModerationPresenter(
private fun computeModerationActions(
member: RoomMember?,
canKick: Boolean,
canBan: Boolean,
permissions: Permissions,
currentUserMemberPowerLevel: Long,
): ImmutableList<ModerationActionState> {
return buildList {
@ -158,11 +159,11 @@ class RoomMemberModerationPresenter(
val canModerateThisUser = currentUserMemberPowerLevel > targetMemberPowerLevel
// Assume the member is joined when it's unknown
val membership = member?.membership ?: RoomMembershipState.JOIN
if (canKick) {
if (permissions.canKick) {
val isKickEnabled = canModerateThisUser && membership.isActive()
add(ModerationActionState(action = ModerationAction.KickUser, isEnabled = isKickEnabled))
}
if (canBan) {
if (permissions.canBan) {
if (membership == RoomMembershipState.BAN) {
add(ModerationActionState(action = ModerationAction.UnbanUser, isEnabled = canModerateThisUser))
} else {
@ -208,6 +209,11 @@ class RoomMemberModerationPresenter(
)
}
private data class Permissions(
val canKick: Boolean = false,
val canBan: Boolean = false,
)
private fun <T> CoroutineScope.runActionAndWaitForMembershipChange(
action: MutableState<AsyncAction<T>>,
block: suspend () -> Result<T>