diff --git a/src/screens/Messages/ConversationSettings/index.tsx b/src/screens/Messages/ConversationSettings/index.tsx index 661c197d8c..32430cfc0c 100644 --- a/src/screens/Messages/ConversationSettings/index.tsx +++ b/src/screens/Messages/ConversationSettings/index.tsx @@ -3,6 +3,7 @@ import {Pressable, View} from 'react-native' import { ChatBskyActorDefs, ChatBskyConvoDefs, + ChatBskyConvoUnlockConvo, type ModerationOpts, } from '@atproto/api' import {Trans, useLingui} from '@lingui/react/macro' @@ -417,6 +418,12 @@ function SettingsHeader({ if (lock) { logger.error('Failed to lock group chat', {message: e}) Toast.show(l`Failed to lock group chat`, {type: 'error'}) + } else if ( + e instanceof ChatBskyConvoUnlockConvo.ConvoLockedByModerationError + ) { + Toast.show(l`This chat is locked by a moderation action`, { + type: 'error', + }) } else { logger.error('Failed to unlock group chat', {message: e}) Toast.show(l`Failed to unlock group chat`, {type: 'error'}) @@ -447,7 +454,11 @@ function SettingsHeader({ const createdAt = new Date(convo.details.createdAt) - const canLockGroupChat = isOwner && lockStatus !== 'locked-permanently' + // A lock forced by a moderation action cannot be undone by the owner. + const canLockGroupChat = + isOwner && + lockStatus !== 'locked-permanently' && + !convo.details.lockStatusModerationOverride const groupNameComponent = ( - + {subheading ? ( { Toast.show(l({message: 'Group chat unlocked', context: 'toast'})) }, onError: e => { + if (e instanceof ChatBskyConvoUnlockConvo.ConvoLockedByModerationError) { + Toast.show(l`This chat is locked by a moderation action`, { + type: 'error', + }) + return + } logger.error('Failed to unlock group chat', {message: e}) Toast.show(l`Failed to unlock group chat`, {type: 'error'}) }, @@ -59,10 +68,14 @@ export function ChatLocked({ return ( {isOwner ? ( - <> + isModerationLock ? null : ( Unlock chat - + ) ) : ( <> { if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) { return { ...convo, - kind: {...convo.kind, lockStatus: 'unlocked'}, + kind: { + ...convo.kind, + lockStatus: 'unlocked', + // An unlocked convo cannot be moderation-locked. + lockStatusModerationOverride: false, + }, rev: log.rev, } }