import {InteractionManager, View} from 'react-native' import {type AnimatedRef} from 'react-native-reanimated' import {Image} from 'expo-image' import {useLightboxControls} from '#/state/lightbox' import {useHighQualityImages} from '#/state/preferences/high-quality-images' import { applyImageTransforms, useImageCdnHost, } from '#/state/preferences/image-cdn-host' import {type Dimensions} from '#/view/com/lightbox/ImageViewing/@types' import {atoms as a, tokens} from '#/alf' import {AutoSizedImage} from '#/components/images/AutoSizedImage' import {Gallery} from '#/components/images/Gallery' import {ImageLayoutGrid} from '#/components/images/ImageLayoutGrid' import {PostEmbedViewContext} from '#/components/Post/Embed/types' import {useAnalytics} from '#/analytics' import {type EmbedType} from '#/types/bsky/post' import {type CommonProps} from './types' export function ImageEmbed({ embed, ...rest }: CommonProps & { embed: EmbedType<'images'> }) { const ax = useAnalytics() const {openLightbox} = useLightboxControls() const highQualityImages = useHighQualityImages() const imageCdnHost = useImageCdnHost() const {images} = embed.view const galleryEnabled = ax.features.enabled(ax.features.PostGalleryEmbedEnable) if (images.length > 0) { const items = images.map(img => ({ uri: applyImageTransforms(img.fullsize, { imageCdnHost, highQualityImages, }), thumbUri: applyImageTransforms(img.thumb, { imageCdnHost, highQualityImages, }), alt: img.alt, dimensions: img.aspectRatio ?? null, })) const onPress = ( index: number, refs: AnimatedRef[], fetchedDims: (Dimensions | null)[], ) => { openLightbox({ images: items.map((item, i) => ({ ...item, thumbRect: null, thumbRef: refs[i] ?? null, thumbDimensions: fetchedDims[i] ?? null, thumbBorderRadius: tokens.borderRadius.md, type: 'image', })), index, }) } const onPressIn = (_: number) => { InteractionManager.runAfterInteractions(() => { Image.prefetch( items.map(i => i.uri), 'memory', ) }) } if (images.length === 1) { const image = images[0] return ( onPress(0, [containerRef], [dims])} onPressIn={() => onPressIn(0)} hideBadge={ rest.viewContext === PostEmbedViewContext.FeedEmbedRecordWithMedia } /> ) } if (galleryEnabled) { return ( ) } return ( ) } }