Browse Source

Member role: only count and display joined members.

pull/2663/head
Benoit Marty 6 months ago
parent
commit
97491c3f3f
  1. 20
      features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt
  2. 5
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt
  3. 4
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt

20
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.Presenter
import io.element.android.libraries.architecture.runUpdatingState import io.element.android.libraries.architecture.runUpdatingState
import io.element.android.libraries.core.coroutine.CoroutineDispatchers 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.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.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
@ -47,14 +49,20 @@ class RolesAndPermissionsPresenter @Inject constructor(
override fun present(): RolesAndPermissionsState { override fun present(): RolesAndPermissionsState {
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 joinedRoomMemberIds by remember {
derivedStateOf {
roomMembers.joinedRoomMembers().map { it.userId }
}
}
val moderatorCount by remember { val moderatorCount by remember {
derivedStateOf { derivedStateOf {
roomInfo.userCountWithRole(RoomMember.Role.MODERATOR) roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.MODERATOR)
} }
} }
val adminCount by remember { val adminCount by remember {
derivedStateOf { derivedStateOf {
roomInfo.userCountWithRole(RoomMember.Role.ADMIN) roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.ADMIN)
} }
} }
val changeOwnRoleAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) } val changeOwnRoleAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
@ -108,11 +116,9 @@ class RolesAndPermissionsPresenter @Inject constructor(
} }
} }
private fun MatrixRoomInfo?.userCountWithRole(role: RoomMember.Role): Int { private fun MatrixRoomInfo?.userCountWithRole(joinedRoomMemberIds: List<UserId>, role: RoomMember.Role): Int {
return if (this != null) { return this?.userPowerLevels.orEmpty().count { (userId, level) ->
userPowerLevels.count { (_, level) -> RoomMember.Role.forPowerLevel(level) == role } RoomMember.Role.forPowerLevel(level) == role && userId in joinedRoomMemberIds
} else {
0
} }
} }
} }

5
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<ImmutableList<RoomMember>> { fun 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 } }
.distinctUntilChanged()
.combine(membersStateFlow) { powerLevels, membersState -> .combine(membersStateFlow) { powerLevels, membersState ->
membersState.roomMembers() membersState.joinedRoomMembers()
.orEmpty()
.filter { powerLevels.containsKey(it.userId) } .filter { powerLevels.containsKey(it.userId) }
.toPersistentList() .toPersistentList()
} }
.distinctUntilChanged()
} }
suspend fun updateAvatar(mimeType: String, data: ByteArray): Result<Unit> suspend fun updateAvatar(mimeType: String, data: ByteArray): Result<Unit>

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

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

Loading…
Cancel
Save