import { type $Typed, AppBskyEmbedExternal, AppBskyEmbedImages, AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, AppBskyEmbedVideo, AppBskyFeedDefs, AppBskyGraphDefs, AppBskyLabelerDefs, } from '@atproto/api' export type Embed = | { type: 'post' view: $Typed } | { type: 'post_not_found' view: $Typed } | { type: 'post_blocked' view: $Typed } | { type: 'post_detached' view: $Typed } | { type: 'feed' view: $Typed } | { type: 'list' view: $Typed } | { type: 'labeler' view: $Typed } | { type: 'starter_pack' view: $Typed } | { type: 'images' view: $Typed } | { type: 'link' view: $Typed } | { type: 'video' view: $Typed } | { type: 'post_with_media' view: Embed media: Embed } | { type: 'unknown' view: null } export type EmbedType = Extract export function parseEmbedRecordView({record}: AppBskyEmbedRecord.View): Embed { if (AppBskyEmbedRecord.isViewRecord(record)) { return { type: 'post', view: record, } } else if (AppBskyEmbedRecord.isViewNotFound(record)) { return { type: 'post_not_found', view: record, } } else if (AppBskyEmbedRecord.isViewBlocked(record)) { return { type: 'post_blocked', view: record, } } else if (AppBskyEmbedRecord.isViewDetached(record)) { return { type: 'post_detached', view: record, } } else if (AppBskyFeedDefs.isGeneratorView(record)) { return { type: 'feed', view: record, } } else if (AppBskyGraphDefs.isListView(record)) { return { type: 'list', view: record, } } else if (AppBskyLabelerDefs.isLabelerView(record)) { return { type: 'labeler', view: record, } } else if (AppBskyGraphDefs.isStarterPackViewBasic(record)) { return { type: 'starter_pack', view: record, } } else { return { type: 'unknown', view: null, } } } export function parseEmbed(embed: AppBskyFeedDefs.PostView['embed']): Embed { if (AppBskyEmbedImages.isView(embed)) { return { type: 'images', view: embed, } } else if (AppBskyEmbedExternal.isView(embed)) { return { type: 'link', view: embed, } } else if (AppBskyEmbedVideo.isView(embed)) { return { type: 'video', view: embed, } } else if (AppBskyEmbedRecord.isView(embed)) { return parseEmbedRecordView(embed) } else if (AppBskyEmbedRecordWithMedia.isView(embed)) { return { type: 'post_with_media', view: parseEmbedRecordView(embed.record), media: parseEmbed(embed.media), } } else { return { type: 'unknown', view: null, } } }