mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-05-16 18:46:04 +00:00
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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user