Skip to content

Commit 97491c3

Browse files
committed
Member role: only count and display joined members.
1 parent 04eb59b commit 97491c3

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ import io.element.android.libraries.architecture.AsyncAction
2929
import io.element.android.libraries.architecture.Presenter
3030
import io.element.android.libraries.architecture.runUpdatingState
3131
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
32+
import io.element.android.libraries.matrix.api.core.UserId
3233
import io.element.android.libraries.matrix.api.room.MatrixRoom
3334
import io.element.android.libraries.matrix.api.room.MatrixRoomInfo
3435
import io.element.android.libraries.matrix.api.room.RoomMember
36+
import io.element.android.libraries.matrix.api.room.joinedRoomMembers
3537
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
3638
import io.element.android.services.analytics.api.AnalyticsService
3739
import kotlinx.coroutines.CoroutineScope
@@ -47,14 +49,20 @@ class RolesAndPermissionsPresenter @Inject constructor(
4749
override fun present(): RolesAndPermissionsState {
4850
val coroutineScope = rememberCoroutineScope()
4951
val roomInfo by room.roomInfoFlow.collectAsState(initial = null)
52+
val roomMembers by room.membersStateFlow.collectAsState()
53+
val joinedRoomMemberIds by remember {
54+
derivedStateOf {
55+
roomMembers.joinedRoomMembers().map { it.userId }
56+
}
57+
}
5058
val moderatorCount by remember {
5159
derivedStateOf {
52-
roomInfo.userCountWithRole(RoomMember.Role.MODERATOR)
60+
roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.MODERATOR)
5361
}
5462
}
5563
val adminCount by remember {
5664
derivedStateOf {
57-
roomInfo.userCountWithRole(RoomMember.Role.ADMIN)
65+
roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.ADMIN)
5866
}
5967
}
6068
val changeOwnRoleAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
@@ -108,11 +116,9 @@ class RolesAndPermissionsPresenter @Inject constructor(
108116
}
109117
}
110118

111-
private fun MatrixRoomInfo?.userCountWithRole(role: RoomMember.Role): Int {
112-
return if (this != null) {
113-
userPowerLevels.count { (_, level) -> RoomMember.Role.forPowerLevel(level) == role }
114-
} else {
115-
0
119+
private fun MatrixRoomInfo?.userCountWithRole(joinedRoomMemberIds: List<UserId>, role: RoomMember.Role): Int {
120+
return this?.userPowerLevels.orEmpty().count { (userId, level) ->
121+
RoomMember.Role.forPowerLevel(level) == role && userId in joinedRoomMemberIds
116122
}
117123
}
118124
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,12 @@ interface MatrixRoom : Closeable {
186186
fun usersWithRole(role: RoomMember.Role): Flow<ImmutableList<RoomMember>> {
187187
return roomInfoFlow
188188
.map { it.userPowerLevels.filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } }
189-
.distinctUntilChanged()
190189
.combine(membersStateFlow) { powerLevels, membersState ->
191-
membersState.roomMembers()
192-
.orEmpty()
190+
membersState.joinedRoomMembers()
193191
.filter { powerLevels.containsKey(it.userId) }
194192
.toPersistentList()
195193
}
194+
.distinctUntilChanged()
196195
}
197196

198197
suspend fun updateAvatar(mimeType: String, data: ByteArray): Result<Unit>

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,7 @@ fun MatrixRoomMembersState.roomMembers(): List<RoomMember>? {
3535
else -> null
3636
}
3737
}
38+
39+
fun MatrixRoomMembersState.joinedRoomMembers(): List<RoomMember> {
40+
return roomMembers().orEmpty().filter { it.membership == RoomMembershipState.JOIN }
41+
}

0 commit comments

Comments
 (0)