mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-10-31 16:24:11 +00:00
Switch to using the power levels for retrieving a user's role.
This commit is contained in:
committed by
Stefan Ceriu
parent
de723853e3
commit
8dc389cd54
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user