|
|
@ -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 |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|