+ {externalEmbed.external.description} +
+{text}}
+ {record.embeds !== undefined
+ ? record.embeds.map((embed) => {richText}
; +} diff --git a/components/Blocks/BlueskyPostBlock/index.tsx b/components/Blocks/BlueskyPostBlock/index.tsx new file mode 100644 index 00000000..83f504cb --- /dev/null +++ b/components/Blocks/BlueskyPostBlock/index.tsx @@ -0,0 +1,160 @@ +import { useEntitySetContext } from "components/EntitySetProvider"; +import { useEffect, useState } from "react"; +import { useEntity } from "src/replicache"; +import { useUIState } from "src/useUIState"; +import { BlockProps } from "../Block"; +import { elementId } from "src/utils/elementId"; +import { focusBlock } from "src/utils/focusBlock"; +import { AppBskyFeedDefs, AppBskyFeedPost, RichText } from "@atproto/api"; +import { BlueskyEmbed, PostNotAvailable } from "./BlueskyEmbed"; +import { BlueskyPostEmpty } from "./BlueskyEmpty"; +import { BlueskyTiny, CommentTiny } from "components/Icons"; +import { BlueskyRichText } from "./BlueskyRichText"; +import { Separator } from "components/Layout"; +import { PostView } from "@atproto/api/dist/client/types/app/bsky/feed/defs"; + +export const BlueskyPostBlock = (props: BlockProps & { preview?: boolean }) => { + let { permissions } = useEntitySetContext(); + let isSelected = useUIState((s) => + s.selectedBlocks.find((b) => b.value === props.entityID), + ); + let post = useEntity(props.entityID, "block/bluesky-post")?.data.value; + + useEffect(() => { + if (props.preview) return; + let input = document.getElementById(elementId.block(props.entityID).input); + if (isSelected) { + input?.focus(); + } else input?.blur(); + }, [isSelected, props.entityID, props.preview]); + + switch (true) { + case !post: + if (!permissions.write) return null; + return ( + + ); + + case AppBskyFeedDefs.isBlockedPost(post) || + AppBskyFeedDefs.isBlockedAuthor(post) || + AppBskyFeedDefs.isNotFoundPost(post): + return ( +
+ {BlueskyRichText({
+ record: record as AppBskyFeedPost.Record | null,
+ })}
+
+