Integrate more group chat settings (#10253)
This commit is contained in:
@@ -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 won’t be able to rejoin unless you’re invited.`}
|
||||||
|
confirmButtonCta={l`Leave group chat`}
|
||||||
|
confirmButtonColor="negative"
|
||||||
|
cancelButtonCta={l`Cancel`}
|
||||||
|
onConfirm={onConfirm}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
function BlockMemberPrompt({
|
function BlockMemberPrompt({
|
||||||
control,
|
control,
|
||||||
onConfirm,
|
onConfirm,
|
||||||
|
|||||||
Reference in New Issue
Block a user