mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +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 underlyingValues: RoomPowerLevelsValues!
|
||||||
var userPowerLevels: [String: Int64] = [:]
|
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
|
//MARK: - canOwnUser
|
||||||
|
|
||||||
var canOwnUserSendMessageUnderlyingCallsCount = 0
|
var canOwnUserSendMessageUnderlyingCallsCount = 0
|
||||||
|
|||||||
@@ -117,6 +117,14 @@ extension JoinedRoomProxyMock {
|
|||||||
self?.membersPublisher.value.first { $0.userID == configuration.ownUserID }?.role ?? .user != .user
|
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)
|
powerLevelsReturnValue = .success(powerLevelsProxyMock)
|
||||||
|
|
||||||
kickUserReasonReturnValue = .success(())
|
kickUserReasonReturnValue = .success(())
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ extension RoomPowerLevelsProxyMock {
|
|||||||
|
|
||||||
underlyingValues = RoomPowerLevelsValues.mock
|
underlyingValues = RoomPowerLevelsValues.mock
|
||||||
|
|
||||||
|
suggestedRoleForUserReturnValue = .administrator
|
||||||
|
|
||||||
canOwnUserSendMessageReturnValue = configuration.canUserSendMessage
|
canOwnUserSendMessageReturnValue = configuration.canUserSendMessage
|
||||||
canOwnUserSendStateEventReturnValue = configuration.canUserSendState
|
canOwnUserSendStateEventReturnValue = configuration.canUserSendState
|
||||||
canOwnUserInviteReturnValue = configuration.canUserInvite
|
canOwnUserInviteReturnValue = configuration.canUserInvite
|
||||||
|
|||||||
@@ -232,13 +232,10 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
|
|||||||
state.canKickUsers = powerLevels.canOwnUserKick()
|
state.canKickUsers = powerLevels.canOwnUserKick()
|
||||||
state.canBanUsers = powerLevels.canOwnUserBan()
|
state.canBanUsers = powerLevels.canOwnUserBan()
|
||||||
state.canJoinCall = powerLevels.canOwnUserJoinCall()
|
state.canJoinCall = powerLevels.canOwnUserJoinCall()
|
||||||
|
state.canEditRolesOrPermissions = powerLevels.suggestedRole(forUser: roomProxy.ownUserID) == .administrator
|
||||||
} else {
|
} else {
|
||||||
fatalError("Missing room power levels")
|
fatalError("Missing room power levels")
|
||||||
}
|
}
|
||||||
|
|
||||||
Task {
|
|
||||||
state.canEditRolesOrPermissions = await (try? roomProxy.suggestedRole(for: roomProxy.ownUserID).get()) == .administrator
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func fetchMembersIfNeeded() async {
|
private func fetchMembersIfNeeded() async {
|
||||||
|
|||||||
@@ -10,9 +10,10 @@ import MatrixRustSDK
|
|||||||
// sourcery: AutoMockable
|
// sourcery: AutoMockable
|
||||||
protocol RoomPowerLevelsProxyProtocol {
|
protocol RoomPowerLevelsProxyProtocol {
|
||||||
var values: RoomPowerLevelsValues { get }
|
var values: RoomPowerLevelsValues { get }
|
||||||
|
|
||||||
var userPowerLevels: [String: Int64] { get }
|
var userPowerLevels: [String: Int64] { get }
|
||||||
|
|
||||||
|
func suggestedRole(forUser userID: String) -> RoomMemberRole
|
||||||
|
|
||||||
func canOwnUser(sendMessage messageType: MessageLikeEventType) -> Bool
|
func canOwnUser(sendMessage messageType: MessageLikeEventType) -> Bool
|
||||||
func canOwnUser(sendStateEvent event: StateEventType) -> Bool
|
func canOwnUser(sendStateEvent event: StateEventType) -> Bool
|
||||||
func canOwnUserInvite() -> Bool
|
func canOwnUserInvite() -> Bool
|
||||||
|
|||||||
@@ -26,6 +26,11 @@ struct RoomPowerLevelsProxy: RoomPowerLevelsProxyProtocol {
|
|||||||
powerLevels.userPowerLevels()
|
powerLevels.userPowerLevels()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func suggestedRole(forUser userID: String) -> RoomMemberRole {
|
||||||
|
let powerLevel = powerLevels.userPowerLevels()[userID] ?? 0
|
||||||
|
return suggestedRoleForPowerLevel(powerLevel: powerLevel)
|
||||||
|
}
|
||||||
|
|
||||||
func canOwnUser(sendMessage messageType: MessageLikeEventType) -> Bool {
|
func canOwnUser(sendMessage messageType: MessageLikeEventType) -> Bool {
|
||||||
powerLevels.canOwnUserSendMessage(message: messageType)
|
powerLevels.canOwnUserSendMessage(message: messageType)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user