diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index c7e981a70..71ae0851c 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -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 diff --git a/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift b/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift index 09e45beb7..93f304e19 100644 --- a/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift +++ b/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift @@ -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(()) diff --git a/ElementX/Sources/Mocks/RoomPowerLevelsProxyMock.swift b/ElementX/Sources/Mocks/RoomPowerLevelsProxyMock.swift index b0f5a2f64..fe8cecce3 100644 --- a/ElementX/Sources/Mocks/RoomPowerLevelsProxyMock.swift +++ b/ElementX/Sources/Mocks/RoomPowerLevelsProxyMock.swift @@ -26,6 +26,8 @@ extension RoomPowerLevelsProxyMock { underlyingValues = RoomPowerLevelsValues.mock + suggestedRoleForUserReturnValue = .administrator + canOwnUserSendMessageReturnValue = configuration.canUserSendMessage canOwnUserSendStateEventReturnValue = configuration.canUserSendState canOwnUserInviteReturnValue = configuration.canUserInvite diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift index 36d90d184..2ab46f614 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift @@ -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 { diff --git a/ElementX/Sources/Services/Room/RoomPowerLevelProxyProtocol.swift b/ElementX/Sources/Services/Room/RoomPowerLevelProxyProtocol.swift index fd69b2238..606a50b60 100644 --- a/ElementX/Sources/Services/Room/RoomPowerLevelProxyProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomPowerLevelProxyProtocol.swift @@ -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 diff --git a/ElementX/Sources/Services/Room/RoomPowerLevelsProxy.swift b/ElementX/Sources/Services/Room/RoomPowerLevelsProxy.swift index 5efb0bcd3..95ebb179f 100644 --- a/ElementX/Sources/Services/Room/RoomPowerLevelsProxy.swift +++ b/ElementX/Sources/Services/Room/RoomPowerLevelsProxy.swift @@ -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) }