mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
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}