misc(power level) : use new api
This commit is contained in:
parent
44535243ef
commit
d654280e30
29 changed files with 312 additions and 334 deletions
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue