diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt index 659dc6c255..ae50f5058f 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt @@ -29,9 +29,11 @@ import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runUpdatingState import io.element.android.libraries.core.coroutine.CoroutineDispatchers +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.MatrixRoomInfo 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.powerlevels.UserRoleChange import io.element.android.services.analytics.api.AnalyticsService import kotlinx.coroutines.CoroutineScope @@ -47,14 +49,20 @@ class RolesAndPermissionsPresenter @Inject constructor( override fun present(): RolesAndPermissionsState { val coroutineScope = rememberCoroutineScope() val roomInfo by room.roomInfoFlow.collectAsState(initial = null) + val roomMembers by room.membersStateFlow.collectAsState() + val joinedRoomMemberIds by remember { + derivedStateOf { + roomMembers.joinedRoomMembers().map { it.userId } + } + } val moderatorCount by remember { derivedStateOf { - roomInfo.userCountWithRole(RoomMember.Role.MODERATOR) + roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.MODERATOR) } } val adminCount by remember { derivedStateOf { - roomInfo.userCountWithRole(RoomMember.Role.ADMIN) + roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.ADMIN) } } val changeOwnRoleAction = remember { mutableStateOf>(AsyncAction.Uninitialized) } @@ -108,11 +116,9 @@ class RolesAndPermissionsPresenter @Inject constructor( } } - private fun MatrixRoomInfo?.userCountWithRole(role: RoomMember.Role): Int { - return if (this != null) { - userPowerLevels.count { (_, level) -> RoomMember.Role.forPowerLevel(level) == role } - } else { - 0 + private fun MatrixRoomInfo?.userCountWithRole(joinedRoomMemberIds: List, role: RoomMember.Role): Int { + return this?.userPowerLevels.orEmpty().count { (userId, level) -> + RoomMember.Role.forPowerLevel(level) == role && userId in joinedRoomMemberIds } } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index aa1f3fa025..c4ed620a28 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -186,13 +186,12 @@ interface MatrixRoom : Closeable { fun usersWithRole(role: RoomMember.Role): Flow> { return roomInfoFlow .map { it.userPowerLevels.filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } } - .distinctUntilChanged() .combine(membersStateFlow) { powerLevels, membersState -> - membersState.roomMembers() - .orEmpty() + membersState.joinedRoomMembers() .filter { powerLevels.containsKey(it.userId) } .toPersistentList() } + .distinctUntilChanged() } suspend fun updateAvatar(mimeType: String, data: ByteArray): Result diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt index 759b0f46cb..13f19fe0e0 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt @@ -35,3 +35,7 @@ fun MatrixRoomMembersState.roomMembers(): List? { else -> null } } + +fun MatrixRoomMembersState.joinedRoomMembers(): List { + return roomMembers().orEmpty().filter { it.membership == RoomMembershipState.JOIN } +}