import {useCallback, useMemo, useState} from 'react' import {LayoutAnimation, Pressable, View} from 'react-native' import {Image} from 'expo-image' import { AppBskyEmbedImages, AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, AppBskyFeedPost, } from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeHandle} from '#/lib/strings/handles' import {type ComposerOptsPostRef} from '#/state/shell/composer' import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme, web} from '#/alf' import {QuoteEmbed} from '#/components/Post/Embed' import {Text} from '#/components/Typography' import {useSimpleVerificationState} from '#/components/verification' import {VerificationCheck} from '#/components/verification/VerificationCheck' import {parseEmbed} from '#/types/bsky/post' export function ComposerReplyTo({replyTo}: {replyTo: ComposerOptsPostRef}) { const t = useTheme() const {_} = useLingui() const {embed} = replyTo const [showFull, setShowFull] = useState(false) const onPress = useCallback(() => { setShowFull(prev => !prev) LayoutAnimation.configureNext({ duration: 350, update: {type: 'spring', springDamping: 0.7}, }) }, []) const quoteEmbed = useMemo(() => { if ( AppBskyEmbedRecord.isView(embed) && AppBskyEmbedRecord.isViewRecord(embed.record) && AppBskyFeedPost.isRecord(embed.record.value) ) { return embed } else if ( AppBskyEmbedRecordWithMedia.isView(embed) && AppBskyEmbedRecord.isViewRecord(embed.record.record) && AppBskyFeedPost.isRecord(embed.record.record.value) ) { return embed.record } return null }, [embed]) const parsedQuoteEmbed = quoteEmbed ? parseEmbed({ $type: 'app.bsky.embed.record#view', ...quoteEmbed, }) : null const images = useMemo(() => { if (AppBskyEmbedImages.isView(embed)) { return embed.images } else if ( AppBskyEmbedRecordWithMedia.isView(embed) && AppBskyEmbedImages.isView(embed.media) ) { return embed.media.images } }, [embed]) const verification = useSimpleVerificationState({profile: replyTo.author}) return ( {sanitizeDisplayName( replyTo.author.displayName || sanitizeHandle(replyTo.author.handle), )} {verification.showBadge && ( )} {replyTo.text} {images && !replyTo.moderation?.ui('contentMedia').blur && ( )} {showFull && parsedQuoteEmbed && parsedQuoteEmbed.type === 'post' && ( )} ) } function ComposerReplyToImages({ images, }: { images: AppBskyEmbedImages.ViewImage[] showFull: boolean }) { return ( {(images.length === 1 && ( )) || (images.length === 2 && ( )) || (images.length === 3 && ( )) || (images.length === 4 && ( ))} ) }