import {useMemo} from 'react' import {type StyleProp, View, type ViewStyle} from 'react-native' import {type UriString} from '@atproto/lex' import {cleanError} from '#/lib/strings/errors' import { useResolveGifQuery, useResolveLinkQuery, } from '#/state/queries/resolve-link' import {ExternalEmbedRemoveBtn} from '#/view/com/composer/ExternalEmbedRemoveBtn' import {atoms as a, useTheme} from '#/alf' import {Loader} from '#/components/Loader' import {ExternalEmbed} from '#/components/Post/Embed/ExternalEmbed' import {ModeratedFeedEmbed} from '#/components/Post/Embed/FeedEmbed' import {JoinRequestEmbed} from '#/components/Post/Embed/JoinRequestEmbed' import {ModeratedListEmbed} from '#/components/Post/Embed/ListEmbed' import {StandardSiteEmbed} from '#/components/Post/Embed/StandardSiteEmbed' import {isStandardSiteEmbed} from '#/components/Post/Embed/StandardSiteEmbed/utils' import {ThemeEmbed} from '#/components/Post/Embed/ThemeEmbed' import {isThemeEmbed} from '#/components/Post/Embed/ThemeEmbed/utils' import {Embed as StarterPackEmbed} from '#/components/StarterPack/StarterPackCard' import {Text} from '#/components/Typography' import {type Gif} from '#/features/gifPicker/types' export const ExternalEmbedGif = ({ onRemove, gif, }: { onRemove: () => void gif: Gif }) => { const t = useTheme() const {data, error} = useResolveGifQuery(gif) const linkInfo = useMemo( () => data && { title: data.title ?? data.uri, uri: data.uri as UriString, description: data.description ?? '', thumb: data.thumb?.source.path as UriString | undefined, }, [data], ) const loadingStyle: ViewStyle = { aspectRatio: (() => { const dims = gif.media_formats.gif?.dims if (dims && dims[0] > 0 && dims[1] > 0) { return dims[0] / dims[1] } return 16 / 9 // Default aspect ratio })(), width: '100%', } return ( {linkInfo ? ( ) : error ? ( {gif.url} {cleanError(error)} ) : ( )} ) } export const ExternalEmbedLink = ({ uri, hasQuote, onRemove, }: { uri: UriString hasQuote: boolean onRemove: () => void }) => { const t = useTheme() const {data, error} = useResolveLinkQuery(uri) const linkComponent = useMemo(() => { if (data) { if (data.type === 'external') { const externalView = { ...data.view?.external, uri, title: data.view?.external?.title || data.title || uri, description: data.view?.external?.description || data.description || '', // Prefer Open Graph data because it contains the generated theme card. thumb: data.thumb?.source.path || data.view?.external?.thumb, associatedRefs: data.view?.external?.associatedRefs || data.associatedRefs, } if (isThemeEmbed(externalView)) { return } if (data.view && isStandardSiteEmbed(data.view.external)) { return ( ) } return ( ) } else if (data.type === 'chat-invite') { return } else if (data.kind === 'feed') { return ( ) } else if (data.kind === 'list') { return ( ) } else if (data.kind === 'starter-pack') { return } } }, [data, uri]) if (data?.type === 'record' && hasQuote) { // This is not currently supported by the data model so don't preview it. return null } return ( {linkComponent ? ( {linkComponent} ) : error ? ( {uri} {cleanError(error)} ) : ( )} ) } function Container({ style, children, }: { style?: StyleProp children: React.ReactNode }) { const t = useTheme() return ( {children} ) }