Sort members in the member list by power level and show mods and admins. (#2448)

This commit is contained in:
Doug
2024-02-12 10:39:06 +00:00
committed by GitHub
parent 316e351dbb
commit c1aaf331a3
12 changed files with 127 additions and 15 deletions
@@ -43,6 +43,10 @@ final class RoomMemberProxy: RoomMemberProxyProtocol {
lazy var isIgnored = member.isIgnored()
lazy var powerLevel = Int(member.powerLevel())
lazy var role = member.suggestedRoleForPowerLevel()
lazy var canInviteUsers = member.canInvite()
func canSendStateEvent(type: StateEventType) -> Bool {
@@ -30,6 +30,8 @@ protocol RoomMemberProxyProtocol: AnyObject {
var membership: MembershipState { get }
var isAccountOwner: Bool { get }
var isIgnored: Bool { get }
var powerLevel: Int { get }
var role: RoomMemberRole { get }
var canInviteUsers: Bool { get }
func ignoreUser() async -> Result<Void, RoomMemberProxyError>
@@ -42,4 +44,24 @@ extension RoomMemberProxyProtocol {
try? PermalinkBuilder.permalinkTo(userIdentifier: userID,
baseURL: ServiceLocator.shared.settings.permalinkBaseURL)
}
/// The name used for sorting the member alphabetically. This will be the displayname if,
/// it exists otherwise it will be the userID with the leading `@` removed.
var sortingName: String {
// If there isn't a displayname we sort by the userID without the @.
displayName ?? String(userID.dropFirst())
}
}
extension [RoomMemberProxyProtocol] {
/// The members, sorted first by power-level, and then alphabetically within each power-level.
func sorted() -> Self {
sorted { lhs, rhs in
if lhs.powerLevel != rhs.powerLevel {
lhs.powerLevel > rhs.powerLevel
} else {
lhs.sortingName < rhs.sortingName
}
}
}
}
@@ -15,6 +15,7 @@
//
import Foundation
import MatrixRustSDK
struct RoomMemberDetails: Identifiable, Equatable {
let id: String
@@ -23,6 +24,9 @@ struct RoomMemberDetails: Identifiable, Equatable {
let permalink: URL?
let isAccountOwner: Bool
var isIgnored: Bool
enum Role { case administrator, moderator, user }
let role: Role
init(withProxy proxy: RoomMemberProxyProtocol) {
id = proxy.userID
@@ -31,5 +35,16 @@ struct RoomMemberDetails: Identifiable, Equatable {
permalink = proxy.permalink
isAccountOwner = proxy.isAccountOwner
isIgnored = proxy.isIgnored
role = .init(proxy.role)
}
}
extension RoomMemberDetails.Role {
init(_ role: RoomMemberRole) {
self = switch role {
case .administrator: .administrator
case .moderator: .moderator
case .user: .user
}
}
}