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,
}
}