Restore permissions to creator and display them as owners in the list (#4369)

* restore permissions to creator and display them as owners in the list

* improved the code to use actually 5 roles in the app to distinguish a real creator from an owner
This commit is contained in:
Mauro
2025-07-31 16:52:55 +02:00
committed by GitHub
parent 496c29ae36
commit 731d60b6e9
29 changed files with 205 additions and 137 deletions
@@ -35,7 +35,8 @@ struct RoomChangeRolesScreenViewState: BindableState {
/// The screen's title.
var title: String {
switch mode {
case .administrator:
case .creator, .owner, .administrator:
// TODO: Handle the creator permissions change
L10n.screenRoomChangeRoleAdministratorsTitle
case .moderator:
L10n.screenRoomChangeRoleModeratorsTitle
@@ -64,7 +64,7 @@ class RoomChangeRolesScreenViewModel: RoomChangeRolesScreenViewModelType, RoomCh
case .demoteMember(let member):
demoteMember(member)
case .save:
if state.mode == .administrator, !state.membersToPromote.isEmpty {
if state.mode.isAdminOrHigher, !state.membersToPromote.isEmpty {
showPromotionWarning()
} else {
Task { await save() }
@@ -24,7 +24,7 @@ struct RoomChangeRolesScreenSection: View {
isSelected: isMemberSelected(member)) {
context.send(viewAction: .toggleMember(member))
}
.disabled(member.role == .administrator)
.disabled(member.role.isAdminOrHigher)
}
} header: {
Text(title)
@@ -40,6 +40,6 @@ struct RoomChangeRolesScreenSection: View {
private func isMemberSelected(_ member: RoomMemberDetails) -> Bool {
// We always show administrators as selected, even on the moderators screen.
member.role == .administrator || context.viewState.isMemberSelected(member)
member.role.isAdminOrHigher || context.viewState.isMemberSelected(member)
}
}
@@ -232,7 +232,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
state.canKickUsers = powerLevels.canOwnUserKick()
state.canBanUsers = powerLevels.canOwnUserBan()
state.canJoinCall = powerLevels.canOwnUserJoinCall()
state.canEditRolesOrPermissions = powerLevels.suggestedRole(forUser: roomProxy.ownUserID) == .administrator
state.canEditRolesOrPermissions = powerLevels.canOwnUserEditRolesAndPermissions()
}
}
@@ -168,6 +168,8 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
.mockBob,
.mockCharlie,
mockAdmin,
.mockCreator,
.mockOwner,
.mockModerator
]
@@ -55,6 +55,8 @@ struct RoomMembersListScreenMemberCell: View {
var role: String? {
switch listEntry.member.role {
case .creator, .owner:
L10n.screenRoomMemberListRoleOwner
case .administrator:
L10n.screenRoomMemberListRoleAdministrator
case .moderator:
@@ -84,7 +84,8 @@ class RoomRolesAndPermissionsScreenViewModel: RoomRolesAndPermissionsScreenViewM
// MARK: - Members
private func updateMembers(_ members: [RoomMemberProxyProtocol]) {
state.administratorCount = members.filter { $0.role == .administrator && $0.isActive }.count
// TODO: Will probably be changed when we implement the owners list
state.administratorCount = members.filter { $0.role.isAdminOrHigher && $0.isActive }.count
state.moderatorCount = members.filter { $0.role == .moderator && $0.isActive }.count
}