mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 21:33:26 +00:00
implemented a way to filter out roles that can't be assigned to permission, and disable permissions that are above the current power level of the user.
This commit is contained in:
+2
-3
@@ -10,6 +10,7 @@ import Combine
|
||||
import SwiftUI
|
||||
|
||||
struct RoomChangePermissionsScreenCoordinatorParameters {
|
||||
let ownPowerLevel: RoomPowerLevel
|
||||
let permissions: RoomPermissions
|
||||
let roomProxy: JoinedRoomProxyProtocol
|
||||
let userIndicatorController: UserIndicatorControllerProtocol
|
||||
@@ -21,7 +22,6 @@ enum RoomChangePermissionsScreenCoordinatorAction {
|
||||
}
|
||||
|
||||
final class RoomChangePermissionsScreenCoordinator: CoordinatorProtocol {
|
||||
private let parameters: RoomChangePermissionsScreenCoordinatorParameters
|
||||
private var viewModel: RoomChangePermissionsScreenViewModelProtocol
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
||||
@@ -31,9 +31,8 @@ final class RoomChangePermissionsScreenCoordinator: CoordinatorProtocol {
|
||||
}
|
||||
|
||||
init(parameters: RoomChangePermissionsScreenCoordinatorParameters) {
|
||||
self.parameters = parameters
|
||||
|
||||
viewModel = RoomChangePermissionsScreenViewModel(currentPermissions: parameters.permissions,
|
||||
ownPowerLevel: parameters.ownPowerLevel,
|
||||
roomProxy: parameters.roomProxy,
|
||||
userIndicatorController: parameters.userIndicatorController,
|
||||
analytics: parameters.analytics)
|
||||
|
||||
+10
-1
@@ -69,7 +69,7 @@ extension RoomChangePermissionsScreenViewState {
|
||||
/// - Parameters:
|
||||
/// - currentPermissions: The current permissions for the room.
|
||||
/// - isSpace: if the room is a space or a normal room.
|
||||
init(currentPermissions: RoomPermissions, isSpace: Bool) {
|
||||
init(ownPowerLevel: RoomPowerLevel, currentPermissions: RoomPermissions, isSpace: Bool) {
|
||||
var settings = [RoomChangePermissionsScreenGroup: [RoomPermissionsSetting]]()
|
||||
for group in RoomChangePermissionsScreenGroup.allCases {
|
||||
switch group {
|
||||
@@ -77,12 +77,15 @@ extension RoomChangePermissionsScreenViewState {
|
||||
settings[group] = [
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsRoomName,
|
||||
value: currentPermissions.roomName,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.roomName),
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsRoomAvatar,
|
||||
value: currentPermissions.roomAvatar,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.roomAvatar),
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsRoomTopic,
|
||||
value: currentPermissions.roomTopic,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.roomTopic)
|
||||
]
|
||||
|
||||
@@ -90,12 +93,15 @@ extension RoomChangePermissionsScreenViewState {
|
||||
settings[group] = [
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsInvitePeople,
|
||||
value: currentPermissions.invite,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.invite),
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsRemovePeople,
|
||||
value: currentPermissions.kick,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.kick),
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsBanPeople,
|
||||
value: currentPermissions.ban,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.ban)
|
||||
]
|
||||
case .messagesAndContent:
|
||||
@@ -103,9 +109,11 @@ extension RoomChangePermissionsScreenViewState {
|
||||
settings[group] = [
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsSendMessages,
|
||||
value: currentPermissions.eventsDefault,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.eventsDefault),
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsDeleteMessages,
|
||||
value: currentPermissions.redact,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.redact)
|
||||
]
|
||||
}
|
||||
@@ -114,6 +122,7 @@ extension RoomChangePermissionsScreenViewState {
|
||||
settings[group] = [
|
||||
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsManageSpaceRooms,
|
||||
value: currentPermissions.spaceChild,
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
keyPath: \.spaceChild)
|
||||
]
|
||||
}
|
||||
|
||||
+13
-10
@@ -23,13 +23,16 @@ class RoomChangePermissionsScreenViewModel: RoomChangePermissionsScreenViewModel
|
||||
}
|
||||
|
||||
init(currentPermissions: RoomPermissions,
|
||||
ownPowerLevel: RoomPowerLevel,
|
||||
roomProxy: JoinedRoomProxyProtocol,
|
||||
userIndicatorController: UserIndicatorControllerProtocol,
|
||||
analytics: AnalyticsService) {
|
||||
self.roomProxy = roomProxy
|
||||
self.userIndicatorController = userIndicatorController
|
||||
self.analytics = analytics
|
||||
super.init(initialViewState: .init(currentPermissions: currentPermissions, isSpace: roomProxy.infoPublisher.value.isSpace))
|
||||
super.init(initialViewState: .init(ownPowerLevel: ownPowerLevel,
|
||||
currentPermissions: currentPermissions,
|
||||
isSpace: roomProxy.infoPublisher.value.isSpace))
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
@@ -64,7 +67,7 @@ class RoomChangePermissionsScreenViewModel: RoomChangePermissionsScreenViewModel
|
||||
.flatMap { $0 }
|
||||
.filter { state.currentPermissions[keyPath: $0.keyPath] != $0.value }
|
||||
for setting in changedSettings {
|
||||
changes[keyPath: setting.rustKeyPath] = setting.value.powerLevelValue
|
||||
changes[keyPath: setting.rustKeyPath] = setting.value
|
||||
}
|
||||
|
||||
switch await roomProxy.applyPowerLevelChanges(changes) {
|
||||
@@ -106,14 +109,14 @@ class RoomChangePermissionsScreenViewModel: RoomChangePermissionsScreenViewModel
|
||||
private func trackChanges(_ settings: [RoomPermissionsSetting]) {
|
||||
for setting in settings {
|
||||
switch setting.keyPath {
|
||||
case \.ban: analytics.trackRoomModeration(action: .ChangePermissionsBanMembers, role: setting.value)
|
||||
case \.invite: analytics.trackRoomModeration(action: .ChangePermissionsInviteUsers, role: setting.value)
|
||||
case \.kick: analytics.trackRoomModeration(action: .ChangePermissionsKickMembers, role: setting.value)
|
||||
case \.redact: analytics.trackRoomModeration(action: .ChangePermissionsRedactMessages, role: setting.value)
|
||||
case \.eventsDefault: analytics.trackRoomModeration(action: .ChangePermissionsSendMessages, role: setting.value)
|
||||
case \.roomName: analytics.trackRoomModeration(action: .ChangePermissionsRoomName, role: setting.value)
|
||||
case \.roomAvatar: analytics.trackRoomModeration(action: .ChangePermissionsRoomAvatar, role: setting.value)
|
||||
case \.roomTopic: analytics.trackRoomModeration(action: .ChangePermissionsRoomTopic, role: setting.value)
|
||||
case \.ban: analytics.trackRoomModeration(action: .ChangePermissionsBanMembers, role: setting.roleValue)
|
||||
case \.invite: analytics.trackRoomModeration(action: .ChangePermissionsInviteUsers, role: setting.roleValue)
|
||||
case \.kick: analytics.trackRoomModeration(action: .ChangePermissionsKickMembers, role: setting.roleValue)
|
||||
case \.redact: analytics.trackRoomModeration(action: .ChangePermissionsRedactMessages, role: setting.roleValue)
|
||||
case \.eventsDefault: analytics.trackRoomModeration(action: .ChangePermissionsSendMessages, role: setting.roleValue)
|
||||
case \.roomName: analytics.trackRoomModeration(action: .ChangePermissionsRoomName, role: setting.roleValue)
|
||||
case \.roomAvatar: analytics.trackRoomModeration(action: .ChangePermissionsRoomAvatar, role: setting.roleValue)
|
||||
case \.roomTopic: analytics.trackRoomModeration(action: .ChangePermissionsRoomTopic, role: setting.roleValue)
|
||||
default: MXLog.warning("Unexpected change: \(setting.keyPath).")
|
||||
}
|
||||
}
|
||||
|
||||
+11
-2
@@ -32,7 +32,9 @@ struct RoomChangePermissionsScreen: View {
|
||||
Section {
|
||||
ForEach(settings) { $setting in
|
||||
ListRow(label: .plain(title: setting.title),
|
||||
kind: .picker(selection: $setting.value, items: setting.allValues))
|
||||
kind: .picker(selection: $setting.roleValue,
|
||||
items: setting.availableValues))
|
||||
.disabled(setting.isDisabled)
|
||||
}
|
||||
} header: {
|
||||
Text(group.name)
|
||||
@@ -64,6 +66,7 @@ struct RoomChangePermissionsScreen: View {
|
||||
|
||||
struct RoomChangePermissionsScreen_Previews: PreviewProvider, TestablePreview {
|
||||
static let roomViewModel = makeViewModel(isSpace: false)
|
||||
static let roomAsUserViewModel = makeViewModel(isSpace: false, ownPowerLevel: RoomRole.user.powerLevel)
|
||||
static let spaceViewModel = makeViewModel(isSpace: true)
|
||||
|
||||
static var previews: some View {
|
||||
@@ -72,14 +75,20 @@ struct RoomChangePermissionsScreen_Previews: PreviewProvider, TestablePreview {
|
||||
}
|
||||
.previewDisplayName("Room")
|
||||
|
||||
NavigationStack {
|
||||
RoomChangePermissionsScreen(context: roomAsUserViewModel.context)
|
||||
}
|
||||
.previewDisplayName("Room as User")
|
||||
|
||||
NavigationStack {
|
||||
RoomChangePermissionsScreen(context: spaceViewModel.context)
|
||||
}
|
||||
.previewDisplayName("Space")
|
||||
}
|
||||
|
||||
static func makeViewModel(isSpace: Bool) -> RoomChangePermissionsScreenViewModel {
|
||||
static func makeViewModel(isSpace: Bool, ownPowerLevel: RoomPowerLevel = RoomRole.creator.powerLevel) -> RoomChangePermissionsScreenViewModel {
|
||||
RoomChangePermissionsScreenViewModel(currentPermissions: .init(powerLevels: .mock),
|
||||
ownPowerLevel: ownPowerLevel,
|
||||
roomProxy: JoinedRoomProxyMock(.init(isSpace: isSpace)),
|
||||
userIndicatorController: UserIndicatorControllerMock(),
|
||||
analytics: ServiceLocator.shared.analytics)
|
||||
|
||||
Reference in New Issue
Block a user