Integrate more group chat settings (#10253)

This commit is contained in:
DS Boyce
2026-04-16 10:15:59 -07:00
committed by GitHub
parent f51602b3fe
commit a9e170b6d0
+56 -13
View File
@@ -3,7 +3,7 @@ import {Pressable, type StyleProp, View, type ViewStyle} from 'react-native'
import {type ChatBskyConvoDefs, moderateProfile} from '@atproto/api' import {type ChatBskyConvoDefs, moderateProfile} from '@atproto/api'
import {plural} from '@lingui/core/macro' import {plural} from '@lingui/core/macro'
import {Trans, useLingui} from '@lingui/react/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {StackActions, useNavigation} from '@react-navigation/native'
import {useBottomBarOffset} from '#/lib/hooks/useBottomBarOffset' import {useBottomBarOffset} from '#/lib/hooks/useBottomBarOffset'
import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender' import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender'
@@ -22,6 +22,7 @@ import {ConvoStatus} from '#/state/messages/convo/types'
import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useGetConvoAvailabilityQuery} from '#/state/queries/messages/get-convo-availability' import {useGetConvoAvailabilityQuery} from '#/state/queries/messages/get-convo-availability'
import {useGetConvoForMembers} from '#/state/queries/messages/get-convo-for-members' import {useGetConvoForMembers} from '#/state/queries/messages/get-convo-for-members'
import {useLeaveConvo} from '#/state/queries/messages/leave-conversation'
import {useMuteConvo} from '#/state/queries/messages/mute-conversation' import {useMuteConvo} from '#/state/queries/messages/mute-conversation'
import {useProfileBlockMutationQueue} from '#/state/queries/profile' import {useProfileBlockMutationQueue} from '#/state/queries/profile'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
@@ -186,9 +187,7 @@ function SettingsInner() {
return ( return (
<List <List
data={items} data={items}
contentContainerStyle={ contentContainerStyle={{paddingBottom: bottomBarOffset + ROW_SPACING}}
IS_NATIVE && {paddingBottom: bottomBarOffset + ROW_SPACING}
}
desktopFixedHeight desktopFixedHeight
initialNumToRender={initialNumToRender} initialNumToRender={initialNumToRender}
keyExtractor={keyExtractor} keyExtractor={keyExtractor}
@@ -670,6 +669,7 @@ function SettingsHeader({
const t = useTheme() const t = useTheme()
const {t: l} = useLingui() const {t: l} = useLingui()
const navigation = useNavigation<NavigationProp>()
const convoState = useConvo() const convoState = useConvo()
const {currentAccount} = useSession() const {currentAccount} = useSession()
@@ -686,8 +686,21 @@ function SettingsHeader({
Toast.show(l({message: 'Group chat unmuted', context: 'toast'})) Toast.show(l({message: 'Group chat unmuted', context: 'toast'}))
} }
}, },
onError: () => { onError: e => {
Toast.show(l`Could not mute group chat`, { logger.error('Failed to mute group chat', {message: e})
Toast.show(l`Failed to mute group chat`, {
type: 'error',
})
},
})
const {mutate: leaveConvo} = useLeaveConvo(convo.id, {
onMutate: () => {
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', type: 'error',
}) })
}, },
@@ -696,6 +709,7 @@ function SettingsHeader({
const editNamePrompt = Prompt.usePromptControl() const editNamePrompt = Prompt.usePromptControl()
const inviteLinkPrompt = Prompt.usePromptControl() const inviteLinkPrompt = Prompt.usePromptControl()
const lockChatPrompt = Prompt.usePromptControl() const lockChatPrompt = Prompt.usePromptControl()
const leaveChatPrompt = Prompt.usePromptControl()
const [groupName, setGroupName] = useState( const [groupName, setGroupName] = useState(
convoState.getGroupInfo?.()?.name ?? '', convoState.getGroupInfo?.()?.name ?? '',
@@ -705,15 +719,15 @@ function SettingsHeader({
const [isLocked, setIsLocked] = useState(false) const [isLocked, setIsLocked] = useState(false)
const handleToggleMute = () => { const handleToggleMute = () => {
try {
muteConvo({mute: !convo?.muted}) muteConvo({mute: !convo?.muted})
} catch (err) {
const e = err as Error
logger.error('Failed to mute group chat', {message: e})
Toast.show(l`There was an issue! ${e.toString()}`, {type: 'error'})
} }
const handleLeaveChat = () => {
leaveChatPrompt.open()
} }
const handleReportChat = () => {}
const handlePromptName = () => { const handlePromptName = () => {
editNamePrompt.open() editNamePrompt.open()
} }
@@ -818,7 +832,7 @@ function SettingsHeader({
icon={FlagIcon} icon={FlagIcon}
label={l`Report this group chat`} label={l`Report this group chat`}
text={l`Report`} text={l`Report`}
onPress={() => {}} onPress={handleReportChat}
/> />
)} )}
{isOwner ? null : ( {isOwner ? null : (
@@ -827,7 +841,7 @@ function SettingsHeader({
icon={ArrowBoxLeftIcon} icon={ArrowBoxLeftIcon}
label={l`Leave this group chat`} label={l`Leave this group chat`}
text={l`Leave`} text={l`Leave`}
onPress={() => {}} onPress={handleLeaveChat}
/> />
)} )}
</View> </View>
@@ -843,6 +857,11 @@ function SettingsHeader({
onConfirm={handleConfirmInviteLink} onConfirm={handleConfirmInviteLink}
/> />
<LockChatPrompt control={lockChatPrompt} onConfirm={handleConfirmLock} /> <LockChatPrompt control={lockChatPrompt} onConfirm={handleConfirmLock} />
<LeaveChatPrompt
control={leaveChatPrompt}
groupName={groupName}
onConfirm={leaveConvo}
/>
</> </>
) )
} }
@@ -1042,6 +1061,30 @@ function LockChatPrompt({
) )
} }
function LeaveChatPrompt({
control,
groupName,
onConfirm,
}: {
control: Dialog.DialogOuterProps['control']
groupName: string
onConfirm: () => void
}) {
const {t: l} = useLingui()
return (
<Prompt.Basic
control={control}
title={l`Are you sure you want to leave ${groupName}?`}
description={l`You wont be able to rejoin unless youre invited.`}
confirmButtonCta={l`Leave group chat`}
confirmButtonColor="negative"
cancelButtonCta={l`Cancel`}
onConfirm={onConfirm}
/>
)
}
function BlockMemberPrompt({ function BlockMemberPrompt({
control, control,
onConfirm, onConfirm,