From 64f0d4cd01da6c86a246c51d2eb27340a07ccb89 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 25 Jun 2025 11:34:51 +0300 Subject: [PATCH] Adopt new `canOwnUser*` power level methods instead of the throwing ones. --- ElementX/Sources/Mocks/JoinedRoomProxyMock.swift | 11 +++++++++++ .../KnockRequestsListScreenViewModel.swift | 6 +++--- .../RoomDetailsEditScreenViewModel.swift | 6 +++--- .../RoomDetailsScreenViewModel.swift | 14 +++++++------- .../RoomMembersListScreenViewModel.swift | 6 +++--- .../CompletionSuggestionService.swift | 2 +- .../Screens/RoomScreen/RoomScreenViewModel.swift | 10 +++++----- .../ThreadTimelineScreenViewModel.swift | 2 +- .../Screens/Timeline/TimelineViewModel.swift | 12 ++++++------ UnitTests/Sources/RoomDetailsViewModelTests.swift | 9 +++++++++ UnitTests/Sources/TimelineViewModelTests.swift | 1 + 11 files changed, 50 insertions(+), 29 deletions(-) diff --git a/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift b/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift index 98f45619d..09e45beb7 100644 --- a/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift +++ b/ElementX/Sources/Mocks/JoinedRoomProxyMock.swift @@ -99,12 +99,23 @@ extension JoinedRoomProxyMock { powerLevelsProxyMock.canUserUserIDSendStateEventClosure = { [weak self] userID, _ in .success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user) } + powerLevelsProxyMock.canOwnUserSendStateEventClosure = { [weak self] _ in + self?.membersPublisher.value.first { $0.userID == configuration.ownUserID }?.role ?? .user != .user + } + powerLevelsProxyMock.canUserKickUserIDClosure = { [weak self] userID in .success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user) } + powerLevelsProxyMock.canOwnUserKickClosure = { [weak self] in + self?.membersPublisher.value.first { $0.userID == configuration.ownUserID }?.role ?? .user != .user + } + powerLevelsProxyMock.canUserBanUserIDClosure = { [weak self] userID in .success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user) } + powerLevelsProxyMock.canOwnUserBanClosure = { [weak self] in + self?.membersPublisher.value.first { $0.userID == configuration.ownUserID }?.role ?? .user != .user + } powerLevelsReturnValue = .success(powerLevelsProxyMock) diff --git a/ElementX/Sources/Screens/KnockRequestsListScreen/KnockRequestsListScreenViewModel.swift b/ElementX/Sources/Screens/KnockRequestsListScreen/KnockRequestsListScreenViewModel.swift index a7561f67d..663a9c29a 100644 --- a/ElementX/Sources/Screens/KnockRequestsListScreen/KnockRequestsListScreenViewModel.swift +++ b/ElementX/Sources/Screens/KnockRequestsListScreen/KnockRequestsListScreenViewModel.swift @@ -218,9 +218,9 @@ class KnockRequestsListScreenViewModel: KnockRequestsListScreenViewModelType, Kn state.isKnockableRoom = false } - state.canAccept = (try? roomInfo.powerLevels.canUserInvite(userID: roomProxy.ownUserID).get()) == true - state.canDecline = (try? roomInfo.powerLevels.canUserKick(userID: roomProxy.ownUserID).get()) == true - state.canBan = (try? roomInfo.powerLevels.canUserBan(userID: roomProxy.ownUserID).get()) == true + state.canAccept = roomInfo.powerLevels.canOwnUserInvite() + state.canDecline = roomInfo.powerLevels.canOwnUserKick() + state.canBan = roomInfo.powerLevels.canOwnUserBan() } private static let loadingIndicatorIdentifier = "\(KnockRequestsListScreenViewModel.self)-Loading" diff --git a/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenViewModel.swift b/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenViewModel.swift index 81d53d7dd..9ca1c5dd8 100644 --- a/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomDetailsEditScreen/RoomDetailsEditScreenViewModel.swift @@ -87,9 +87,9 @@ class RoomDetailsEditScreenViewModel: RoomDetailsEditScreenViewModelType, RoomDe // MARK: - Private private func updateRoomInfo(roomInfo: RoomInfoProxyProtocol) { - state.canEditAvatar = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendStateEvent: .roomAvatar).get()) == .some(true) - state.canEditName = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendStateEvent: .roomName).get()) == .some(true) - state.canEditTopic = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendStateEvent: .roomTopic).get()) == .some(true) + state.canEditAvatar = roomInfo.powerLevels.canOwnUser(sendStateEvent: .roomAvatar) + state.canEditName = roomInfo.powerLevels.canOwnUser(sendStateEvent: .roomName) + state.canEditTopic = roomInfo.powerLevels.canOwnUser(sendStateEvent: .roomTopic) } private func saveRoomDetails() { diff --git a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift index 00a892d6c..9d7bf1554 100644 --- a/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomDetailsScreen/RoomDetailsScreenViewModel.swift @@ -224,13 +224,13 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr state.isKnockableRoom = false } - state.canEditRoomName = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendStateEvent: .roomName).get()) == true - state.canEditRoomTopic = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendStateEvent: .roomTopic).get()) == true - state.canEditRoomAvatar = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendStateEvent: .roomAvatar).get()) == true - state.canInviteUsers = (try? roomInfo.powerLevels.canUserInvite(userID: roomProxy.ownUserID).get()) == true - state.canKickUsers = (try? roomInfo.powerLevels.canUserKick(userID: roomProxy.ownUserID).get()) == true - state.canBanUsers = (try? roomInfo.powerLevels.canUserBan(userID: roomProxy.ownUserID).get()) == true - state.canJoinCall = (try? roomInfo.powerLevels.canUserJoinCall(userID: roomProxy.ownUserID).get()) == true + state.canEditRoomName = roomInfo.powerLevels.canOwnUser(sendStateEvent: .roomName) + state.canEditRoomTopic = roomInfo.powerLevels.canOwnUser(sendStateEvent: .roomTopic) + state.canEditRoomAvatar = roomInfo.powerLevels.canOwnUser(sendStateEvent: .roomAvatar) + state.canInviteUsers = roomInfo.powerLevels.canOwnUserInvite() + state.canKickUsers = roomInfo.powerLevels.canOwnUserKick() + state.canBanUsers = roomInfo.powerLevels.canOwnUserBan() + state.canJoinCall = roomInfo.powerLevels.canOwnUserJoinCall() Task { state.canEditRolesOrPermissions = await (try? roomProxy.suggestedRole(for: roomProxy.ownUserID).get()) == .administrator diff --git a/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift b/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift index 6ade10fef..47a816635 100644 --- a/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomMemberListScreen/RoomMembersListScreenViewModel.swift @@ -100,9 +100,9 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe bindings: state.bindings) let powerLevels = roomProxy.infoPublisher.value.powerLevels - self.state.canInviteUsers = (try? powerLevels.canUserInvite(userID: roomProxy.ownUserID).get()) == true - self.state.canKickUsers = (try? powerLevels.canUserKick(userID: roomProxy.ownUserID).get()) == true - self.state.canBanUsers = (try? powerLevels.canUserBan(userID: roomProxy.ownUserID).get()) == true + self.state.canInviteUsers = powerLevels.canOwnUserInvite() + self.state.canKickUsers = powerLevels.canOwnUserKick() + self.state.canBanUsers = powerLevels.canOwnUserBan() hideLoadingIndicator(Self.updateStateLoadingIndicatorIdentifier) } diff --git a/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift b/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift index c2531485f..2e1311db1 100644 --- a/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift +++ b/ElementX/Sources/Screens/RoomScreen/ComposerToolbar/CompletionSuggestionService.swift @@ -47,7 +47,7 @@ final class CompletionSuggestionService: CompletionSuggestionServiceProtocol { self?.suggestionTriggerSubject.value != nil ? .milliseconds(500) : .milliseconds(0) } - canMentionAllUsers = (try? roomProxy.infoPublisher.value.powerLevels.canUserTriggerRoomNotification(userID: roomProxy.ownUserID).get()) == true + canMentionAllUsers = roomProxy.infoPublisher.value.powerLevels.canOwnUserTriggerRoomNotification() } func processTextMessage(_ textMessage: String, selectedRange: NSRange) { diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index 2136d8d3f..60786ef5c 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -348,11 +348,11 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol state.isKnockableRoom = false } - state.canSendMessage = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendMessage: .roomMessage).get()) == true - state.canJoinCall = (try? roomInfo.powerLevels.canUserJoinCall(userID: roomProxy.ownUserID).get()) == true - state.canAcceptKnocks = (try? roomInfo.powerLevels.canUserInvite(userID: roomProxy.ownUserID).get()) == true - state.canDeclineKnocks = (try? roomInfo.powerLevels.canUserKick(userID: roomProxy.ownUserID).get()) == true - state.canBan = (try? roomInfo.powerLevels.canUserBan(userID: roomProxy.ownUserID).get()) == true + state.canSendMessage = roomInfo.powerLevels.canOwnUser(sendMessage: .roomMessage) + state.canJoinCall = roomInfo.powerLevels.canOwnUserJoinCall() + state.canAcceptKnocks = roomInfo.powerLevels.canOwnUserInvite() + state.canDeclineKnocks = roomInfo.powerLevels.canOwnUserKick() + state.canBan = roomInfo.powerLevels.canOwnUserBan() } private func setupPinnedEventsTimelineItemProviderIfNeeded() { diff --git a/ElementX/Sources/Screens/ThreadTimelineScreen/ThreadTimelineScreenViewModel.swift b/ElementX/Sources/Screens/ThreadTimelineScreen/ThreadTimelineScreenViewModel.swift index 316442ca3..af9a544d1 100644 --- a/ElementX/Sources/Screens/ThreadTimelineScreen/ThreadTimelineScreenViewModel.swift +++ b/ElementX/Sources/Screens/ThreadTimelineScreen/ThreadTimelineScreenViewModel.swift @@ -63,6 +63,6 @@ class ThreadTimelineScreenViewModel: ThreadTimelineScreenViewModelType, ThreadTi // MARK: - Private private func handleRoomInfoUpdate(_ roomInfo: RoomInfoProxyProtocol) { - state.canSendMessage = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendMessage: .roomMessage).get()) == true + state.canSendMessage = roomInfo.powerLevels.canOwnUser(sendMessage: .roomMessage) } } diff --git a/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift b/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift index dd753b1b8..850c24c5d 100644 --- a/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift +++ b/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift @@ -405,12 +405,12 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol { private func updateRoomInfo(roomInfo: RoomInfoProxyProtocol) { state.pinnedEventIDs = roomInfo.pinnedEventIDs - state.canCurrentUserSendMessage = (try? roomInfo.powerLevels.canUser(userID: roomProxy.ownUserID, sendMessage: .roomMessage).get()) == true - state.canCurrentUserRedactOthers = (try? roomInfo.powerLevels.canUserRedactOther(userID: roomProxy.ownUserID).get()) == true - state.canCurrentUserRedactSelf = (try? roomInfo.powerLevels.canUserRedactOwn(userID: roomProxy.ownUserID).get()) == true - state.canCurrentUserPin = (try? roomInfo.powerLevels.canUserPinOrUnpin(userID: roomProxy.ownUserID).get()) == true - state.canCurrentUserKick = (try? roomInfo.powerLevels.canUserKick(userID: roomProxy.ownUserID).get()) == true - state.canCurrentUserBan = (try? roomInfo.powerLevels.canUserBan(userID: roomProxy.ownUserID).get()) == true + state.canCurrentUserSendMessage = roomInfo.powerLevels.canOwnUser(sendMessage: .roomMessage) + state.canCurrentUserRedactOthers = roomInfo.powerLevels.canOwnUserRedactOther() + state.canCurrentUserRedactSelf = roomInfo.powerLevels.canOwnUserRedactOwn() + state.canCurrentUserPin = roomInfo.powerLevels.canOwnUserPinOrUnpin() + state.canCurrentUserKick = roomInfo.powerLevels.canOwnUserKick() + state.canCurrentUserBan = roomInfo.powerLevels.canOwnUserBan() } private func setupSubscriptions() { diff --git a/UnitTests/Sources/RoomDetailsViewModelTests.swift b/UnitTests/Sources/RoomDetailsViewModelTests.swift index 4a9081e94..0fe11f8bc 100644 --- a/UnitTests/Sources/RoomDetailsViewModelTests.swift +++ b/UnitTests/Sources/RoomDetailsViewModelTests.swift @@ -367,6 +367,9 @@ class RoomDetailsScreenViewModelTests: XCTestCase { powerLevelsProxyMock.canUserUserIDSendStateEventClosure = { _, event in .success(event == .roomAvatar) } + powerLevelsProxyMock.canOwnUserSendStateEventClosure = { event in + event == .roomAvatar + } roomProxyMock.powerLevelsReturnValue = .success(powerLevelsProxyMock) let roomInfoProxyMock = RoomInfoProxyMock(configuration) @@ -405,6 +408,9 @@ class RoomDetailsScreenViewModelTests: XCTestCase { powerLevelsProxyMock.canUserUserIDSendStateEventClosure = { _, event in .success(event == .roomName) } + powerLevelsProxyMock.canOwnUserSendStateEventClosure = { event in + event == .roomName + } roomProxyMock.powerLevelsReturnValue = .success(powerLevelsProxyMock) let roomInfoProxyMock = RoomInfoProxyMock(configuration) @@ -443,6 +449,9 @@ class RoomDetailsScreenViewModelTests: XCTestCase { powerLevelsProxyMock.canUserUserIDSendStateEventClosure = { _, event in .success(event == .roomTopic) } + powerLevelsProxyMock.canOwnUserSendStateEventClosure = { event in + event == .roomTopic + } roomProxyMock.powerLevelsReturnValue = .success(powerLevelsProxyMock) let roomInfoProxyMock = RoomInfoProxyMock(configuration) diff --git a/UnitTests/Sources/TimelineViewModelTests.swift b/UnitTests/Sources/TimelineViewModelTests.swift index e963b471c..bd50873d2 100644 --- a/UnitTests/Sources/TimelineViewModelTests.swift +++ b/UnitTests/Sources/TimelineViewModelTests.swift @@ -520,6 +520,7 @@ class TimelineViewModelTests: XCTestCase { let powerLevelsProxyMock = RoomPowerLevelsProxyMock(configuration: .init()) powerLevelsProxyMock.canUserPinOrUnpinUserIDReturnValue = .success(false) + powerLevelsProxyMock.canOwnUserPinOrUnpinReturnValue = false roomProxyMock.powerLevelsReturnValue = .success(powerLevelsProxyMock) let roomInfoProxyMock = RoomInfoProxyMock(configuration)