@prismicio/next
Version:
Helpers to integrate Prismic into Next.js apps
72 lines (71 loc) • 2.6 kB
JavaScript
"use client";
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const react = require("react");
const client = require("@prismicio/client");
const navigation = require("next/navigation");
const PrismicPreviewClient = (props) => {
const { repositoryName, isDraftMode, updatePreviewURL = "/api/preview", exitPreviewURL = "/api/exit-preview" } = props;
const { refresh } = navigation.useRouter();
react.useEffect(() => {
const controller = new AbortController();
window.addEventListener("prismicPreviewUpdate", onUpdate, {
signal: controller.signal
});
window.addEventListener("prismicPreviewEnd", onEnd, {
signal: controller.signal
});
const cookie = getPrismicPreviewCookie(window.document.cookie);
const cookieRepositoryName = cookie ? (decodeURIComponent(cookie).match(/"([^"]+)\.prismic\.io"/) || [])[1] : void 0;
const hasCookieForRepository = cookieRepositoryName === repositoryName;
if (hasCookieForRepository && !isDraftMode) {
console.log("starting preview link");
globalThis.fetch(updatePreviewURL, {
redirect: "manual",
signal: controller.signal
}).then((res) => {
if (res.type !== "opaqueredirect") {
console.error(`[<PrismicPreview>] Failed to start the preview using "${updatePreviewURL}". Does it exist?`);
return;
}
refresh();
}).catch(() => {
});
}
function onUpdate(event) {
event.preventDefault();
refresh();
}
function onEnd(event) {
event.preventDefault();
globalThis.fetch(exitPreviewURL, { signal: controller.signal }).then((res) => {
if (!res.ok) {
console.error(`[<PrismicPreview>] Failed to exit Preview Mode using the "${exitPreviewURL}" API endpoint. Does it exist?`);
return;
}
refresh();
}).catch(() => {
});
}
return () => controller.abort();
}, [repositoryName, isDraftMode, updatePreviewURL, exitPreviewURL, refresh]);
return null;
};
function getPrismicPreviewCookie(cookieJar) {
function readValue(value2) {
return value2.replace(/%3B/g, ";");
}
const cookies = cookieJar.split("; ");
let value;
for (const cookie of cookies) {
const parts = cookie.split("=");
const name = readValue(parts[0]).replace(/%3D/g, "=");
if (name === client.cookie.preview) {
value = readValue(parts.slice(1).join("="));
continue;
}
}
return value;
}
exports.PrismicPreviewClient = PrismicPreviewClient;
//# sourceMappingURL=PrismicPreviewClient.cjs.map