ios: change member role (#1164)

* ios: change member role

* chat item types, error alerts

* update alert

* translations

* update messages

* translation

Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>

* translation

Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>

* translation

Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>

* update translations

Co-authored-by: JRoberts <8711996+jr-simplex@users.noreply.github.com>
This commit is contained in:
Evgeny Poberezkin
2022-10-04 09:53:43 +01:00
committed by GitHub
parent cd6cad9a96
commit f9c691cab1
12 changed files with 614 additions and 39 deletions

View File

@@ -38,7 +38,7 @@ public enum ChatCommand {
case newGroup(groupProfile: GroupProfile)
case apiAddMember(groupId: Int64, contactId: Int64, memberRole: GroupMemberRole)
case apiJoinGroup(groupId: Int64)
// case apiMemberRole(groupId: Int64, memberId: Int64, memberRole: GroupMemberRole)
case apiMemberRole(groupId: Int64, memberId: Int64, memberRole: GroupMemberRole)
case apiRemoveMember(groupId: Int64, memberId: Int64)
case apiLeaveGroup(groupId: Int64)
case apiListMembers(groupId: Int64)
@@ -109,6 +109,7 @@ public enum ChatCommand {
case let .newGroup(groupProfile): return "/_group \(encodeJSON(groupProfile))"
case let .apiAddMember(groupId, contactId, memberRole): return "/_add #\(groupId) \(contactId) \(memberRole)"
case let .apiJoinGroup(groupId): return "/_join #\(groupId)"
case let .apiMemberRole(groupId, memberId, memberRole): return "/_member role #\(groupId) \(memberId) \(memberRole.rawValue)"
case let .apiRemoveMember(groupId, memberId): return "/_remove #\(groupId) \(memberId)"
case let .apiLeaveGroup(groupId): return "/_leave #\(groupId)"
case let .apiListMembers(groupId): return "/_members #\(groupId)"
@@ -178,6 +179,7 @@ public enum ChatCommand {
case .newGroup: return "newGroup"
case .apiAddMember: return "apiAddMember"
case .apiJoinGroup: return "apiJoinGroup"
case .apiMemberRole: return "apiMemberRole"
case .apiRemoveMember: return "apiRemoveMember"
case .apiLeaveGroup: return "apiLeaveGroup"
case .apiListMembers: return "apiListMembers"
@@ -312,6 +314,8 @@ public enum ChatResponse: Decodable, Error {
case receivedGroupInvitation(groupInfo: GroupInfo, contact: Contact, memberRole: GroupMemberRole)
case groupDeletedUser(groupInfo: GroupInfo)
case joinedGroupMemberConnecting(groupInfo: GroupInfo, hostMember: GroupMember, member: GroupMember)
case memberRole(groupInfo: GroupInfo, byMember: GroupMember, member: GroupMember, fromRole: GroupMemberRole, toRole: GroupMemberRole)
case memberRoleUser(groupInfo: GroupInfo, member: GroupMember, fromRole: GroupMemberRole, toRole: GroupMemberRole)
case deletedMemberUser(groupInfo: GroupInfo, member: GroupMember)
case deletedMember(groupInfo: GroupInfo, byMember: GroupMember, deletedMember: GroupMember)
case leftMember(groupInfo: GroupInfo, member: GroupMember)
@@ -406,6 +410,8 @@ public enum ChatResponse: Decodable, Error {
case .receivedGroupInvitation: return "receivedGroupInvitation"
case .groupDeletedUser: return "groupDeletedUser"
case .joinedGroupMemberConnecting: return "joinedGroupMemberConnecting"
case .memberRole: return "memberRole"
case .memberRoleUser: return "memberRoleUser"
case .deletedMemberUser: return "deletedMemberUser"
case .deletedMember: return "deletedMember"
case .leftMember: return "leftMember"
@@ -501,6 +507,8 @@ public enum ChatResponse: Decodable, Error {
case let .receivedGroupInvitation(groupInfo, contact, memberRole): return "groupInfo: \(groupInfo)\ncontact: \(contact)\nmemberRole: \(memberRole)"
case let .groupDeletedUser(groupInfo): return String(describing: groupInfo)
case let .joinedGroupMemberConnecting(groupInfo, hostMember, member): return "groupInfo: \(groupInfo)\nhostMember: \(hostMember)\nmember: \(member)"
case let .memberRole(groupInfo, byMember, member, fromRole, toRole): return "groupInfo: \(groupInfo)\nbyMember: \(byMember)\nmember: \(member)\nfromRole: \(fromRole)\ntoRole: \(toRole)"
case let .memberRoleUser(groupInfo, member, fromRole, toRole): return "groupInfo: \(groupInfo)\nmember: \(member)\nfromRole: \(fromRole)\ntoRole: \(toRole)"
case let .deletedMemberUser(groupInfo, member): return "groupInfo: \(groupInfo)\nmember: \(member)"
case let .deletedMember(groupInfo, byMember, deletedMember): return "groupInfo: \(groupInfo)\nbyMember: \(byMember)\ndeletedMember: \(deletedMember)"
case let .leftMember(groupInfo, member): return "groupInfo: \(groupInfo)\nmember: \(member)"

View File

@@ -669,10 +669,16 @@ public struct GroupMember: Identifiable, Decodable {
}
}
public func canBeRemoved(membership: GroupMember) -> Bool {
let userRole = membership.memberRole
public func canBeRemoved(groupInfo: GroupInfo) -> Bool {
let userRole = groupInfo.membership.memberRole
return memberStatus != .memRemoved && memberStatus != .memLeft
&& userRole >= .admin && userRole >= memberRole && membership.memberCurrent
&& userRole >= .admin && userRole >= memberRole && groupInfo.membership.memberCurrent
}
public func canChangeRoleTo(groupInfo: GroupInfo) -> [GroupMemberRole]? {
if !canBeRemoved(groupInfo: groupInfo) { return nil }
let userRole = groupInfo.membership.memberRole
return GroupMemberRole.allCases.filter { $0 <= userRole }
}
public var memberIncognito: Bool {
@@ -702,11 +708,11 @@ public enum GroupMemberRole: String, Identifiable, CaseIterable, Comparable, Dec
public var id: Self { self }
public var text: LocalizedStringKey {
public var text: String {
switch self {
case .member: return "member"
case .admin: return "admin"
case .owner: return "owner"
case .member: return NSLocalizedString("member", comment: "member role")
case .admin: return NSLocalizedString("admin", comment: "member role")
case .owner: return NSLocalizedString("owner", comment: "member role")
}
}
@@ -898,6 +904,8 @@ public struct ChatItem: Identifiable, Decodable {
switch event {
case .groupUpdated: return true
case .memberConnected: return true
case .memberRole: return true
case .userRole: return false
case .userDeleted: return false
case .groupDeleted: return false
case .memberAdded: return false
@@ -1430,6 +1438,8 @@ public enum RcvGroupEvent: Decodable {
case memberAdded(groupMemberId: Int64, profile: Profile)
case memberConnected
case memberLeft
case memberRole(groupMemberId: Int64, profile: Profile, role: GroupMemberRole)
case userRole(role: GroupMemberRole)
case memberDeleted(groupMemberId: Int64, profile: Profile)
case userDeleted
case groupDeleted
@@ -1441,6 +1451,10 @@ public enum RcvGroupEvent: Decodable {
return String.localizedStringWithFormat(NSLocalizedString("invited %@", comment: "rcv group event chat item"), profile.profileViewName)
case .memberConnected: return NSLocalizedString("member connected", comment: "rcv group event chat item")
case .memberLeft: return NSLocalizedString("left", comment: "rcv group event chat item")
case let .memberRole(_, profile, role):
return String.localizedStringWithFormat(NSLocalizedString("member %@ role: %@", comment: "rcv group event chat item"), profile.profileViewName, role.text)
case let .userRole(role):
return String.localizedStringWithFormat(NSLocalizedString("your role: %@", comment: "rcv group event chat item"), role.text)
case let .memberDeleted(_, profile):
return String.localizedStringWithFormat(NSLocalizedString("removed %@", comment: "rcv group event chat item"), profile.profileViewName)
case .userDeleted: return NSLocalizedString("removed you", comment: "rcv group event chat item")
@@ -1451,12 +1465,18 @@ public enum RcvGroupEvent: Decodable {
}
public enum SndGroupEvent: Decodable {
case memberRole(groupMemberId: Int64, profile: Profile, role: GroupMemberRole)
case userRole(role: GroupMemberRole)
case memberDeleted(groupMemberId: Int64, profile: Profile)
case userLeft
case groupUpdated(groupProfile: GroupProfile)
var text: String {
switch self {
case let .memberRole(_, profile, role):
return String.localizedStringWithFormat(NSLocalizedString("member %@ role: %@", comment: "snd group event chat item"), profile.profileViewName, role.text)
case let .userRole(role):
return String.localizedStringWithFormat(NSLocalizedString("your role: %@", comment: "snd group event chat item"), role.text)
case let .memberDeleted(_, profile):
return String.localizedStringWithFormat(NSLocalizedString("you removed %@", comment: "snd group event chat item"), profile.profileViewName)
case .userLeft: return NSLocalizedString("you left", comment: "snd group event chat item")