Update chat menu styles and options (#10455)

This commit is contained in:
DS Boyce
2026-05-12 12:53:47 -07:00
committed by GitHub
parent f0fec7a9da
commit a8debddd08
+46 -41
View File
@@ -1,9 +1,7 @@
import {memo, useCallback} from 'react' import {memo, useCallback} from 'react'
import {Keyboard, View} from 'react-native' import {Keyboard, View} from 'react-native'
import {type ChatBskyConvoDefs, type ModerationCause} from '@atproto/api' import {ChatBskyConvoDefs, type ModerationCause} from '@atproto/api'
import {msg} from '@lingui/core/macro' import {Trans, useLingui} from '@lingui/react/macro'
import {useLingui} from '@lingui/react'
import {Trans} from '@lingui/react/macro'
import {useNavigation} from '@react-navigation/native' import {useNavigation} from '@react-navigation/native'
import {useQueryClient} from '@tanstack/react-query' import {useQueryClient} from '@tanstack/react-query'
@@ -66,7 +64,7 @@ let ConvoMenu = ({
latestReportableMessage?: ChatBskyConvoDefs.MessageView latestReportableMessage?: ChatBskyConvoDefs.MessageView
style?: ViewStyleProp['style'] style?: ViewStyleProp['style']
}): React.ReactNode => { }): React.ReactNode => {
const {_} = useLingui() const {t: l} = useLingui()
const queryClient = useQueryClient() const queryClient = useQueryClient()
const leaveConvoControl = Prompt.usePromptControl() const leaveConvoControl = Prompt.usePromptControl()
@@ -81,7 +79,7 @@ let ConvoMenu = ({
<Menu.Root control={control}> <Menu.Root control={control}>
{!hideTrigger && ( {!hideTrigger && (
<View style={[style]}> <View style={[style]}>
<Menu.Trigger label={_(msg`Chat settings`)}> <Menu.Trigger label={l`Chat settings`}>
{({props}) => ( {({props}) => (
<Button <Button
label={props.accessibilityLabel} label={props.accessibilityLabel}
@@ -114,7 +112,6 @@ let ConvoMenu = ({
/> />
</Menu.Outer> </Menu.Outer>
</Menu.Root> </Menu.Root>
<LeaveConvoPrompt <LeaveConvoPrompt
control={leaveConvoControl} control={leaveConvoControl}
convoId={convo.id} convoId={convo.id}
@@ -151,7 +148,6 @@ let ConvoMenu = ({
) : ( ) : (
<ReportConversationPrompt control={reportControl} /> <ReportConversationPrompt control={reportControl} />
)} )}
<BlockedByListDialog <BlockedByListDialog
control={blockedByListControl} control={blockedByListControl}
listBlocks={listBlocks} listBlocks={listBlocks}
@@ -182,12 +178,13 @@ function MenuContent({
blockedByListControl: Prompt.PromptControlProps blockedByListControl: Prompt.PromptControlProps
}) { }) {
const navigation = useNavigation<NavigationProp>() const navigation = useNavigation<NavigationProp>()
const {_} = useLingui() const {t: l} = useLingui()
const {mutate: markAsRead} = useMarkAsReadMutation() const {mutate: markAsRead} = useMarkAsReadMutation()
const {listBlocks, userBlock} = blockInfo const {listBlocks, userBlock} = blockInfo
const isBlocking = userBlock || !!listBlocks.length const isBlocking = userBlock || !!listBlocks.length
const isDeletedAccount = profile.handle === 'missing.invalid' const isDeletedAccount = profile.handle === 'missing.invalid'
const isGroupConvo = ChatBskyConvoDefs.isGroupConvo(initialConvo.kind)
const convoId = initialConvo.id const convoId = initialConvo.id
const {data: convo} = useConvoQuery({convoId}) const {data: convo} = useConvoQuery({convoId})
@@ -199,13 +196,13 @@ function MenuContent({
const {mutate: muteConvo} = useMuteConvo(convoId, { const {mutate: muteConvo} = useMuteConvo(convoId, {
onSuccess: data => { onSuccess: data => {
if (data.convo.muted) { if (data.convo.muted) {
Toast.show(_(msg({message: 'Chat muted', context: 'toast'}))) Toast.show(l({message: 'Chat muted', context: 'toast'}))
} else { } else {
Toast.show(_(msg({message: 'Chat unmuted', context: 'toast'}))) Toast.show(l({message: 'Chat unmuted', context: 'toast'}))
} }
}, },
onError: () => { onError: () => {
Toast.show(_(msg`Could not mute chat`), { Toast.show(l`Could not mute chat`, {
type: 'error', type: 'error',
}) })
}, },
@@ -228,37 +225,41 @@ function MenuContent({
return isDeletedAccount ? ( return isDeletedAccount ? (
<Menu.Item <Menu.Item
label={_(msg`Leave conversation`)} destructive
onPress={() => leaveConvoControl.open()}> label={l`Leave conversation`}
onPress={leaveConvoControl.open}>
<Menu.ItemIcon icon={ArrowBoxLeftIcon} />
<Menu.ItemText> <Menu.ItemText>
<Trans>Leave conversation</Trans> <Trans>Leave conversation</Trans>
</Menu.ItemText> </Menu.ItemText>
<Menu.ItemIcon icon={ArrowBoxLeftIcon} />
</Menu.Item> </Menu.Item>
) : ( ) : (
<> <>
<Menu.Group> <Menu.Group>
{showMarkAsRead && ( {showMarkAsRead && (
<Menu.Item <Menu.Item
label={_(msg`Mark as read`)} label={l`Mark as read`}
onPress={() => markAsRead({convoId})}> onPress={() => markAsRead({convoId})}>
<Menu.ItemIcon icon={BubbleIcon} />
<Menu.ItemText> <Menu.ItemText>
<Trans>Mark as read</Trans> <Trans>Mark as read</Trans>
</Menu.ItemText> </Menu.ItemText>
<Menu.ItemIcon icon={BubbleIcon} /> </Menu.Item>
)}
{isGroupConvo ? null : (
<Menu.Item
label={l`Go to user's profile`}
onPress={onNavigateToProfile}>
<Menu.ItemIcon icon={Person} />
<Menu.ItemText>
<Trans>Go to profile</Trans>
</Menu.ItemText>
</Menu.Item> </Menu.Item>
)} )}
<Menu.Item <Menu.Item
label={_(msg`Go to user's profile`)} label={l`Mute conversation`}
onPress={onNavigateToProfile}>
<Menu.ItemText>
<Trans>Go to profile</Trans>
</Menu.ItemText>
<Menu.ItemIcon icon={Person} />
</Menu.Item>
<Menu.Item
label={_(msg`Mute conversation`)}
onPress={() => muteConvo({mute: !convo?.muted})}> onPress={() => muteConvo({mute: !convo?.muted})}>
<Menu.ItemIcon icon={convo?.muted ? Unmute : Mute} />
<Menu.ItemText> <Menu.ItemText>
{convo?.muted ? ( {convo?.muted ? (
<Trans>Unmute conversation</Trans> <Trans>Unmute conversation</Trans>
@@ -266,37 +267,41 @@ function MenuContent({
<Trans>Mute conversation</Trans> <Trans>Mute conversation</Trans>
)} )}
</Menu.ItemText> </Menu.ItemText>
<Menu.ItemIcon icon={convo?.muted ? Unmute : Mute} />
</Menu.Item> </Menu.Item>
</Menu.Group> </Menu.Group>
<Menu.Divider /> <Menu.Divider />
<Menu.Group> <Menu.Group>
{isGroupConvo ? null : (
<Menu.Item
destructive
label={isBlocking ? l`Unblock account` : l`Block account`}
onPress={toggleBlock}>
<Menu.ItemIcon icon={isBlocking ? PersonCheck : PersonX} />
<Menu.ItemText>
{isBlocking ? l`Unblock account` : l`Block account`}
</Menu.ItemText>
</Menu.Item>
)}
<Menu.Item <Menu.Item
label={isBlocking ? _(msg`Unblock account`) : _(msg`Block account`)} destructive
onPress={toggleBlock}> label={l`Report conversation`}
<Menu.ItemText> onPress={reportControl.open}>
{isBlocking ? _(msg`Unblock account`) : _(msg`Block account`)} <Menu.ItemIcon icon={Flag} />
</Menu.ItemText>
<Menu.ItemIcon icon={isBlocking ? PersonCheck : PersonX} />
</Menu.Item>
<Menu.Item
label={_(msg`Report conversation`)}
onPress={() => reportControl.open()}>
<Menu.ItemText> <Menu.ItemText>
<Trans>Report conversation</Trans> <Trans>Report conversation</Trans>
</Menu.ItemText> </Menu.ItemText>
<Menu.ItemIcon icon={Flag} />
</Menu.Item> </Menu.Item>
</Menu.Group> </Menu.Group>
<Menu.Divider /> <Menu.Divider />
<Menu.Group> <Menu.Group>
<Menu.Item <Menu.Item
label={_(msg`Leave conversation`)} destructive
onPress={() => leaveConvoControl.open()}> label={l`Leave conversation`}
onPress={leaveConvoControl.open}>
<Menu.ItemIcon icon={ArrowBoxLeftIcon} />
<Menu.ItemText> <Menu.ItemText>
<Trans>Leave conversation</Trans> <Trans>Leave conversation</Trans>
</Menu.ItemText> </Menu.ItemText>
<Menu.ItemIcon icon={ArrowBoxLeftIcon} />
</Menu.Item> </Menu.Item>
</Menu.Group> </Menu.Group>
</> </>