mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
Sort members in the member list by power level and show mods and admins. (#2448)
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user