core, ios: allow moderators to delete messages and block members (#6064)

* core: allow moderators to delete messages and block members

* ios: moderator
This commit is contained in:
Evgeny
2025-07-14 08:02:29 +01:00
committed by GitHub
parent caf3d55af8
commit dd3943d994
5 changed files with 10 additions and 11 deletions
@@ -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)
}
@@ -180,7 +180,7 @@ struct GroupMemberInfoView: View {
}
}
if groupInfo.membership.memberRole >= .admin {
if groupInfo.membership.memberRole >= .moderator {
adminDestructiveSection(member)
} else {
nonAdminBlockSection(member)
@@ -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
}
}
+4 -4
View File
@@ -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
}
}
+2 -3
View File
@@ -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