@prismicio/react
Version:
React components and hooks to fetch and present Prismic content
44 lines (43 loc) • 1.59 kB
JavaScript
"use client";
import { getToolbarSrc } from "@prismicio/client";
import { useEffect, useRef } from "react";
//#region src/PrismicToolbar.tsx
/**
* Renders the Prismic Toolbar script to support draft previews.
*
* @example
* ```tsx
* <PrismicToolbar repositoryName="my-repo" />;
* ```
*
* @see Learn how to set up preview functionality and the toolbar's role in preview sessions: {@link https://prismic.io/docs/previews}
*/
const PrismicToolbar = (props) => {
const { repositoryName, onPreviewUpdate, onPreviewEnd } = props;
const src = getToolbarSrc(repositoryName);
const onPreviewUpdateRef = useRef(onPreviewUpdate);
onPreviewUpdateRef.current = onPreviewUpdate;
const onPreviewEndRef = useRef(onPreviewEnd);
onPreviewEndRef.current = onPreviewEnd;
useEffect(() => {
if (!document.querySelector(`script[src="${src}"]`)) {
const script = document.createElement("script");
script.src = src;
script.defer = true;
script.dataset.prismicToolbar = "";
script.dataset.repositoryName = repositoryName;
script._evaluateScript = false;
document.body.appendChild(script);
}
}, [repositoryName, src]);
useEffect(() => {
const controller = new AbortController();
window.addEventListener("prismicPreviewUpdate", (event) => onPreviewUpdateRef.current?.(event), { signal: controller.signal });
window.addEventListener("prismicPreviewEnd", (event) => onPreviewEndRef.current?.(event), { signal: controller.signal });
return () => controller.abort();
}, []);
return null;
};
//#endregion
export { PrismicToolbar };
//# sourceMappingURL=PrismicToolbar.js.map