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_everyone" = "Member";
"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_rooms" = "Manage rooms";
"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_everyone" = "Member";
"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_rooms" = "Manage rooms";
"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") }
/// 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
internal static var screenRoomChangePermissionsManageSpace: String { return L10n.tr("Localizable", "screen_room_change_permissions_manage_space") }
/// Manage rooms

View File

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

View File

@@ -67,7 +67,9 @@ class RoomChangePermissionsScreenViewModel: RoomChangePermissionsScreenViewModel
.flatMap { $0 }
.filter { state.currentPermissions[keyPath: $0.keyPath] != $0.value }
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) {

View File

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