Bluesky app fork with some witchin' additions 馃挮
witchsky.app
bluesky
fork
client
1import {useMemo} from 'react'
2import {moderateFeedGenerator} from '@atproto/api'
3
4import {useModerationOpts} from '#/state/preferences/moderation-opts'
5import {atoms as a, useTheme} from '#/alf'
6import * as FeedCard from '#/components/FeedCard'
7import {ContentHider} from '#/components/moderation/ContentHider'
8import {type EmbedType} from '#/types/bsky/post'
9import {type CommonProps} from './types'
10
11export function FeedEmbed({
12 embed,
13}: CommonProps & {
14 embed: EmbedType<'feed'>
15}) {
16 const t = useTheme()
17 return (
18 <FeedCard.Link
19 view={embed.view}
20 style={[a.border, t.atoms.border_contrast_low, a.p_sm, a.rounded_md]}>
21 <FeedCard.Outer>
22 <FeedCard.Header>
23 <FeedCard.Avatar src={embed.view.avatar} size={48} />
24 <FeedCard.TitleAndByline
25 title={embed.view.displayName}
26 creator={embed.view.creator}
27 uri={embed.view.uri}
28 />
29 </FeedCard.Header>
30 </FeedCard.Outer>
31 </FeedCard.Link>
32 )
33}
34
35export function ModeratedFeedEmbed({
36 embed,
37}: CommonProps & {
38 embed: EmbedType<'feed'>
39}) {
40 const moderationOpts = useModerationOpts()
41 const moderation = useMemo(() => {
42 return moderationOpts
43 ? moderateFeedGenerator(embed.view, moderationOpts)
44 : undefined
45 }, [embed.view, moderationOpts])
46 return (
47 <ContentHider
48 modui={moderation?.ui('contentList')}
49 childContainerStyle={[a.pt_xs]}>
50 <FeedEmbed embed={embed} />
51 </ContentHider>
52 )
53}