Let role and permissions screens works for invited room members too.
This commit is contained in:
parent
0cf5a41c61
commit
4d6a67e4d6
3 changed files with 16 additions and 13 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() }
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue