Restore permissions to creator and display them as owners in the list (#4369)

* restore permissions to creator and display them as owners in the list

* improved the code to use actually 5 roles in the app to distinguish a real creator from an owner
This commit is contained in:
Mauro
2025-07-31 16:52:55 +02:00
committed by GitHub
parent 496c29ae36
commit 731d60b6e9
29 changed files with 205 additions and 137 deletions
@@ -13435,76 +13435,6 @@ class RoomPowerLevelsProxyMock: RoomPowerLevelsProxyProtocol, @unchecked Sendabl
var underlyingValues: RoomPowerLevelsValues!
var userPowerLevels: [String: Int64] = [:]
//MARK: - suggestedRole
var suggestedRoleForUserUnderlyingCallsCount = 0
var suggestedRoleForUserCallsCount: Int {
get {
if Thread.isMainThread {
return suggestedRoleForUserUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = suggestedRoleForUserUnderlyingCallsCount
}
return returnValue!
}
}
set {
if Thread.isMainThread {
suggestedRoleForUserUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
suggestedRoleForUserUnderlyingCallsCount = newValue
}
}
}
}
var suggestedRoleForUserCalled: Bool {
return suggestedRoleForUserCallsCount > 0
}
var suggestedRoleForUserReceivedUserID: String?
var suggestedRoleForUserReceivedInvocations: [String] = []
var suggestedRoleForUserUnderlyingReturnValue: RoomMemberRole!
var suggestedRoleForUserReturnValue: RoomMemberRole! {
get {
if Thread.isMainThread {
return suggestedRoleForUserUnderlyingReturnValue
} else {
var returnValue: RoomMemberRole? = nil
DispatchQueue.main.sync {
returnValue = suggestedRoleForUserUnderlyingReturnValue
}
return returnValue!
}
}
set {
if Thread.isMainThread {
suggestedRoleForUserUnderlyingReturnValue = newValue
} else {
DispatchQueue.main.sync {
suggestedRoleForUserUnderlyingReturnValue = newValue
}
}
}
}
var suggestedRoleForUserClosure: ((String) -> RoomMemberRole)?
func suggestedRole(forUser userID: String) -> RoomMemberRole {
suggestedRoleForUserCallsCount += 1
suggestedRoleForUserReceivedUserID = userID
DispatchQueue.main.async {
self.suggestedRoleForUserReceivedInvocations.append(userID)
}
if let suggestedRoleForUserClosure = suggestedRoleForUserClosure {
return suggestedRoleForUserClosure(userID)
} else {
return suggestedRoleForUserReturnValue
}
}
//MARK: - canOwnUser
var canOwnUserSendMessageUnderlyingCallsCount = 0
@@ -14157,6 +14087,70 @@ class RoomPowerLevelsProxyMock: RoomPowerLevelsProxyProtocol, @unchecked Sendabl
return canOwnUserJoinCallReturnValue
}
}
//MARK: - canOwnUserEditRolesAndPermissions
var canOwnUserEditRolesAndPermissionsUnderlyingCallsCount = 0
var canOwnUserEditRolesAndPermissionsCallsCount: Int {
get {
if Thread.isMainThread {
return canOwnUserEditRolesAndPermissionsUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = canOwnUserEditRolesAndPermissionsUnderlyingCallsCount
}
return returnValue!
}
}
set {
if Thread.isMainThread {
canOwnUserEditRolesAndPermissionsUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
canOwnUserEditRolesAndPermissionsUnderlyingCallsCount = newValue
}
}
}
}
var canOwnUserEditRolesAndPermissionsCalled: Bool {
return canOwnUserEditRolesAndPermissionsCallsCount > 0
}
var canOwnUserEditRolesAndPermissionsUnderlyingReturnValue: Bool!
var canOwnUserEditRolesAndPermissionsReturnValue: Bool! {
get {
if Thread.isMainThread {
return canOwnUserEditRolesAndPermissionsUnderlyingReturnValue
} else {
var returnValue: Bool? = nil
DispatchQueue.main.sync {
returnValue = canOwnUserEditRolesAndPermissionsUnderlyingReturnValue
}
return returnValue!
}
}
set {
if Thread.isMainThread {
canOwnUserEditRolesAndPermissionsUnderlyingReturnValue = newValue
} else {
DispatchQueue.main.sync {
canOwnUserEditRolesAndPermissionsUnderlyingReturnValue = newValue
}
}
}
}
var canOwnUserEditRolesAndPermissionsClosure: (() -> Bool)?
func canOwnUserEditRolesAndPermissions() -> Bool {
canOwnUserEditRolesAndPermissionsCallsCount += 1
if let canOwnUserEditRolesAndPermissionsClosure = canOwnUserEditRolesAndPermissionsClosure {
return canOwnUserEditRolesAndPermissionsClosure()
} else {
return canOwnUserEditRolesAndPermissionsReturnValue
}
}
//MARK: - canUser
var canUserUserIDSendMessageUnderlyingCallsCount = 0
@@ -116,12 +116,8 @@ extension JoinedRoomProxyMock {
self?.membersPublisher.value.first { $0.userID == configuration.ownUserID }?.role ?? .user != .user
}
powerLevelsProxyMock.suggestedRoleForUserClosure = { [weak self] userID in
guard let member = self?.membersPublisher.value.first(where: { $0.userID == userID }) else {
return .user
}
return member.role
powerLevelsProxyMock.canOwnUserEditRolesAndPermissionsClosure = { [weak self] in
self?.membersPublisher.value.first { $0.userID == configuration.ownUserID }?.role.isAdminOrHigher ?? false
}
powerLevelsReturnValue = .success(powerLevelsProxyMock)
@@ -120,6 +120,22 @@ extension RoomMemberProxyMock {
role: .administrator))
}
static var mockCreator: RoomMemberProxyMock {
RoomMemberProxyMock(with: .init(userID: "@creator:matrix.org",
displayName: "God",
membership: .join,
powerLevel: .infinite,
role: .creator))
}
static var mockOwner: RoomMemberProxyMock {
RoomMemberProxyMock(with: .init(userID: "@owner:matrix.org",
displayName: "Guinevere",
membership: .join,
powerLevel: .value(150),
role: .administrator))
}
static var mockModerator: RoomMemberProxyMock {
RoomMemberProxyMock(with: .init(userID: "@mod:matrix.org",
displayName: "Merlin",
@@ -18,6 +18,7 @@ struct RoomPowerLevelsProxyMockConfiguration {
var canUserTriggerRoomNotification = false
var canUserPin = true
var canUserJoinCall = true
var canUserEditRoomsAndPermissions = true
}
extension RoomPowerLevelsProxyMock {
@@ -25,9 +26,7 @@ extension RoomPowerLevelsProxyMock {
self.init()
underlyingValues = RoomPowerLevelsValues.mock
suggestedRoleForUserReturnValue = .administrator
canOwnUserSendMessageReturnValue = configuration.canUserSendMessage
canOwnUserSendStateEventReturnValue = configuration.canUserSendState
canOwnUserInviteReturnValue = configuration.canUserInvite
@@ -38,6 +37,7 @@ extension RoomPowerLevelsProxyMock {
canOwnUserTriggerRoomNotificationReturnValue = configuration.canUserTriggerRoomNotification
canOwnUserPinOrUnpinReturnValue = configuration.canUserPin
canOwnUserJoinCallReturnValue = configuration.canUserJoinCall
canOwnUserEditRolesAndPermissionsReturnValue = configuration.canUserEditRoomsAndPermissions
canUserUserIDSendMessageReturnValue = .success(configuration.canUserSendMessage)
canUserUserIDSendStateEventReturnValue = .success(configuration.canUserSendState)