import React from 'react' import {LayoutAnimation, Pressable, StyleSheet, 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 {ComposerOptsPostRef} from '#/state/shell/composer' import {MaybeQuoteEmbed} from '#/view/com/util/post-embeds/QuoteEmbed' import {Text} from '#/view/com/util/text/Text' import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme} from '#/alf' export function ComposerReplyTo({replyTo}: {replyTo: ComposerOptsPostRef}) { const t = useTheme() const {_} = useLingui() const {embed} = replyTo const [showFull, setShowFull] = React.useState(false) const onPress = React.useCallback(() => { setShowFull(prev => !prev) LayoutAnimation.configureNext({ duration: 350, update: {type: 'spring', springDamping: 0.7}, }) }, []) const quoteEmbed = React.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 images = React.useMemo(() => { if (AppBskyEmbedImages.isView(embed)) { return embed.images } else if ( AppBskyEmbedRecordWithMedia.isView(embed) && AppBskyEmbedImages.isView(embed.media) ) { return embed.media.images } }, [embed]) return ( {sanitizeDisplayName( replyTo.author.displayName || sanitizeHandle(replyTo.author.handle), )} {replyTo.text} {images && !replyTo.moderation?.ui('contentMedia').blur && ( )} {showFull && quoteEmbed && } ) } function ComposerReplyToImages({ images, }: { images: AppBskyEmbedImages.ViewImage[] showFull: boolean }) { return ( {(images.length === 1 && ( )) || (images.length === 2 && ( )) || (images.length === 3 && ( )) || (images.length === 4 && ( ))} ) } const styles = StyleSheet.create({ replyToLayout: { flexDirection: 'row', alignItems: 'flex-start', borderBottomWidth: StyleSheet.hairlineWidth, paddingTop: 4, paddingBottom: 16, marginBottom: 12, marginHorizontal: 16, }, replyToPost: { flex: 1, paddingLeft: 13, paddingRight: 8, }, replyToBody: { flexDirection: 'row', gap: 10, }, replyToText: { flex: 1, flexGrow: 1, }, imagesContainer: { borderRadius: 6, overflow: 'hidden', marginTop: 2, height: 64, width: 64, }, })