Switch to using the power levels for retrieving a user's role.

This commit is contained in:
Stefan Ceriu
2025-06-25 12:42:24 +03:00
committed by Stefan Ceriu
parent de723853e3
commit 8dc389cd54
6 changed files with 88 additions and 5 deletions
@@ -13585,6 +13585,76 @@ 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
@@ -117,6 +117,14 @@ 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
}
powerLevelsReturnValue = .success(powerLevelsProxyMock)
kickUserReasonReturnValue = .success(())
@@ -26,6 +26,8 @@ extension RoomPowerLevelsProxyMock {
underlyingValues = RoomPowerLevelsValues.mock
suggestedRoleForUserReturnValue = .administrator
canOwnUserSendMessageReturnValue = configuration.canUserSendMessage
canOwnUserSendStateEventReturnValue = configuration.canUserSendState
canOwnUserInviteReturnValue = configuration.canUserInvite
@@ -232,13 +232,10 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
state.canKickUsers = powerLevels.canOwnUserKick()
state.canBanUsers = powerLevels.canOwnUserBan()
state.canJoinCall = powerLevels.canOwnUserJoinCall()
state.canEditRolesOrPermissions = powerLevels.suggestedRole(forUser: roomProxy.ownUserID) == .administrator
} else {
fatalError("Missing room power levels")
}
Task {
state.canEditRolesOrPermissions = await (try? roomProxy.suggestedRole(for: roomProxy.ownUserID).get()) == .administrator
}
}
private func fetchMembersIfNeeded() async {
@@ -10,9 +10,10 @@ import MatrixRustSDK
// sourcery: AutoMockable
protocol RoomPowerLevelsProxyProtocol {
var values: RoomPowerLevelsValues { get }
var userPowerLevels: [String: Int64] { get }
func suggestedRole(forUser userID: String) -> RoomMemberRole
func canOwnUser(sendMessage messageType: MessageLikeEventType) -> Bool
func canOwnUser(sendStateEvent event: StateEventType) -> Bool
func canOwnUserInvite() -> Bool
@@ -26,6 +26,11 @@ struct RoomPowerLevelsProxy: RoomPowerLevelsProxyProtocol {
powerLevels.userPowerLevels()
}
func suggestedRole(forUser userID: String) -> RoomMemberRole {
let powerLevel = powerLevels.userPowerLevels()[userID] ?? 0
return suggestedRoleForPowerLevel(powerLevel: powerLevel)
}
func canOwnUser(sendMessage messageType: MessageLikeEventType) -> Bool {
powerLevels.canOwnUserSendMessage(message: messageType)
}