diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index 0fd4a86ece..376e83c2d8 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -426,7 +426,7 @@ struct GroupChatInfoView: View { if user { v - } else if groupInfo.membership.memberRole >= .admin { + } else if groupInfo.membership.memberRole >= .moderator { // TODO if there are more actions, refactor with lists of swipeActions let canBlockForAll = member.canBlockForAll(groupInfo: groupInfo) let canRemove = member.canBeRemoved(groupInfo: groupInfo) @@ -469,7 +469,7 @@ struct GroupChatInfoView: View { .foregroundColor(theme.colors.secondary) } else { let role = member.memberRole - if [.owner, .admin, .observer].contains(role) { + if [.owner, .admin, .moderator, .observer].contains(role) { Text(member.memberRole.text) .foregroundColor(theme.colors.secondary) } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift index 725b5a61fa..2057b9b43c 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift @@ -180,7 +180,7 @@ struct GroupMemberInfoView: View { } } - if groupInfo.membership.memberRole >= .admin { + if groupInfo.membership.memberRole >= .moderator { adminDestructiveSection(member) } else { nonAdminBlockSection(member) diff --git a/apps/ios/Shared/Views/Chat/SelectableChatItemToolbars.swift b/apps/ios/Shared/Views/Chat/SelectableChatItemToolbars.swift index e397970acd..4855c3ca8d 100644 --- a/apps/ios/Shared/Views/Chat/SelectableChatItemToolbars.swift +++ b/apps/ios/Shared/Views/Chat/SelectableChatItemToolbars.swift @@ -146,7 +146,7 @@ struct SelectedItemsBottomToolbar: View { private func possibleToModerate(_ chatInfo: ChatInfo) -> Bool { return switch chatInfo { case let .group(groupInfo, _): - groupInfo.membership.memberRole >= .admin + groupInfo.membership.memberRole >= .moderator default: false } } diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index cd687f619c..ea61f125f2 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -2419,8 +2419,8 @@ public struct GroupMember: Identifiable, Decodable, Hashable { public func canBlockForAll(groupInfo: GroupInfo) -> Bool { let userRole = groupInfo.membership.memberRole - return memberStatus != .memRemoved && memberStatus != .memLeft && memberRole < .admin - && userRole >= .admin && userRole >= memberRole && groupInfo.membership.memberActive + return memberStatus != .memRemoved && memberStatus != .memLeft && memberRole < .moderator + && userRole >= .moderator && userRole >= memberRole && groupInfo.membership.memberActive } public var canReceiveReports: Bool { @@ -2980,12 +2980,12 @@ public struct ChatItem: Identifiable, Decodable, Hashable { switch (chatInfo, chatDir) { case let (.group(groupInfo, _), .groupRcv(groupMember)): let m = groupInfo.membership - return m.memberRole >= .admin && m.memberRole >= groupMember.memberRole && meta.itemDeleted == nil + return m.memberRole >= .moderator && m.memberRole >= groupMember.memberRole && meta.itemDeleted == nil ? (groupInfo, groupMember) : nil case let (.group(groupInfo, _), .groupSnd): let m = groupInfo.membership - return m.memberRole >= .admin ? (groupInfo, nil) : nil + return m.memberRole >= .moderator ? (groupInfo, nil) : nil default: return nil } } diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 1f1f114a39..c276d0a6d1 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -1672,8 +1672,7 @@ processChatCommand vr nm = \case gInfo <- withFastStore $ \db -> getGroupInfo db vr user gId m <- withFastStore $ \db -> getGroupMember db vr user gId mId let GroupInfo {membership = GroupMember {memberRole = membershipRole}} = gInfo - -- TODO GRModerator when most users migrate - when (membershipRole >= GRAdmin) $ throwChatError $ CECantBlockMemberForSelf gInfo m showMessages + when (membershipRole >= GRModerator) $ throwChatError $ CECantBlockMemberForSelf gInfo m showMessages let settings = (memberSettings m) {showMessages} processChatCommand vr nm $ APISetMemberSettings gId mId settings ContactInfo cName -> withContactName cName APIContactInfo @@ -3200,7 +3199,7 @@ processChatCommand vr nm = \case delGroupChatItemsForMembers :: User -> GroupInfo -> Maybe GroupChatScopeInfo -> [GroupMember] -> [CChatItem 'CTGroup] -> CM [ChatItemDeletion] delGroupChatItemsForMembers user gInfo chatScopeInfo ms items = do assertDeletable gInfo items - assertUserGroupRole gInfo GRAdmin -- TODO GRModerator when most users migrate + assertUserGroupRole gInfo GRModerator let msgMemIds = itemsMsgMemIds gInfo items events = L.nonEmpty $ map (\(msgId, memId) -> XMsgDel msgId (Just memId) $ toMsgScope gInfo <$> chatScopeInfo) msgMemIds mapM_ (sendGroupMessages_ user gInfo ms) events