Skip to content

Commit 8e2f7a3

Browse files
jmartinespElementBot
andauthored
Categorise members by role in the ChangeRoles screen (#2595)
* Categorise members by role in the ChangeRoles screen * Fix automatic reload of member list when either the membership or power levels change * Replace empty space with disabled checkbox * Add 'pending' label to members who are in invited state * Implement new designs * Fix string issue in confirm recovery key screen * Update screenshots --------- Co-authored-by: ElementBot <[email protected]>
1 parent 192a1d2 commit 8e2f7a3

File tree

66 files changed

+532
-231
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+532
-231
lines changed

changelog.d/2593.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Categorise members by role in change roles screen.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class ChangeRolesNode @AssistedInject constructor(
6565
ChangeRolesView(
6666
modifier = modifier,
6767
state = state,
68-
onBackPressed = this::navigateUp,
68+
navigateUp = this::navigateUp,
6969
)
7070
}
7171
}

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class ChangeRolesPresenter @AssistedInject constructor(
7575
var query by rememberSaveable { mutableStateOf<String?>(null) }
7676
var searchActive by rememberSaveable { mutableStateOf(false) }
7777
var searchResults by remember {
78-
mutableStateOf<SearchBarResultState<ImmutableList<RoomMember>>>(SearchBarResultState.Initial())
78+
mutableStateOf<SearchBarResultState<MembersByRole>>(SearchBarResultState.Initial())
7979
}
8080
val selectedUsers = remember {
8181
mutableStateOf<ImmutableList<MatrixUser>>(persistentListOf())
@@ -91,7 +91,7 @@ class ChangeRolesPresenter @AssistedInject constructor(
9191
// Users who were selected but didn't have the role, so their role change was pending
9292
val toAdd = selectedUsers.value.filter { user -> users.none { it.userId == user.userId } && previous.none { it.userId == user.userId } }
9393
// Users who no longer have the role
94-
val toRemove = previous.filter { user -> users.none { it.userId == user.userId } }
94+
val toRemove = previous.filter { user -> users.none { it.userId == user.userId } }.toSet()
9595
selectedUsers.value = (users + toAdd - toRemove).toImmutableList()
9696
}
9797
.launchIn(this)
@@ -103,8 +103,9 @@ class ChangeRolesPresenter @AssistedInject constructor(
103103
LaunchedEffect(query, roomMemberState) {
104104
val results = dataSource
105105
.search(query.orEmpty())
106-
.sorted()
106+
.groupedByRole()
107107

108+
println(results)
108109
searchResults = if (results.isEmpty()) {
109110
SearchBarResultState.NoResultsFound()
110111
} else {
@@ -181,6 +182,14 @@ class ChangeRolesPresenter @AssistedInject constructor(
181182
)
182183
}
183184

185+
private fun List<RoomMember>.groupedByRole(): MembersByRole {
186+
return MembersByRole(
187+
admins = filter { it.role == RoomMember.Role.ADMIN }.sorted(),
188+
moderators = filter { it.role == RoomMember.Role.MODERATOR }.sorted(),
189+
members = filter { it.role == RoomMember.Role.USER }.sorted(),
190+
)
191+
}
192+
184193
private fun Iterable<RoomMember>.sorted(): ImmutableList<RoomMember> {
185194
return sortedWith(PowerLevelRoomMemberComparator()).toImmutableList()
186195
}

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,42 @@
1616

1717
package io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles
1818

19+
import io.element.android.features.roomdetails.impl.members.PowerLevelRoomMemberComparator
1920
import io.element.android.libraries.architecture.AsyncAction
2021
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
2122
import io.element.android.libraries.matrix.api.core.UserId
2223
import io.element.android.libraries.matrix.api.room.RoomMember
2324
import io.element.android.libraries.matrix.api.user.MatrixUser
2425
import kotlinx.collections.immutable.ImmutableList
26+
import kotlinx.collections.immutable.toImmutableList
2527

2628
data class ChangeRolesState(
2729
val role: RoomMember.Role,
2830
val query: String?,
2931
val isSearchActive: Boolean,
30-
val searchResults: SearchBarResultState<ImmutableList<RoomMember>>,
32+
val searchResults: SearchBarResultState<MembersByRole>,
3133
val selectedUsers: ImmutableList<MatrixUser>,
3234
val hasPendingChanges: Boolean,
3335
val exitState: AsyncAction<Unit>,
3436
val savingState: AsyncAction<Unit>,
3537
val canChangeMemberRole: (UserId) -> Boolean,
3638
val eventSink: (ChangeRolesEvent) -> Unit,
3739
)
40+
41+
data class MembersByRole(
42+
val admins: ImmutableList<RoomMember>,
43+
val moderators: ImmutableList<RoomMember>,
44+
val members: ImmutableList<RoomMember>,
45+
) {
46+
constructor(members: List<RoomMember>) : this(
47+
admins = members.filter { it.role == RoomMember.Role.ADMIN }.sorted(),
48+
moderators = members.filter { it.role == RoomMember.Role.MODERATOR }.sorted(),
49+
members = members.filter { it.role == RoomMember.Role.USER }.sorted(),
50+
)
51+
52+
fun isEmpty() = admins.isEmpty() && moderators.isEmpty() && members.isEmpty()
53+
}
54+
55+
private fun Iterable<RoomMember>.sorted(): ImmutableList<RoomMember> {
56+
return sortedWith(PowerLevelRoomMemberComparator()).toImmutableList()
57+
}

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import io.element.android.libraries.architecture.AsyncAction
2222
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
2323
import io.element.android.libraries.matrix.api.core.UserId
2424
import io.element.android.libraries.matrix.api.room.RoomMember
25+
import io.element.android.libraries.matrix.api.room.RoomMembershipState
2526
import io.element.android.libraries.matrix.api.user.MatrixUser
2627
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
2728
import kotlinx.collections.immutable.ImmutableList
@@ -32,7 +33,7 @@ class ChangeRolesStateProvider : PreviewParameterProvider<ChangeRolesState> {
3233
override val values: Sequence<ChangeRolesState>
3334
get() = sequenceOf(
3435
aChangeRolesState(),
35-
aChangeRolesState(role = RoomMember.Role.MODERATOR),
36+
aChangeRolesStateWithSelectedUsers().copy(role = RoomMember.Role.MODERATOR),
3637
aChangeRolesStateWithSelectedUsers().copy(hasPendingChanges = false),
3738
aChangeRolesStateWithSelectedUsers(),
3839
aChangeRolesStateWithSelectedUsers().copy(
@@ -41,7 +42,7 @@ class ChangeRolesStateProvider : PreviewParameterProvider<ChangeRolesState> {
4142
aChangeRolesStateWithSelectedUsers().copy(
4243
query = "Alice",
4344
isSearchActive = true,
44-
searchResults = SearchBarResultState.Results(aRoomMemberList().take(1).toImmutableList()),
45+
searchResults = SearchBarResultState.Results(MembersByRole(aRoomMemberList().take(1).toImmutableList())),
4546
selectedUsers = aMatrixUserList().take(1).toImmutableList(),
4647
),
4748
aChangeRolesStateWithSelectedUsers().copy(exitState = AsyncAction.Confirming),
@@ -56,7 +57,7 @@ internal fun aChangeRolesState(
5657
role: RoomMember.Role = RoomMember.Role.ADMIN,
5758
query: String? = null,
5859
isSearchActive: Boolean = false,
59-
searchResults: SearchBarResultState<ImmutableList<RoomMember>> = SearchBarResultState.NoResultsFound(),
60+
searchResults: SearchBarResultState<MembersByRole> = SearchBarResultState.NoResultsFound(),
6061
selectedUsers: ImmutableList<MatrixUser> = persistentListOf(),
6162
hasPendingChanges: Boolean = false,
6263
exitState: AsyncAction<Unit> = AsyncAction.Uninitialized,
@@ -78,7 +79,17 @@ internal fun aChangeRolesState(
7879

7980
internal fun aChangeRolesStateWithSelectedUsers() = aChangeRolesState(
8081
selectedUsers = aMatrixUserList().toImmutableList(),
81-
searchResults = SearchBarResultState.Results(aRoomMemberList().toImmutableList()),
82+
searchResults = SearchBarResultState.Results(
83+
MembersByRole(
84+
members = aRoomMemberList().mapIndexed { index, roomMember ->
85+
if (index % 2 == 0) {
86+
roomMember.copy(membership = RoomMembershipState.INVITE)
87+
} else {
88+
roomMember
89+
}
90+
}
91+
)
92+
),
8293
hasPendingChanges = true,
8394
canRemoveMember = { it != UserId("@alice:server.org") },
8495
)

0 commit comments

Comments
 (0)