Force last owner of a room to pass ownership when leaving (#5094)
* Move `ChangeRoles*` classes to their own module so they can be shared * Hook the change roles screen to the leave room action, add confirmation dialogs * Use enum instead of sealed interface for `ChangeRoomMemberRolesListType` * Try to improve communications between nodes * refactor (leave room) : makes sure to expose only necessary code from api module * Add `:libraries:previewutils` module to share some test fixtures used for UI previews * Update screenshots --------- Co-authored-by: ElementBot <android@element.io> Co-authored-by: ganfra <francoisg@matrix.org>
This commit is contained in:
parent
dff295eadf
commit
1a335698c0
112 changed files with 1337 additions and 513 deletions
|
|
@ -9,21 +9,33 @@ package io.element.android.libraries.matrix.api.room.powerlevels
|
|||
|
||||
import io.element.android.libraries.matrix.api.room.BaseRoom
|
||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||
import io.element.android.libraries.matrix.api.room.RoomMembersState
|
||||
import io.element.android.libraries.matrix.api.room.activeRoomMembers
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.collections.immutable.toPersistentList
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.filter
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onStart
|
||||
|
||||
/**
|
||||
* Return a flow of the list of active room members who have the given role.
|
||||
*/
|
||||
fun BaseRoom.usersWithRole(role: RoomMember.Role): Flow<ImmutableList<RoomMember>> {
|
||||
// Ensure the room members flow is ready
|
||||
val readyMembersFlow = membersStateFlow
|
||||
.onStart {
|
||||
if (membersStateFlow.value is RoomMembersState.Unknown) {
|
||||
updateMembers()
|
||||
}
|
||||
}
|
||||
.filter { it is RoomMembersState.Ready }
|
||||
|
||||
return roomInfoFlow
|
||||
.map { roomInfo -> roomInfo.usersWithRole(role) }
|
||||
.combine(membersStateFlow) { powerLevels, membersState ->
|
||||
.combine(readyMembersFlow) { powerLevels, membersState ->
|
||||
membersState.activeRoomMembers()
|
||||
.filter { powerLevels.contains(it.userId) }
|
||||
.toPersistentList()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue