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.

at verify-code 153 lines 4.4 kB view raw
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}