Add the setting to change live location permissions to the change permissions screen.

This commit is contained in:
Mauro Romito
2026-05-05 18:31:41 +02:00
committed by Mauro
parent e081811f1c
commit 95c362d31a
7 changed files with 29 additions and 14 deletions

View File

@@ -1132,6 +1132,7 @@
"screen_room_change_permissions_delete_messages" = "Remove messages"; "screen_room_change_permissions_delete_messages" = "Remove messages";
"screen_room_change_permissions_everyone" = "Member"; "screen_room_change_permissions_everyone" = "Member";
"screen_room_change_permissions_invite_people" = "Invite people"; "screen_room_change_permissions_invite_people" = "Invite people";
"screen_room_change_permissions_live_location" = "Share live location";
"screen_room_change_permissions_manage_space" = "Manage space"; "screen_room_change_permissions_manage_space" = "Manage space";
"screen_room_change_permissions_manage_space_rooms" = "Manage rooms"; "screen_room_change_permissions_manage_space_rooms" = "Manage rooms";
"screen_room_change_permissions_member_moderation" = "Manage members"; "screen_room_change_permissions_member_moderation" = "Manage members";

View File

@@ -1132,6 +1132,7 @@
"screen_room_change_permissions_delete_messages" = "Remove messages"; "screen_room_change_permissions_delete_messages" = "Remove messages";
"screen_room_change_permissions_everyone" = "Member"; "screen_room_change_permissions_everyone" = "Member";
"screen_room_change_permissions_invite_people" = "Invite people"; "screen_room_change_permissions_invite_people" = "Invite people";
"screen_room_change_permissions_live_location" = "Share live location";
"screen_room_change_permissions_manage_space" = "Manage space"; "screen_room_change_permissions_manage_space" = "Manage space";
"screen_room_change_permissions_manage_space_rooms" = "Manage rooms"; "screen_room_change_permissions_manage_space_rooms" = "Manage rooms";
"screen_room_change_permissions_member_moderation" = "Manage members"; "screen_room_change_permissions_member_moderation" = "Manage members";

View File

@@ -2632,6 +2632,8 @@ internal enum L10n {
internal static var screenRoomChangePermissionsEveryone: String { return L10n.tr("Localizable", "screen_room_change_permissions_everyone") } internal static var screenRoomChangePermissionsEveryone: String { return L10n.tr("Localizable", "screen_room_change_permissions_everyone") }
/// Invite people /// Invite people
internal static var screenRoomChangePermissionsInvitePeople: String { return L10n.tr("Localizable", "screen_room_change_permissions_invite_people") } internal static var screenRoomChangePermissionsInvitePeople: String { return L10n.tr("Localizable", "screen_room_change_permissions_invite_people") }
/// Share live location
internal static var screenRoomChangePermissionsLiveLocation: String { return L10n.tr("Localizable", "screen_room_change_permissions_live_location") }
/// Manage space /// Manage space
internal static var screenRoomChangePermissionsManageSpace: String { return L10n.tr("Localizable", "screen_room_change_permissions_manage_space") } internal static var screenRoomChangePermissionsManageSpace: String { return L10n.tr("Localizable", "screen_room_change_permissions_manage_space") }
/// Manage rooms /// Manage rooms

View File

@@ -114,7 +114,11 @@ extension RoomChangePermissionsScreenViewState {
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsDeleteMessages, RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsDeleteMessages,
value: currentPermissions.redact, value: currentPermissions.redact,
ownPowerLevel: ownPowerLevel, ownPowerLevel: ownPowerLevel,
keyPath: \.redact) keyPath: \.redact),
RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsLiveLocation,
value: currentPermissions.liveLocation,
ownPowerLevel: ownPowerLevel,
keyPath: \.liveLocation)
] ]
} }
case .manageSpace: case .manageSpace:

View File

@@ -67,7 +67,9 @@ class RoomChangePermissionsScreenViewModel: RoomChangePermissionsScreenViewModel
.flatMap { $0 } .flatMap { $0 }
.filter { state.currentPermissions[keyPath: $0.keyPath] != $0.value } .filter { state.currentPermissions[keyPath: $0.keyPath] != $0.value }
for setting in changedSettings { for setting in changedSettings {
changes[keyPath: setting.rustKeyPath] = setting.value for keyPath in setting.rustKeyPaths {
changes[keyPath: keyPath] = setting.value
}
} }
switch await roomProxy.applyPowerLevelChanges(changes) { switch await roomProxy.applyPowerLevelChanges(changes) {

View File

@@ -36,19 +36,20 @@ struct RoomPermissionsSetting: Identifiable {
/// The `RoomPermissions` property that this setting is for. /// The `RoomPermissions` property that this setting is for.
let keyPath: KeyPath<RoomPermissions, Int64> let keyPath: KeyPath<RoomPermissions, Int64>
/// The `RoomPowerLevelChanges` property that this setting is saved into. /// The `RoomPowerLevelChanges` property that this setting is saved into.
var rustKeyPath: WritableKeyPath<RoomPowerLevelChanges, Int64?> { var rustKeyPaths: [WritableKeyPath<RoomPowerLevelChanges, Int64?>] {
switch keyPath { switch keyPath {
case \.ban: \.ban case \.ban: [\.ban]
case \.invite: \.invite case \.invite: [\.invite]
case \.kick: \.kick case \.kick: [\.kick]
case \.redact: \.redact case \.redact: [\.redact]
case \.eventsDefault: \.eventsDefault case \.eventsDefault: [\.eventsDefault]
case \.stateDefault: \.stateDefault case \.stateDefault: [\.stateDefault]
case \.usersDefault: \.usersDefault case \.usersDefault: [\.usersDefault]
case \.roomName: \.roomName case \.roomName: [\.roomName]
case \.roomAvatar: \.roomAvatar case \.roomAvatar: [\.roomAvatar]
case \.roomTopic: \.roomTopic case \.roomTopic: [\.roomTopic]
case \.spaceChild: \.spaceChild case \.spaceChild: [\.spaceChild]
case \.liveLocation: [\.beacon, \.beaconInfo]
default: fatalError("Unexpected key path: \(keyPath)") default: fatalError("Unexpected key path: \(keyPath)")
} }
} }
@@ -96,6 +97,8 @@ struct RoomPermissions {
var roomTopic: Int64 var roomTopic: Int64
/// The level required to add/remove childrens from a space. /// The level required to add/remove childrens from a space.
var spaceChild: Int64 var spaceChild: Int64
/// The level required to send live location updates
var liveLocation: Int64
} }
extension RoomPermissions { extension RoomPermissions {
@@ -112,5 +115,6 @@ extension RoomPermissions {
roomAvatar = powerLevels.roomAvatar roomAvatar = powerLevels.roomAvatar
roomTopic = powerLevels.roomTopic roomTopic = powerLevels.roomTopic
spaceChild = powerLevels.spaceChild spaceChild = powerLevels.spaceChild
liveLocation = max(powerLevels.beacon, powerLevels.beaconInfo)
} }
} }

View File

@@ -43,5 +43,6 @@ struct RoomPermissionsTests {
#expect(permissions.roomAvatar == RoomRole.user.powerLevelValue) #expect(permissions.roomAvatar == RoomRole.user.powerLevelValue)
#expect(permissions.roomTopic == RoomRole.user.powerLevelValue) #expect(permissions.roomTopic == RoomRole.user.powerLevelValue)
#expect(permissions.spaceChild == RoomRole.administrator.powerLevelValue) #expect(permissions.spaceChild == RoomRole.administrator.powerLevelValue)
#expect(permissions.liveLocation == RoomRole.moderator.powerLevelValue)
} }
} }