@prismicio/react
Version:
React components and hooks to fetch and present Prismic content
80 lines (79 loc) • 4.32 kB
JavaScript
import { jsx, Fragment } from "react/jsx-runtime";
import { isValidElement, cloneElement, Fragment as Fragment$1 } from "react";
import { isFilled } from "@prismicio/client";
import { composeSerializers, wrapMapSerializer, serialize } from "@prismicio/client/richtext";
import { DEV } from "esm-env";
import { devMsg } from "./lib/devMsg.js";
import { PrismicLink } from "./PrismicLink.js";
const getDir = (node) => {
if ("direction" in node && node.direction === "rtl") {
return "rtl";
}
};
const createDefaultSerializer = (args) => wrapMapSerializer({
heading1: ({ node, children, key }) => jsx("h1", { dir: getDir(node), children }, key),
heading2: ({ node, children, key }) => jsx("h2", { dir: getDir(node), children }, key),
heading3: ({ node, children, key }) => jsx("h3", { dir: getDir(node), children }, key),
heading4: ({ node, children, key }) => jsx("h4", { dir: getDir(node), children }, key),
heading5: ({ node, children, key }) => jsx("h5", { dir: getDir(node), children }, key),
heading6: ({ node, children, key }) => jsx("h6", { dir: getDir(node), children }, key),
paragraph: ({ node, children, key }) => jsx("p", { dir: getDir(node), children }, key),
preformatted: ({ node, key }) => jsx("pre", { children: node.text }, key),
strong: ({ children, key }) => jsx("strong", { children }, key),
em: ({ children, key }) => jsx("em", { children }, key),
listItem: ({ node, children, key }) => jsx("li", { dir: getDir(node), children }, key),
oListItem: ({ node, children, key }) => jsx("li", { dir: getDir(node), children }, key),
list: ({ children, key }) => jsx("ul", { children }, key),
oList: ({ children, key }) => jsx("ol", { children }, key),
image: ({ node, key }) => {
const img = jsx("img", { src: node.url, alt: node.alt ?? void 0, "data-copyright": node.copyright ? node.copyright : void 0 });
return jsx("p", { className: "block-img", children: node.linkTo ? jsx(PrismicLink, { linkResolver: args.linkResolver, internalComponent: args.internalLinkComponent, externalComponent: args.externalLinkComponent, field: node.linkTo, children: img }) : img }, key);
},
embed: ({ node, key }) => jsx("div", { "data-oembed": node.oembed.embed_url, "data-oembed-type": node.oembed.type, "data-oembed-provider": node.oembed.provider_name, dangerouslySetInnerHTML: { __html: node.oembed.html ?? "" } }, key),
hyperlink: ({ node, children, key }) => jsx(PrismicLink, { field: node.data, linkResolver: args.linkResolver, internalComponent: args.internalLinkComponent, externalComponent: args.externalLinkComponent, children }, key),
label: ({ node, children, key }) => jsx("span", { className: node.data.label, children }, key),
span: ({ text, key }) => {
const result = [];
let i = 0;
for (const line of text.split("\n")) {
if (i > 0) {
result.push(jsx("br", {}, `${i}__break`));
}
result.push(jsx(Fragment$1, { children: line }, `${i}__line`));
i++;
}
return jsx(Fragment$1, { children: result }, key);
}
});
const PrismicRichText = (props) => {
const { linkResolver, field, fallback, components, externalLinkComponent, internalLinkComponent, ...restProps } = props;
if (DEV) {
if ("className" in restProps) {
console.warn(`[PrismicRichText] className cannot be passed to <PrismicRichText> since it renders an array without a wrapping component. For more details, see ${devMsg("classname-is-not-a-valid-prop")}.`, field);
}
}
if (!isFilled.richText(field)) {
return fallback != null ? jsx(Fragment, { children: fallback }) : null;
}
const serializer = composeSerializers(typeof components === "object" ? wrapMapSerializer(components) : components, createDefaultSerializer({
linkResolver,
internalLinkComponent,
externalLinkComponent
}));
const serialized = serialize(field, (type, node, text, children, key) => {
const result = serializer(type, node, text, children, key);
if (isValidElement(result) && result.key == null) {
return cloneElement(result, { key });
} else {
return result;
}
});
if (!serialized) {
return fallback != null ? jsx(Fragment, { children: fallback }) : null;
}
return jsx(Fragment, { children: serialized });
};
export {
PrismicRichText
};
//# sourceMappingURL=PrismicRichText.js.map