@nuxtjs/prismic
Version:
Easily connect your Nuxt application to your content hosted on Prismic
114 lines (113 loc) • 3.47 kB
JavaScript
import { defineNuxtPlugin } from "#app";
import NuxtLink from "#app/components/nuxt-link";
import _client from "#build/prismic/proxy/client";
import linkResolver from "#build/prismic/proxy/linkResolver";
import richTextComponents from "#build/prismic/proxy/richTextComponents";
import {
onNuxtReady,
refreshNuxtData,
useCookie,
useHead,
useRequestEvent,
useRouter,
useRuntimeConfig
} from "#imports";
import { Client, cookie, createClient, getToolbarSrc } from "@prismicio/client";
import { createPrismic } from "@prismicio/vue";
export default defineNuxtPlugin({
name: "prismic:setup",
parallel: true,
async setup(nuxtApp) {
const options = useRuntimeConfig().public.prismic;
const client = await resolveClient();
handlePreview();
addToolbar();
async function resolveClient() {
if (_client instanceof Client) {
return _client;
} else if (typeof _client === "function") {
try {
return await nuxtApp.runWithContext(
() => _client()
);
} catch (error) {
console.error(
"[@nuxtjs/prismic] An error happened while resolving your Prismic custom client, disabling Prismic module gracefully...",
error
);
return createClient(
"error-resolving-custom-client",
options.clientConfig
);
}
} else {
return createClient(
options.environment || options.endpoint || "endpoint-not-provided",
options.clientConfig
);
}
}
function handlePreview() {
if (options.preview) {
const previewCookie = useCookie("io.prismic.preview").value;
if (import.meta.server) {
const req = useRequestEvent()?.node.req;
if (req) {
client.enableAutoPreviewsFromReq(req);
}
}
if (previewCookie) {
try {
const session = typeof previewCookie === "string" ? JSON.parse(decodeURIComponent(previewCookie)) : previewCookie;
if (Object.keys(session).some(
(key) => key in session && typeof session[key] === "object" && session[key] !== null && "preview" in session[key] && session[key].preview
)) {
let afterEachCalled = false;
onNuxtReady(() => {
if (!afterEachCalled) {
refreshNuxtData();
}
});
useRouter().afterEach(() => {
afterEachCalled = true;
refreshNuxtData();
});
}
} catch (error) {
console.warn("Failed to parse Prismic preview cookie", error);
}
}
}
}
function addToolbar() {
if (options.toolbar) {
useHead({
script: [
{
key: "prismic-preview",
src: getToolbarSrc(client.repositoryName),
async: true,
defer: true,
crossorigin: "anonymous"
}
]
});
} else {
useCookie(cookie.preview).value = null;
}
}
const prismicPlugin = createPrismic({
client,
linkResolver,
components: {
linkInternalComponent: NuxtLink,
linkExternalComponent: NuxtLink,
richTextComponents
}
});
nuxtApp.vueApp.use(prismicPlugin);
return {
provide: { prismic: prismicPlugin }
};
}
});