import type { Block, RichTextContent, TextBlock } from "@prismicio/types-internal/lib/content" import type { RichText } from "@prismicio/types-internal/lib/customtypes" import { pipe } from "fp-ts/lib/function" import * as O from "fp-ts/lib/Option" import type { RenderContext } from "../../../models" import { ApiVersion } from "../../../models" import type { SimpleField } from "../../../models/fetch" import type { Renderer } from "../../../models/Renderer" import BlockRenderer from "./BlockRenderer" function renderSummaryJson(text: RichTextContent, renderer: (text: RichTextContent) => unknown): unknown { const firstBlock = pipe, O.Option, O.Option>, Array>( O.fromNullable(text.value.find((block: Block) => block.type.startsWith("heading"))) as O.Option, O.alt( () => O.fromNullable( text.value.find((block: Block) => block.type !== "embed" && block.type !== "image"), ) as O.Option, ), O.map((block: TextBlock) => [block]), O.getOrElse>(() => []), ) return renderer({ __TYPE__: "StructuredTextContent", value: firstBlock, }) } const StructuredTextRenderer: (ctx: RenderContext) => Renderer = (ctx) => ({ renderV1(content: RichTextContent, fetch: SimpleField | undefined): unknown { //TODO: factorize that const renderedBlocks = content.value.map((block) => BlockRenderer(ctx).renderBlock(block)(ApiVersion.v1)) if (fetch !== undefined && fetch.legacy) { return renderSummaryJson(content, (text) => text.value.map((block) => BlockRenderer(ctx).renderBlock(block)(ApiVersion.v1)), ) } return { type: "StructuredText", value: renderedBlocks, } }, renderV2(def: RichText, content: RichTextContent, fetch: SimpleField | undefined): unknown { if (fetch != undefined && fetch.legacy) { return renderSummaryJson(content, (text) => this.renderV2(def, text, undefined)) } return content.value.map((block) => BlockRenderer(ctx).renderBlock(block)(ApiVersion.v2)) }, renderDefault(_def: RichText): unknown { return [] }, renderMocks(_def: RichText, content: RichTextContent): unknown { return content.value.map((block) => BlockRenderer(ctx).renderBlock(block)(ApiVersion.mocks)) }, }) export default StructuredTextRenderer