import {View} from 'react-native' import {Image} from 'expo-image' import {LinearGradient} from 'expo-linear-gradient' import {AppBskyEmbedVideo, AppBskyFeedDefs, AppBskyFeedPost} from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {VIBES_FEED_URI} from '#/lib/constants' import {sanitizeHandle} from '#/lib/strings/handles' import {formatCount} from '#/view/com/util/numeric/format' import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme} from '#/alf' import {BLUE_HUE} from '#/alf/util/colorGeneration' import {select} from '#/alf/util/themeSelector' import {useInteractionState} from '#/components/hooks/useInteractionState' import {Heart2_Stroke2_Corner0_Rounded as Heart} from '#/components/icons/Heart2' import {Repost_Stroke2_Corner2_Rounded as Repost} from '#/components/icons/Repost' import {Link} from '#/components/Link' import {MediaInsetBorder} from '#/components/MediaInsetBorder' import {Text} from '#/components/Typography' export function VideoPostCard({ post, sourceFeedUri = VIBES_FEED_URI, }: { post: AppBskyFeedDefs.PostView sourceFeedUri?: string }) { const t = useTheme() const {_, i18n} = useLingui() const embed = post.embed const { state: pressed, onIn: onPressIn, onOut: onPressOut, } = useInteractionState() /** * Filtering should be done at a higher level, such as `PostFeed` or * `PostFeedVideoGridRow`, but we need to protect here as well. */ if (!AppBskyEmbedVideo.isView(embed)) return null const text = AppBskyFeedPost.isRecord(post.record) ? post.record?.text : '' const likeCount = post?.likeCount ?? 0 const repostCount = post?.repostCount ?? 0 const {thumbnail} = embed const black = select(t.name, { light: t.palette.black, dark: t.atoms.bg_contrast_25.backgroundColor, dim: `hsl(${BLUE_HUE}, 28%, 6%)`, }) return ( {likeCount > 0 && ( {formatCount(i18n, likeCount)} )} {repostCount > 0 && ( {formatCount(i18n, repostCount)} )} {text && ( {text} )} {sanitizeHandle(post.author.handle, '@')} ) }