From 72dfec91151c6207476e0bbbf1132e5307f40daf Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 20 Jun 2026 15:18:22 +0000 Subject: [PATCH] Enrich feed card embed on posts The feed generator embed on posts only showed the avatar, title, and byline, even though the embed view is fully hydrated with more data. Make the embed a full card matching the feed discovery card: add the feed description (clamped to 3 lines), the "Liked by N users" count, and an interactive Pin/Save button. Also surface video feeds: add a small "Video feed" badge in TitleAndByline when contentMode is the video mode, which the discovery card picks up as well. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_011CcnwUeBmYNFzhRGhV4RG5 --- src/components/FeedCard.tsx | 21 ++++++++++++++++++++- src/components/Post/Embed/FeedEmbed.tsx | 7 +++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/components/FeedCard.tsx b/src/components/FeedCard.tsx index efd14be4ba..630691b027 100644 --- a/src/components/FeedCard.tsx +++ b/src/components/FeedCard.tsx @@ -1,7 +1,7 @@ import {useCallback, useEffect, useMemo} from 'react' import {type GestureResponderEvent, View} from 'react-native' import { - type AppBskyFeedDefs, + AppBskyFeedDefs, type AppBskyGraphDefs, AtUri, RichText as RichTextApi, @@ -28,6 +28,7 @@ import { } from '#/components/Button' import {Live_Stroke2_Corner0_Rounded as LiveIcon} from '#/components/icons/Live' import {Pin_Stroke2_Corner0_Rounded as PinIcon} from '#/components/icons/Pin' +import {VideoClip_Stroke2_Corner0_Rounded as VideoClipIcon} from '#/components/icons/VideoClip' import {Link as InternalLink, type LinkProps} from '#/components/Link' import {Loader} from '#/components/Loader' import * as Prompt from '#/components/Prompt' @@ -54,6 +55,7 @@ export function Default(props: Props) { title={view.displayName} creator={view.creator} uri={view.uri} + contentMode={view.contentMode} /> @@ -124,13 +126,16 @@ export function TitleAndByline({ title, creator, uri, + contentMode, }: { title: string creator?: bsky.profile.AnyProfileView uri?: string + contentMode?: AppBskyFeedDefs.GeneratorView['contentMode'] }) { const t = useTheme() const activeLiveEvents = useActiveLiveEventFeedUris() + const isVideoFeed = contentMode === AppBskyFeedDefs.CONTENTMODEVIDEO const liveColor = useMemo( () => select(t.name, { @@ -170,6 +175,20 @@ export function TitleAndByline({ Feed by {sanitizeHandle(creator.handle, '@')} )} + {isVideoFeed && ( + + + + Video feed + + + )} ) } diff --git a/src/components/Post/Embed/FeedEmbed.tsx b/src/components/Post/Embed/FeedEmbed.tsx index a726c313e1..867059e8b6 100644 --- a/src/components/Post/Embed/FeedEmbed.tsx +++ b/src/components/Post/Embed/FeedEmbed.tsx @@ -25,8 +25,15 @@ export function FeedEmbed({ title={embed.view.displayName} creator={embed.view.creator} uri={embed.view.uri} + contentMode={embed.view.contentMode} /> + + + )