tangled mirror of catsky-🐱 Soothing soft social-app fork with all the niche toggles! (Unofficial); for issues and PRs please put them on github:NekoDrone/catsky-social
···4import {useLingui} from '@lingui/react'
5import {useNavigation} from '@react-navigation/native'
607import {makeProfileLink} from '#/lib/routes/links'
8import {type NavigationProp} from '#/lib/routes/types'
9import {shareText, shareUrl} from '#/lib/sharing'
···12import {isWeb} from '#/platform/detection'
13import {useAgeAssurance} from '#/state/ageAssurance/useAgeAssurance'
14import {useProfileShadow} from '#/state/cache/profile-shadow'
015import {useSession} from '#/state/session'
16import {useBreakpoints} from '#/alf'
17import {useDialogControl} from '#/components/Dialog'
···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'
024import * as Menu from '#/components/Menu'
25import {useDevMode} from '#/storage/hooks/dev-mode'
26import {type ShareMenuItemsProps} from './ShareMenuItems.types'
···39 const sendViaChatControl = useDialogControl()
40 const [devModeEnabled] = useDevMode()
41 const {isAgeRestricted} = useAgeAssurance()
04243 const postUri = post.uri
44 const postCid = post.cid
···80 shareText(postAuthor.did)
81 }
820000000000000083 const copyLinkItem = (
84 <Menu.Item
85 testID="postDropdownShareBtn"
···96 <>
97 <Menu.Outer>
98 {!hideInPWI && copyLinkItem}
00000000000000000000000099100 {hasSession && !isAgeRestricted && (
101 <Menu.Item
···4import {useLingui} from '@lingui/react'
5import {useNavigation} from '@react-navigation/native'
67+import {useOpenLink} from '#/lib/hooks/useOpenLink'
8import {makeProfileLink} from '#/lib/routes/links'
9import {type NavigationProp} from '#/lib/routes/types'
10import {shareText, shareUrl} from '#/lib/sharing'
···13import {isWeb} from '#/platform/detection'
14import {useAgeAssurance} from '#/state/ageAssurance/useAgeAssurance'
15import {useProfileShadow} from '#/state/cache/profile-shadow'
16+import {useShowExternalShareButtons} from '#/state/preferences/external-share-buttons'
17import {useSession} from '#/state/session'
18import {useBreakpoints} from '#/alf'
19import {useDialogControl} from '#/components/Dialog'
···23import {Clipboard_Stroke2_Corner2_Rounded as ClipboardIcon} from '#/components/icons/Clipboard'
24import {CodeBrackets_Stroke2_Corner0_Rounded as CodeBracketsIcon} from '#/components/icons/CodeBrackets'
25import {PaperPlane_Stroke2_Corner0_Rounded as Send} from '#/components/icons/PaperPlane'
26+import {SquareArrowTopRight_Stroke2_Corner0_Rounded as ExternalIcon} from '#/components/icons/SquareArrowTopRight'
27import * as Menu from '#/components/Menu'
28import {useDevMode} from '#/storage/hooks/dev-mode'
29import {type ShareMenuItemsProps} from './ShareMenuItems.types'
···42 const sendViaChatControl = useDialogControl()
43 const [devModeEnabled] = useDevMode()
44 const {isAgeRestricted} = useAgeAssurance()
45+ const openLink = useOpenLink()
4647 const postUri = post.uri
48 const postCid = post.cid
···84 shareText(postAuthor.did)
85 }
8687+ const showExternalShareButtons = useShowExternalShareButtons()
88+ const isBridgedPost =
89+ !!post.record.bridgyOriginalUrl || !!post.record.fediverseId
90+ const originalPostUrl = (post.record.bridgyOriginalUrl ||
91+ post.record.fediverseId) as string | undefined
92+93+ const onOpenOriginalPost = () => {
94+ originalPostUrl && openLink(originalPostUrl, true)
95+ }
96+97+ const onOpenPostInPdsls = () => {
98+ openLink(`https://pdsls.dev/${post.uri}`, true)
99+ }
100+101 const copyLinkItem = (
102 <Menu.Item
103 testID="postDropdownShareBtn"
···114 <>
115 <Menu.Outer>
116 {!hideInPWI && copyLinkItem}
117+118+ {showExternalShareButtons && isBridgedPost && (
119+ <Menu.Item
120+ testID="postDropdownOpenOriginalPost"
121+ label={_(msg`Open original post`)}
122+ onPress={onOpenOriginalPost}>
123+ <Menu.ItemText>
124+ <Trans>Open original post</Trans>
125+ </Menu.ItemText>
126+ <Menu.ItemIcon icon={ExternalIcon} position="right" />
127+ </Menu.Item>
128+ )}
129+130+ {showExternalShareButtons && (
131+ <Menu.Item
132+ testID="postDropdownOpenInPdsls"
133+ label={_(msg`Open post in PDSls`)}
134+ onPress={onOpenPostInPdsls}>
135+ <Menu.ItemText>
136+ <Trans>Open post in PDSls</Trans>
137+ </Menu.ItemText>
138+ <Menu.ItemIcon icon={ExternalIcon} position="right" />
139+ </Menu.Item>
140+ )}
141142 {hasSession && !isAgeRestricted && (
143 <Menu.Item
+30
src/screens/Settings/ExperimentalSettings.tsx
···19 useDirectFetchRecords,
20 useSetDirectFetchRecords,
21} from '#/state/preferences/direct-fetch-records'
000022import * as SettingsList from '#/screens/Settings/components/SettingsList'
23import {atoms as a} from '#/alf'
24import {Admonition} from '#/components/Admonition'
25import * as Toggle from '#/components/forms/Toggle'
26import {Atom_Stroke2_Corner0_Rounded as ExperimentalIcon} from '#/components/icons/Atom'
027import {Eye_Stroke2_Corner0_Rounded as VisibilityIcon} from '#/components/icons/Eye'
28import {PaintRoller_Stroke2_Corner2_Rounded as PaintRollerIcon} from '#/components/icons/PaintRoller'
29import * as Layout from '#/components/Layout'
···4142 const directFetchRecords = useDirectFetchRecords()
43 const setDirectFetchRecords = useSetDirectFetchRecords()
0004445 const [gates, setGatesView] = useState(Object.fromEntries(useGatesCache()))
46 const dangerousSetGate = useDangerousSetGate()
···116 <Toggle.LabelText style={[a.flex_1]}>
117 <Trans>
118 TODO: Fall back to constellation api to find blocked replies
0000000000000000000000119 </Trans>
120 </Toggle.LabelText>
121 <Toggle.Platform />
···19 useDirectFetchRecords,
20 useSetDirectFetchRecords,
21} from '#/state/preferences/direct-fetch-records'
22+import {
23+ useSetShowExternalShareButtons,
24+ useShowExternalShareButtons,
25+} from '#/state/preferences/external-share-buttons'
26import * as SettingsList from '#/screens/Settings/components/SettingsList'
27import {atoms as a} from '#/alf'
28import {Admonition} from '#/components/Admonition'
29import * as Toggle from '#/components/forms/Toggle'
30import {Atom_Stroke2_Corner0_Rounded as ExperimentalIcon} from '#/components/icons/Atom'
31+import {ChainLink_Stroke2_Corner0_Rounded as ChainLinkIcon} from '#/components/icons/ChainLink'
32import {Eye_Stroke2_Corner0_Rounded as VisibilityIcon} from '#/components/icons/Eye'
33import {PaintRoller_Stroke2_Corner2_Rounded as PaintRollerIcon} from '#/components/icons/PaintRoller'
34import * as Layout from '#/components/Layout'
···4647 const directFetchRecords = useDirectFetchRecords()
48 const setDirectFetchRecords = useSetDirectFetchRecords()
49+50+ const showExternalShareButtons = useShowExternalShareButtons()
51+ const setShowExternalShareButtons = useSetShowExternalShareButtons()
5253 const [gates, setGatesView] = useState(Object.fromEntries(useGatesCache()))
54 const dangerousSetGate = useDangerousSetGate()
···124 <Toggle.LabelText style={[a.flex_1]}>
125 <Trans>
126 TODO: Fall back to constellation api to find blocked replies
127+ </Trans>
128+ </Toggle.LabelText>
129+ <Toggle.Platform />
130+ </Toggle.Item>
131+ </SettingsList.Group>
132+133+ <SettingsList.Group contentContainerStyle={[a.gap_sm]}>
134+ <SettingsList.ItemIcon icon={ChainLinkIcon} />
135+ <SettingsList.ItemText>
136+ <Trans>Bridging and Fediverse</Trans>
137+ </SettingsList.ItemText>
138+ <Toggle.Item
139+ name="external_share_buttons"
140+ label={_(
141+ msg`Show "Open original post" and "Open post in PDSls" buttons`,
142+ )}
143+ value={showExternalShareButtons}
144+ onChange={value => setShowExternalShareButtons(value)}
145+ style={[a.w_full]}>
146+ <Toggle.LabelText style={[a.flex_1]}>
147+ <Trans>
148+ Show "Open original post" and "Open post in PDSls" buttons
149 </Trans>
150 </Toggle.LabelText>
151 <Toggle.Platform />