Last Owner should edit admins, and not leave when is last (#4372)

This commit is contained in:
Mauro
2025-08-07 10:40:14 +02:00
committed by GitHub
parent be525e6a60
commit 5ab6f90863
67 changed files with 691 additions and 363 deletions
@@ -18,21 +18,8 @@ struct RoomMemberDetails: Identifiable, Hashable {
var isIgnored: Bool
var isBanned: Bool
var isActive: Bool
enum Role {
/// Creator of the room, PL infinite
case creator
/// Same power of an admin, but they can also upgrade the room, PL 150 onwards
case owner
/// Able to edit room settings and perform any action aside from room upgrading PL 100...149
case administrator
/// Able to perform room moderation actions PL 50...99
case moderator
/// Default role PL 0...49
case user
}
let role: Role
let role: RoomRole
let powerLevel: RoomPowerLevel
func matches(searchQuery: String) -> Bool {
@@ -51,47 +38,7 @@ extension RoomMemberDetails {
isInvited = proxy.membership == .invite
isIgnored = proxy.isIgnored
isBanned = proxy.membership == .ban
role = .init(proxy.role, powerLevel: proxy.powerLevel)
role = proxy.role
powerLevel = proxy.powerLevel
}
}
extension RoomMemberDetails.Role {
init(_ role: RoomMemberRole, powerLevel: RoomPowerLevel) {
switch role {
case .creator:
self = .creator
case .administrator:
switch powerLevel {
case .value(let value):
self = value >= 150 ? .owner : .administrator
default:
fatalError("Impossible")
}
case .moderator:
self = .moderator
case .user:
self = .user
}
}
var isAdminOrHigher: Bool {
switch self {
case .administrator, .creator, .owner:
return true
case .moderator, .user:
return false
}
}
}
extension RoomMemberRole {
var isAdminOrHigher: Bool {
switch self {
case .administrator, .creator:
return true
case .moderator, .user:
return false
}
}
}
@@ -36,6 +36,4 @@ final class RoomMemberProxy: RoomMemberProxyProtocol {
var isIgnored: Bool { member.isIgnored }
var powerLevel: RoomPowerLevel { .init(rustPowerLevel: member.powerLevel) }
var role: RoomMemberRole { member.suggestedRoleForPowerLevel }
}
@@ -24,8 +24,6 @@ protocol RoomMemberProxyProtocol: AnyObject {
var isIgnored: Bool { get }
var powerLevel: RoomPowerLevel { get }
var role: RoomMemberRole { get }
}
extension RoomMemberProxyProtocol {
@@ -58,3 +56,7 @@ extension [RoomMemberProxyProtocol] {
}
}
}
extension RoomMemberProxyProtocol {
var role: RoomRole { .init(powerLevel: powerLevel) }
}