Disable group convos when owner has chats disabled
Show a compact "owner suspended" footer in place of the composer when a group's owner has been chat-disabled. Self-disabled state is unchanged (still shows ChatDisabled with the appeal flow). Closes APP-2216 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -49,6 +49,7 @@ import {ChatDisabled} from './components/ChatDisabled'
|
||||
import {ChatEnded} from './components/ChatEnded'
|
||||
import {ChatLocked} from './components/ChatLocked'
|
||||
import {RequestStatus} from './components/RequestStatus'
|
||||
import {GroupOwnerChatDisabled} from './components/GroupOwnerChatDisabled'
|
||||
|
||||
type Props = NativeStackScreenProps<
|
||||
CommonNavigatorParams,
|
||||
@@ -250,7 +251,9 @@ function InnerReady({
|
||||
/>
|
||||
)
|
||||
} else if (convo?.kind === 'group') {
|
||||
if (convo.details.lockStatus === 'locked') {
|
||||
if (convo.primaryMember?.chatDisabled) {
|
||||
footer = <GroupOwnerChatDisabled convo={convo} />
|
||||
} else if (convo.details.lockStatus === 'locked') {
|
||||
footer = <ChatLocked convo={convo} />
|
||||
} else if (convo.details.lockStatus === 'locked-permanently') {
|
||||
footer = <ChatEnded convo={convo} />
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
import {Pressable} from 'react-native'
|
||||
import {Trans, useLingui} from '@lingui/react/macro'
|
||||
import {StackActions, useNavigation} from '@react-navigation/native'
|
||||
|
||||
import {HITSLOP_10} from '#/lib/constants'
|
||||
import {type NavigationProp} from '#/lib/routes/types'
|
||||
import {logger} from '#/logger'
|
||||
import {useLeaveConvo} from '#/state/queries/messages/leave-conversation'
|
||||
import {atoms as a, useTheme} from '#/alf'
|
||||
import {type ConvoWithDetails} from '#/components/dms/util'
|
||||
import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning'
|
||||
import * as Prompt from '#/components/Prompt'
|
||||
import * as Toast from '#/components/Toast'
|
||||
import {Text} from '#/components/Typography'
|
||||
import {LeaveChatPrompt} from '../ConversationSettings/prompts'
|
||||
import {ChatFooter} from './ChatFooter'
|
||||
|
||||
export function GroupOwnerChatDisabled({
|
||||
convo,
|
||||
}: {
|
||||
convo: Extract<ConvoWithDetails, {kind: 'group'}>
|
||||
}) {
|
||||
const t = useTheme()
|
||||
const {t: l} = useLingui()
|
||||
|
||||
const leaveChatPrompt = Prompt.usePromptControl()
|
||||
const navigation = useNavigation<NavigationProp>()
|
||||
|
||||
const {mutate: leaveConvo} = useLeaveConvo(convo.view.id, {
|
||||
onSuccess: () => {
|
||||
navigation.dispatch(StackActions.pop(2))
|
||||
},
|
||||
onError: e => {
|
||||
logger.error('Failed to leave group chat', {message: e})
|
||||
Toast.show(l({message: 'Failed to leave group chat', context: 'toast'}), {
|
||||
type: 'error',
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
return (
|
||||
<ChatFooter
|
||||
heading={l`This chat is unavailable`}
|
||||
subheading={l`The group owner has been suspended`}
|
||||
icon={WarningIcon}>
|
||||
<Pressable
|
||||
accessibilityRole="button"
|
||||
hitSlop={HITSLOP_10}
|
||||
style={[a.mx_md]}
|
||||
onPress={leaveChatPrompt.open}>
|
||||
<Text
|
||||
numberOfLines={1}
|
||||
style={[
|
||||
a.text_sm,
|
||||
a.font_semi_bold,
|
||||
a.leading_snug,
|
||||
{
|
||||
color: t.palette.negative_500,
|
||||
},
|
||||
]}>
|
||||
<Trans>Leave chat</Trans>
|
||||
</Text>
|
||||
</Pressable>
|
||||
<LeaveChatPrompt
|
||||
control={leaveChatPrompt}
|
||||
groupName={convo.details.name}
|
||||
onConfirm={leaveConvo}
|
||||
/>
|
||||
</ChatFooter>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user