import React from 'react' import { StyleSheet, StyleProp, View, ViewStyle, Text, InteractionManager, } from 'react-native' import {Image} from 'expo-image' import { AppBskyEmbedImages, AppBskyEmbedExternal, AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, AppBskyFeedDefs, AppBskyGraphDefs, ModerationUI, } from '@atproto/api' import {Link} from '../Link' import {ImageLayoutGrid} from '../images/ImageLayoutGrid' import {ImagesLightbox} from 'state/models/ui/shell' import {useStores} from 'state/index' import {usePalette} from 'lib/hooks/usePalette' import {YoutubeEmbed} from './YoutubeEmbed' import {ExternalLinkEmbed} from './ExternalLinkEmbed' import {getYoutubeVideoId} from 'lib/strings/url-helpers' import {MaybeQuoteEmbed} from './QuoteEmbed' import {AutoSizedImage} from '../images/AutoSizedImage' import {CustomFeedEmbed} from './CustomFeedEmbed' import {ListEmbed} from './ListEmbed' import {isDesktopWeb} from 'platform/detection' import {isCauseALabelOnUri} from 'lib/moderation' type Embed = | AppBskyEmbedRecord.View | AppBskyEmbedImages.View | AppBskyEmbedExternal.View | AppBskyEmbedRecordWithMedia.View | {$type: string; [k: string]: unknown} export function PostEmbeds({ embed, moderation, style, }: { embed?: Embed moderation: ModerationUI style?: StyleProp }) { const pal = usePalette('default') const store = useStores() // quote post with media // = if (AppBskyEmbedRecordWithMedia.isView(embed)) { const isModOnQuote = AppBskyEmbedRecord.isViewRecord(embed.record.record) && isCauseALabelOnUri(moderation.cause, embed.record.record.uri) const mediaModeration = isModOnQuote ? {} : moderation const quoteModeration = isModOnQuote ? moderation : {} return ( ) } if (AppBskyEmbedRecord.isView(embed)) { // custom feed embed (i.e. generator view) // = if (AppBskyFeedDefs.isGeneratorView(embed.record)) { return } // list embed (e.g. mute lists; i.e. ListView) if (AppBskyGraphDefs.isListView(embed.record)) { return } // quote post // = return ( ) } // image embed // = if (AppBskyEmbedImages.isView(embed)) { const {images} = embed if (images.length > 0) { const items = embed.images.map(img => ({uri: img.fullsize, alt: img.alt})) const openLightbox = (index: number) => { store.shell.openLightbox(new ImagesLightbox(items, index)) } const onPressIn = (_: number) => { InteractionManager.runAfterInteractions(() => { Image.prefetch(items.map(i => i.uri)) }) } if (images.length === 1) { const {alt, thumb} = images[0] return ( openLightbox(0)} onPressIn={() => onPressIn(0)} style={styles.singleImage}> {alt === '' ? null : ( ALT )} ) } return ( ) } } // external link embed // = if (AppBskyEmbedExternal.isView(embed)) { const link = embed.external const youtubeVideoId = getYoutubeVideoId(link.uri) if (youtubeVideoId) { return } return ( ) } return } const styles = StyleSheet.create({ stackContainer: { gap: 6, }, imagesContainer: { marginTop: 8, }, singleImage: { borderRadius: 8, maxHeight: isDesktopWeb ? 1000 : 500, }, extOuter: { borderWidth: 1, borderRadius: 8, marginTop: 4, }, altContainer: { backgroundColor: 'rgba(0, 0, 0, 0.75)', borderRadius: 6, paddingHorizontal: 6, paddingVertical: 3, position: 'absolute', left: 6, bottom: 6, }, alt: { color: 'white', fontSize: 10, fontWeight: 'bold', }, })