import React from 'react' import {LayoutAnimation, Pressable, View} from 'react-native' import * as Clipboard from 'expo-clipboard' import {ChatBskyConvoDefs, RichText} from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {richTextToString} from '#/lib/strings/rich-text-helpers' import {isWeb} from 'platform/detection' import {useConvoActive} from 'state/messages/convo' import {useSession} from 'state/session' import * as Toast from '#/view/com/util/Toast' import {atoms as a, useTheme} from '#/alf' import {ReportDialog} from '#/components/dms/ReportDialog' import {DotGrid_Stroke2_Corner0_Rounded as DotsHorizontal} from '#/components/icons/DotGrid' import {Trash_Stroke2_Corner0_Rounded as Trash} from '#/components/icons/Trash' import {Warning_Stroke2_Corner0_Rounded as Warning} from '#/components/icons/Warning' import * as Menu from '#/components/Menu' import * as Prompt from '#/components/Prompt' import {usePromptControl} from '#/components/Prompt' import {Clipboard_Stroke2_Corner2_Rounded as ClipboardIcon} from '../icons/Clipboard' export let MessageMenu = ({ message, control, triggerOpacity, }: { triggerOpacity?: number message: ChatBskyConvoDefs.MessageView control: Menu.MenuControlProps }): React.ReactNode => { const {_} = useLingui() const t = useTheme() const {currentAccount} = useSession() const convo = useConvoActive() const deleteControl = usePromptControl() const reportControl = usePromptControl() const isFromSelf = message.sender?.did === currentAccount?.did const onCopyPostText = React.useCallback(() => { const str = richTextToString( new RichText({ text: message.text, facets: message.facets, }), true, ) Clipboard.setStringAsync(str) Toast.show(_(msg`Copied to clipboard`)) }, [_, message.text, message.facets]) const onDelete = React.useCallback(() => { LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) convo .deleteMessage(message.id) .then(() => Toast.show(_(msg`Message deleted`))) .catch(() => Toast.show(_(msg`Failed to delete message`))) }, [_, convo, message.id]) return ( <> {isWeb && ( {({props, state}) => ( )} )} {_(msg`Copy message text`)} {_(msg`Delete for me`)} {!isFromSelf && ( {_(msg`Report`)} )} ) } MessageMenu = React.memo(MessageMenu)