From fb3fe27c3b8f8c0146899add899cc49a76673029 Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Thu, 30 Oct 2025 14:05:54 -0400 Subject: [PATCH] add button blocks to published posts --- actions/publishToPublication.ts | 23 +++++++++++--- .../[publication]/[rkey]/PostContent.tsx | 23 ++++++++++++-- components/Blocks/BlockCommands.tsx | 1 - lexicons/api/index.ts | 2 ++ lexicons/api/lexicons.ts | 22 +++++++++++++ .../api/types/pub/leaflet/blocks/button.ts | 31 +++++++++++++++++++ .../api/types/pub/leaflet/pages/canvas.ts | 2 ++ .../types/pub/leaflet/pages/linearDocument.ts | 2 ++ lexicons/pub/leaflet/blocks/button.json | 22 +++++++++++++ lexicons/pub/leaflet/pages/canvas.json | 3 +- .../pub/leaflet/pages/linearDocument.json | 3 +- lexicons/src/blocks.ts | 16 ++++++++++ 12 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 lexicons/api/types/pub/leaflet/blocks/button.ts create mode 100644 lexicons/pub/leaflet/blocks/button.json diff --git a/actions/publishToPublication.ts b/actions/publishToPublication.ts index 04a319ef..eb62eb97 100644 --- a/actions/publishToPublication.ts +++ b/actions/publishToPublication.ts @@ -23,6 +23,7 @@ import { PubLeafletBlocksIframe, PubLeafletBlocksPage, PubLeafletBlocksPoll, + PubLeafletBlocksButton, PubLeafletPollDefinition, } from "lexicons/api"; import { Block } from "components/Blocks/Block"; @@ -192,9 +193,10 @@ async function processBlocksToPages( await Promise.all( parsedBlocks.map(async (blockOrList) => { if (blockOrList.type === "block") { - let alignmentValue = - scan.eav(blockOrList.block.value, "block/text-alignment")[0]?.data - .value || "left"; + let alignmentValue = scan.eav( + blockOrList.block.value, + "block/text-alignment", + )[0]?.data.value; let alignment: ExcludeString< PubLeafletPagesLinearDocument.Block["alignment"] > = @@ -204,7 +206,9 @@ async function processBlocksToPages( ? "lex:pub.leaflet.pages.linearDocument#textAlignRight" : alignmentValue === "justify" ? "lex:pub.leaflet.pages.linearDocument#textAlignJustify" - : undefined; + : alignmentValue === "left" + ? "lex:pub.leaflet.pages.linearDocument#textAlignLeft" + : undefined; let b = await blockToRecord(blockOrList.block, did); if (!b) return []; let block: PubLeafletPagesLinearDocument.Block = { @@ -450,6 +454,17 @@ async function processBlocksToPages( }; return block; } + if (b.type === "button") { + let [text] = scan.eav(b.value, "button/text"); + let [url] = scan.eav(b.value, "button/url"); + if (!text || !url) return; + let block: $Typed = { + $type: "pub.leaflet.blocks.button", + text: text.data.value, + url: url.data.value, + }; + return block; + } return; } diff --git a/app/lish/[did]/[publication]/[rkey]/PostContent.tsx b/app/lish/[did]/[publication]/[rkey]/PostContent.tsx index f440bf4a..555f1b51 100644 --- a/app/lish/[did]/[publication]/[rkey]/PostContent.tsx +++ b/app/lish/[did]/[publication]/[rkey]/PostContent.tsx @@ -16,6 +16,7 @@ import { PubLeafletBlocksIframe, PubLeafletBlocksPage, PubLeafletBlocksPoll, + PubLeafletBlocksButton, } from "lexicons/api"; import { blobRefToSrc } from "src/utils/blobRefToSrc"; @@ -32,6 +33,7 @@ import { PageLinkBlock } from "components/Blocks/PageLinkBlock"; import { PublishedPageLinkBlock } from "./PublishedPageBlock"; import { PublishedPollBlock } from "./PublishedPollBlock"; import { PollData } from "./fetchPollData"; +import { ButtonPrimary } from "components/Buttons"; export function PostContent({ blocks, @@ -128,8 +130,14 @@ export let Block = ({ : b.alignment === "lex:pub.leaflet.pages.linearDocument#textAlignJustify" ? "text-justify justify-start" - : ""; - if (!alignment && PubLeafletBlocksImage.isMain(b.block)) + : b.alignment === "lex:pub.leaflet.pages.linearDocument#textAlignLeft" + ? "text-left justify-start" + : undefined; + if ( + !alignment && + (PubLeafletBlocksImage.isMain(b.block) || + PubLeafletBlocksButton.isMain(b.block)) + ) alignment = "text-center justify-center"; let className = ` @@ -194,6 +202,17 @@ export let Block = ({ /> ); } + case PubLeafletBlocksButton.isMain(b.block): { + return ( +
+ + + {b.block.text} + + +
+ ); + } case PubLeafletBlocksUnorderedList.isMain(b.block): { return (