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 { BlueskyRichText } from "./BlueskyRichText"; import { Separator } from "components/Layout"; import { BlueskyTiny } from "components/Icons/BlueskyTiny"; import { CommentTiny } from "components/Icons/CommentTiny"; import { useLocalizedDate } from "src/hooks/useLocalizedDate"; 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 (
); case AppBskyFeedDefs.isThreadViewPost(post): let record = post.post .record as AppBskyFeedDefs.FeedViewPost["post"]["record"]; let facets = record.facets; // silliness to get the text and timestamp from the record with proper types let text: string | null = null; let timestamp: string | undefined = undefined; if (AppBskyFeedPost.isRecord(record)) { text = (record as AppBskyFeedPost.Record).text; timestamp = (record as AppBskyFeedPost.Record).createdAt; } //getting the url to the post let postId = post.post.uri.split("/")[4]; let url = `https://bsky.app/profile/${post.post.author.handle}/post/${postId}`; return (
{post.post.author && record && ( <>
{post.post.author?.avatar ? ( {`${post.post.author?.displayName}'s ) : (
)}
{post.post.author?.displayName}
@{post.post.author?.handle}
                    {BlueskyRichText({
                      record: record as AppBskyFeedPost.Record | null,
                    })}
                  
{post.post.embed && ( )}
)}
{timestamp && }
{post.post.replyCount && post.post.replyCount > 0 && ( <> {post.post.replyCount} )}
); } }; function PostDate(props: { timestamp: string }) { const formattedDate = useLocalizedDate(props.timestamp, { month: "short", day: "numeric", year: "numeric", hour: "numeric", minute: "numeric", hour12: true, }); return
{formattedDate}
; }