import {
AppBskyEmbedExternal,
AppBskyEmbedImages,
AppBskyEmbedRecord,
AppBskyEmbedRecordWithMedia,
AppBskyFeedDefs,
AppBskyFeedPost,
AppBskyGraphDefs,
AppBskyLabelerDefs,
} from '@atproto/api'
import {ComponentChildren, h} from 'preact'
import infoIcon from '../assets/circleInfo_stroke2_corner0_rounded.svg'
import {Link} from './link'
import {getRkey} from './utils'
export function Embed({content}: {content: AppBskyFeedDefs.PostView['embed']}) {
if (!content) return null
try {
// Case 1: Image
if (AppBskyEmbedImages.isView(content)) {
return
}
// Case 2: External link
if (AppBskyEmbedExternal.isView(content)) {
return
}
// Case 3: Record (quote or linked post)
if (AppBskyEmbedRecord.isView(content)) {
const record = content.record
// Case 3.1: Post
if (AppBskyEmbedRecord.isViewRecord(record)) {
const pwiOptOut = !!record.author.labels?.find(
label => label.val === '!no-unauthenticated',
)
if (pwiOptOut) {
return (
The author of the quoted post has requested their posts not be
displayed on external sites.
)
}
let text
if (AppBskyFeedPost.isRecord(record.value)) {
text = record.value.text
}
return (
}
{record.embeds
?.filter(embed => {
if (AppBskyEmbedImages.isView(embed)) return true
if (AppBskyEmbedExternal.isView(embed)) return true
return false
})
.map(embed => (
))}
)
}
// Case 3.2: List
if (AppBskyGraphDefs.isListView(record)) {
return (
)
}
// Case 3.3: Feed
if (AppBskyFeedDefs.isGeneratorView(record)) {
return (
)
}
// Case 3.4: Labeler
if (AppBskyLabelerDefs.isLabelerView(record)) {
return (
)
}
// Case 3.5: Post not found
if (AppBskyEmbedRecord.isViewNotFound(record)) {
return Quoted post not found, it may have been deleted.
}
// Case 3.6: Post blocked
if (AppBskyEmbedRecord.isViewBlocked(record)) {
return The quoted post is blocked.
}
throw new Error('Unknown embed type')
}
// Case 4: Record with media
if (AppBskyEmbedRecordWithMedia.isView(content)) {
return (