'use client' import type { DefaultNodeTypes, SerializedBlockNode } from '@payloadcms/richtext-lexical' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' import { getRestPopulateFn } from '@payloadcms/richtext-lexical/client' import { convertLexicalToHTML, type HTMLConvertersFunction, } from '@payloadcms/richtext-lexical/html' import { convertLexicalToHTMLAsync, type HTMLConvertersFunctionAsync, } from '@payloadcms/richtext-lexical/html-async' import { type JSXConvertersFunction, RichText } from '@payloadcms/richtext-lexical/react' import { useConfig, useDocumentInfo, usePayloadAPI } from '@payloadcms/ui' import React, { useEffect, useMemo, useState } from 'react' const jsxConverters: JSXConvertersFunction> = ({ defaultConverters, }) => ({ ...defaultConverters, blocks: { myTextBlock: ({ node }) =>
{node.fields.text}
, relationshipBlock: ({ node, nodesToJSX }) => { return

Test

}, }, }) const htmlConverters: HTMLConvertersFunction> = ({ defaultConverters, }) => ({ ...defaultConverters, blocks: { myTextBlock: ({ node }) => `
${node.fields.text}
`, relationshipBlock: () => { return `

Test

` }, }, }) const htmlConvertersAsync: HTMLConvertersFunctionAsync< DefaultNodeTypes | SerializedBlockNode > = ({ defaultConverters }) => ({ ...defaultConverters, blocks: { myTextBlock: ({ node }) => `
${node.fields.text}
`, relationshipBlock: () => { return `

Test

` }, }, }) export const LexicalRendered: React.FC = () => { const { id, collectionSlug } = useDocumentInfo() const { config: { routes: { api }, serverURL, }, } = useConfig() const [{ data }] = usePayloadAPI(`${serverURL}${api}/${collectionSlug}/${id}`, { initialParams: { depth: 1, }, }) const [{ data: unpopulatedData }] = usePayloadAPI(`${serverURL}${api}/${collectionSlug}/${id}`, { initialParams: { depth: 0, }, }) const html: null | string = useMemo(() => { if (!data.lexicalWithBlocks) { return null } return convertLexicalToHTML({ converters: htmlConverters, data: data.lexicalWithBlocks as SerializedEditorState, }) }, [data.lexicalWithBlocks]) const [htmlFromUnpopulatedData, setHtmlFromUnpopulatedData] = useState(null) useEffect(() => { async function convert() { const html = await convertLexicalToHTMLAsync({ converters: htmlConvertersAsync, data: unpopulatedData.lexicalWithBlocks as SerializedEditorState, populate: getRestPopulateFn({ apiURL: `${serverURL}${api}`, }), }) setHtmlFromUnpopulatedData(html) } void convert() }, [unpopulatedData.lexicalWithBlocks, api, serverURL]) if (!data.lexicalWithBlocks) { return null } return (

Rendered JSX:

Rendered HTML:

{html &&
}

Rendered HTML 2:

{htmlFromUnpopulatedData && (
)}

Raw JSON:

{JSON.stringify(data.lexicalWithBlocks, null, 2)}
) }