UNPKG

@nuxtjs/prismic

Version:

Easily connect your Nuxt application to your content hosted on Prismic

114 lines (113 loc) 3.47 kB
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 } }; } });