import React, {useCallback} from 'react' import {type StyleProp, View, type ViewStyle} from 'react-native' import {Image} from 'expo-image' import {type AppBskyEmbedExternal} from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {parseAltFromGIFDescription} from '#/lib/gif-alt-text' import {useHaptics} from '#/lib/haptics' import {shareUrl} from '#/lib/sharing' import {parseEmbedPlayerFromUrl} from '#/lib/strings/embed-player' import {toNiceDomain} from '#/lib/strings/url-helpers' import {isNative} from '#/platform/detection' import {useExternalEmbedsPrefs} from '#/state/preferences' import {atoms as a, useTheme} from '#/alf' import {Divider} from '#/components/Divider' import {Earth_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe' import {Link} from '#/components/Link' import {Text} from '#/components/Typography' import {ExternalGif} from './ExternalGif' import {ExternalPlayer} from './ExternalPlayer' import {GifEmbed} from './Gif' export const ExternalEmbed = ({ link, onOpen, style, hideAlt, }: { link: AppBskyEmbedExternal.ViewExternal onOpen?: () => void style?: StyleProp hideAlt?: boolean }) => { const {_} = useLingui() const t = useTheme() const playHaptic = useHaptics() const externalEmbedPrefs = useExternalEmbedsPrefs() const niceUrl = toNiceDomain(link.uri) const imageUri = link.thumb const embedPlayerParams = React.useMemo(() => { const params = parseEmbedPlayerFromUrl(link.uri) if (params && externalEmbedPrefs?.[params.source] !== 'hide') { return params } }, [link.uri, externalEmbedPrefs]) const hasMedia = Boolean(imageUri || embedPlayerParams) const onPress = useCallback(() => { playHaptic('Light') onOpen?.() }, [playHaptic, onOpen]) const onShareExternal = useCallback(() => { if (link.uri && isNative) { playHaptic('Heavy') shareUrl(link.uri) } }, [link.uri, playHaptic]) if (embedPlayerParams?.source === 'tenor') { const parsedAlt = parseAltFromGIFDescription(link.description) return ( ) } return ( {({hovered}) => ( {imageUri && !embedPlayerParams ? ( ) : undefined} {embedPlayerParams?.isGif ? ( ) : embedPlayerParams ? ( ) : undefined} {!embedPlayerParams?.isGif && !embedPlayerParams?.dimensions && ( {link.title || link.uri} )} {link.description ? ( {link.description} ) : undefined} {toNiceDomain(link.uri)} )} ) }