fork
Configure Feed
Select the types of activity you want to include in your feed.
mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
fork
Configure Feed
Select the types of activity you want to include in your feed.
1import React, {useCallback} from 'react'
2import {StyleProp, View, ViewStyle} from 'react-native'
3import {Image} from 'expo-image'
4import {AppBskyEmbedExternal} from '@atproto/api'
5import {msg} from '@lingui/macro'
6import {useLingui} from '@lingui/react'
7
8import {usePalette} from 'lib/hooks/usePalette'
9import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
10import {shareUrl} from 'lib/sharing'
11import {parseEmbedPlayerFromUrl} from 'lib/strings/embed-player'
12import {
13 getStarterPackOgCard,
14 parseStarterPackUri,
15} from 'lib/strings/starter-pack'
16import {toNiceDomain} from 'lib/strings/url-helpers'
17import {isNative} from 'platform/detection'
18import {useExternalEmbedsPrefs} from 'state/preferences'
19import {Link} from 'view/com/util/Link'
20import {ExternalGifEmbed} from 'view/com/util/post-embeds/ExternalGifEmbed'
21import {ExternalPlayer} from 'view/com/util/post-embeds/ExternalPlayerEmbed'
22import {GifEmbed} from 'view/com/util/post-embeds/GifEmbed'
23import {atoms as a, useTheme} from '#/alf'
24import {Text} from '../text/Text'
25
26export const ExternalLinkEmbed = ({
27 link,
28 onOpen,
29 style,
30 hideAlt,
31}: {
32 link: AppBskyEmbedExternal.ViewExternal
33 onOpen?: () => void
34 style?: StyleProp<ViewStyle>
35 hideAlt?: boolean
36}) => {
37 const {_} = useLingui()
38 const pal = usePalette('default')
39 const {isMobile} = useWebMediaQueries()
40 const externalEmbedPrefs = useExternalEmbedsPrefs()
41
42 const starterPackParsed = parseStarterPackUri(link.uri)
43 const imageUri = starterPackParsed
44 ? getStarterPackOgCard(starterPackParsed.name, starterPackParsed.rkey)
45 : link.thumb
46
47 const embedPlayerParams = React.useMemo(() => {
48 const params = parseEmbedPlayerFromUrl(link.uri)
49
50 if (params && externalEmbedPrefs?.[params.source] !== 'hide') {
51 return params
52 }
53 }, [link.uri, externalEmbedPrefs])
54
55 if (embedPlayerParams?.source === 'tenor') {
56 return <GifEmbed params={embedPlayerParams} link={link} hideAlt={hideAlt} />
57 }
58
59 return (
60 <View style={[a.flex_col, a.rounded_sm, a.overflow_hidden]}>
61 <LinkWrapper link={link} onOpen={onOpen} style={style}>
62 {imageUri && !embedPlayerParams ? (
63 <Image
64 style={{
65 aspectRatio: 1.91,
66 borderTopRightRadius: 6,
67 borderTopLeftRadius: 6,
68 }}
69 source={{uri: imageUri}}
70 accessibilityIgnoresInvertColors
71 accessibilityLabel={starterPackParsed ? link.title : undefined}
72 accessibilityHint={
73 starterPackParsed ? _(msg`Navigate to starter pack`) : undefined
74 }
75 />
76 ) : undefined}
77 {embedPlayerParams?.isGif ? (
78 <ExternalGifEmbed link={link} params={embedPlayerParams} />
79 ) : embedPlayerParams ? (
80 <ExternalPlayer link={link} params={embedPlayerParams} />
81 ) : undefined}
82 <View
83 style={[
84 a.flex_1,
85 a.py_sm,
86 {
87 paddingHorizontal: isMobile ? 10 : 14,
88 },
89 ]}>
90 <Text
91 type="sm"
92 numberOfLines={1}
93 style={[pal.textLight, {marginVertical: 2}]}>
94 {toNiceDomain(link.uri)}
95 </Text>
96
97 {!embedPlayerParams?.isGif && !embedPlayerParams?.dimensions && (
98 <Text type="lg-bold" numberOfLines={3} style={[pal.text]}>
99 {link.title || link.uri}
100 </Text>
101 )}
102 {link.description ? (
103 <Text
104 type="md"
105 numberOfLines={link.thumb ? 2 : 4}
106 style={[pal.text, a.mt_xs]}>
107 {link.description}
108 </Text>
109 ) : undefined}
110 </View>
111 </LinkWrapper>
112 </View>
113 )
114}
115
116function LinkWrapper({
117 link,
118 onOpen,
119 style,
120 children,
121}: {
122 link: AppBskyEmbedExternal.ViewExternal
123 onOpen?: () => void
124 style?: StyleProp<ViewStyle>
125 children: React.ReactNode
126}) {
127 const t = useTheme()
128
129 const onShareExternal = useCallback(() => {
130 if (link.uri && isNative) {
131 shareUrl(link.uri)
132 }
133 }, [link.uri])
134
135 return (
136 <Link
137 asAnchor
138 anchorNoUnderline
139 href={link.uri}
140 style={[
141 a.flex_1,
142 a.border,
143 a.rounded_sm,
144 t.atoms.border_contrast_medium,
145 style,
146 ]}
147 hoverStyle={t.atoms.border_contrast_high}
148 onBeforePress={onOpen}
149 onLongPress={onShareExternal}>
150 {children}
151 </Link>
152 )
153}