Browse Source

Merge pull request #3081 from element-hq/feature/bma/fixChagingRoleForPendingMember

Let role and permissions screens works for invited room members too.
pull/3088/head
Benoit Marty 3 months ago committed by GitHub
parent
commit
913ae18edd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      changelog.d/3081.bugfix
  2. 18
      features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt
  3. 4
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt
  4. 7
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt

1
changelog.d/3081.bugfix

@ -0,0 +1 @@
Let roles and permissions screens work for invited room members too.

18
features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt

@ -33,7 +33,7 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.api.room.MatrixRoomInfo import io.element.android.libraries.matrix.api.room.MatrixRoomInfo
import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.joinedRoomMembers import io.element.android.libraries.matrix.api.room.activeRoomMembers
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@ -50,21 +50,21 @@ class RolesAndPermissionsPresenter @Inject constructor(
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val roomInfo by room.roomInfoFlow.collectAsState(initial = null) val roomInfo by room.roomInfoFlow.collectAsState(initial = null)
val roomMembers by room.membersStateFlow.collectAsState() val roomMembers by room.membersStateFlow.collectAsState()
// Get the list of joined room members, in order to filter members present in the power // Get the list of active room members (joined or invited), in order to filter members present in the power
// level state Event, but not member of the room anymore. // level state Event.
val joinedRoomMemberIds by remember { val activeRoomMemberIds by remember {
derivedStateOf { derivedStateOf {
roomMembers.joinedRoomMembers().map { it.userId } roomMembers.activeRoomMembers().map { it.userId }
} }
} }
val moderatorCount by remember { val moderatorCount by remember {
derivedStateOf { derivedStateOf {
roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.MODERATOR) roomInfo.userCountWithRole(activeRoomMemberIds, RoomMember.Role.MODERATOR)
} }
} }
val adminCount by remember { val adminCount by remember {
derivedStateOf { derivedStateOf {
roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.ADMIN) roomInfo.userCountWithRole(activeRoomMemberIds, RoomMember.Role.ADMIN)
} }
} }
val changeOwnRoleAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) } val changeOwnRoleAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
@ -118,9 +118,9 @@ class RolesAndPermissionsPresenter @Inject constructor(
} }
} }
private fun MatrixRoomInfo?.userCountWithRole(joinedRoomMemberIds: List<UserId>, role: RoomMember.Role): Int { private fun MatrixRoomInfo?.userCountWithRole(userIds: List<UserId>, role: RoomMember.Role): Int {
return this?.userPowerLevels.orEmpty().count { (userId, level) -> return this?.userPowerLevels.orEmpty().count { (userId, level) ->
RoomMember.Role.forPowerLevel(level) == role && userId in joinedRoomMemberIds RoomMember.Role.forPowerLevel(level) == role && userId in userIds
} }
} }
} }

4
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt

@ -39,3 +39,7 @@ fun MatrixRoomMembersState.roomMembers(): List<RoomMember>? {
fun MatrixRoomMembersState.joinedRoomMembers(): List<RoomMember> { fun MatrixRoomMembersState.joinedRoomMembers(): List<RoomMember> {
return roomMembers().orEmpty().filter { it.membership == RoomMembershipState.JOIN } return roomMembers().orEmpty().filter { it.membership == RoomMembershipState.JOIN }
} }
fun MatrixRoomMembersState.activeRoomMembers(): List<RoomMember> {
return roomMembers().orEmpty().filter { it.membership.isActive() }
}

7
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt

@ -18,7 +18,7 @@ package io.element.android.libraries.matrix.api.room.powerlevels
import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.joinedRoomMembers import io.element.android.libraries.matrix.api.room.activeRoomMembers
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -27,14 +27,13 @@ import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
/** /**
* Return a flow of the list of room members who are still in the room (with membership == RoomMembershipState.JOIN) * Return a flow of the list of active room members who have the given role.
* and who have the given role.
*/ */
fun MatrixRoom.usersWithRole(role: RoomMember.Role): Flow<ImmutableList<RoomMember>> { fun MatrixRoom.usersWithRole(role: RoomMember.Role): Flow<ImmutableList<RoomMember>> {
return roomInfoFlow return roomInfoFlow
.map { it.userPowerLevels.filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } } .map { it.userPowerLevels.filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } }
.combine(membersStateFlow) { powerLevels, membersState -> .combine(membersStateFlow) { powerLevels, membersState ->
membersState.joinedRoomMembers() membersState.activeRoomMembers()
.filter { powerLevels.containsKey(it.userId) } .filter { powerLevels.containsKey(it.userId) }
.toPersistentList() .toPersistentList()
} }

Loading…
Cancel
Save