mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at samuel/exp-cli 181 lines 5.7 kB view raw
1import {memo, useMemo} from 'react' 2import {AtUri} from '@atproto/api' 3import {msg, Trans} from '@lingui/macro' 4import {useLingui} from '@lingui/react' 5import {useNavigation} from '@react-navigation/native' 6import type React from 'react' 7 8import {makeProfileLink} from '#/lib/routes/links' 9import {type NavigationProp} from '#/lib/routes/types' 10import {shareText, shareUrl} from '#/lib/sharing' 11import {toShareUrl} from '#/lib/strings/url-helpers' 12import {logger} from '#/logger' 13import {isWeb} from '#/platform/detection' 14import {useProfileShadow} from '#/state/cache/profile-shadow' 15import {useSession} from '#/state/session' 16import {useBreakpoints} from '#/alf' 17import {useDialogControl} from '#/components/Dialog' 18import {EmbedDialog} from '#/components/dialogs/Embed' 19import {SendViaChatDialog} from '#/components/dms/dialogs/ShareViaChatDialog' 20import {ChainLink_Stroke2_Corner0_Rounded as ChainLinkIcon} from '#/components/icons/ChainLink' 21import {Clipboard_Stroke2_Corner2_Rounded as ClipboardIcon} from '#/components/icons/Clipboard' 22import {CodeBrackets_Stroke2_Corner0_Rounded as CodeBracketsIcon} from '#/components/icons/CodeBrackets' 23import {PaperPlane_Stroke2_Corner0_Rounded as Send} from '#/components/icons/PaperPlane' 24import * as Menu from '#/components/Menu' 25import {useDevMode} from '#/storage/hooks/dev-mode' 26import {type ShareMenuItemsProps} from './ShareMenuItems.types' 27 28let ShareMenuItems = ({ 29 post, 30 record, 31 timestamp, 32 onShare: onShareProp, 33}: ShareMenuItemsProps): React.ReactNode => { 34 const {hasSession} = useSession() 35 const {gtMobile} = useBreakpoints() 36 const {_} = useLingui() 37 const navigation = useNavigation<NavigationProp>() 38 const embedPostControl = useDialogControl() 39 const sendViaChatControl = useDialogControl() 40 const [devModeEnabled] = useDevMode() 41 42 const postUri = post.uri 43 const postCid = post.cid 44 const postAuthor = useProfileShadow(post.author) 45 46 const href = useMemo(() => { 47 const urip = new AtUri(postUri) 48 return makeProfileLink(postAuthor, 'post', urip.rkey) 49 }, [postUri, postAuthor]) 50 51 const hideInPWI = useMemo(() => { 52 return !!postAuthor.labels?.find( 53 label => label.val === '!no-unauthenticated', 54 ) 55 }, [postAuthor]) 56 57 const onCopyLink = () => { 58 logger.metric('share:press:copyLink', {}, {statsig: true}) 59 const url = toShareUrl(href) 60 shareUrl(url) 61 onShareProp() 62 } 63 64 const onSelectChatToShareTo = (conversation: string) => { 65 logger.metric('share:press:dmSelected', {}, {statsig: true}) 66 navigation.navigate('MessagesConversation', { 67 conversation, 68 embed: postUri, 69 }) 70 } 71 72 const canEmbed = isWeb && gtMobile && !hideInPWI 73 74 const onShareATURI = () => { 75 shareText(postUri) 76 } 77 78 const onShareAuthorDID = () => { 79 shareText(postAuthor.did) 80 } 81 82 const copyLinkItem = ( 83 <Menu.Item 84 testID="postDropdownShareBtn" 85 label={_(msg`Copy link to post`)} 86 onPress={onCopyLink}> 87 <Menu.ItemText> 88 <Trans>Copy link to post</Trans> 89 </Menu.ItemText> 90 <Menu.ItemIcon icon={ChainLinkIcon} position="right" /> 91 </Menu.Item> 92 ) 93 94 return ( 95 <> 96 <Menu.Outer> 97 {!hideInPWI && copyLinkItem} 98 99 {hasSession && ( 100 <Menu.Item 101 testID="postDropdownSendViaDMBtn" 102 label={_(msg`Send via direct message`)} 103 onPress={() => { 104 logger.metric('share:press:openDmSearch', {}, {statsig: true}) 105 sendViaChatControl.open() 106 }}> 107 <Menu.ItemText> 108 <Trans>Send via direct message</Trans> 109 </Menu.ItemText> 110 <Menu.ItemIcon icon={Send} position="right" /> 111 </Menu.Item> 112 )} 113 114 {canEmbed && ( 115 <Menu.Item 116 testID="postDropdownEmbedBtn" 117 label={_(msg`Embed post`)} 118 onPress={() => { 119 logger.metric('share:press:embed', {}, {statsig: true}) 120 embedPostControl.open() 121 }}> 122 <Menu.ItemText>{_(msg`Embed post`)}</Menu.ItemText> 123 <Menu.ItemIcon icon={CodeBracketsIcon} position="right" /> 124 </Menu.Item> 125 )} 126 127 {hideInPWI && ( 128 <> 129 {hasSession && <Menu.Divider />} 130 {copyLinkItem} 131 <Menu.LabelText style={{maxWidth: 220}}> 132 <Trans>Note: This post is only visible to logged-in users.</Trans> 133 </Menu.LabelText> 134 </> 135 )} 136 137 {devModeEnabled && ( 138 <> 139 <Menu.Divider /> 140 <Menu.Item 141 testID="postAtUriShareBtn" 142 label={_(msg`Copy post at:// URI`)} 143 onPress={onShareATURI}> 144 <Menu.ItemText> 145 <Trans>Copy post at:// URI</Trans> 146 </Menu.ItemText> 147 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 148 </Menu.Item> 149 <Menu.Item 150 testID="postAuthorDIDShareBtn" 151 label={_(msg`Copy author DID`)} 152 onPress={onShareAuthorDID}> 153 <Menu.ItemText> 154 <Trans>Copy author DID</Trans> 155 </Menu.ItemText> 156 <Menu.ItemIcon icon={ClipboardIcon} position="right" /> 157 </Menu.Item> 158 </> 159 )} 160 </Menu.Outer> 161 162 {canEmbed && ( 163 <EmbedDialog 164 control={embedPostControl} 165 postCid={postCid} 166 postUri={postUri} 167 record={record} 168 postAuthor={postAuthor} 169 timestamp={timestamp} 170 /> 171 )} 172 173 <SendViaChatDialog 174 control={sendViaChatControl} 175 onSelectChat={onSelectChatToShareTo} 176 /> 177 </> 178 ) 179} 180ShareMenuItems = memo(ShareMenuItems) 181export {ShareMenuItems}