diff --git a/src/kit/PrismicPreview.svelte b/src/kit/PrismicPreview.svelte index d315fb7..cfff946 100644 --- a/src/kit/PrismicPreview.svelte +++ b/src/kit/PrismicPreview.svelte @@ -1,7 +1,7 @@ diff --git a/src/kit/redirectToPreviewURL.ts b/src/kit/redirectToPreviewURL.ts index 9af043f..af9c063 100644 --- a/src/kit/redirectToPreviewURL.ts +++ b/src/kit/redirectToPreviewURL.ts @@ -1,4 +1,5 @@ import * as prismic from "@prismicio/client"; +import { Cookies } from "@sveltejs/kit"; export type RedirectToPreviewURLConfig = { /** @@ -16,11 +17,23 @@ export type RedirectToPreviewURLConfig = { */ request: Request; + /** + * The `cookies` object from a `+server` file. + * + * @see SvelteKit `+server` docs: \ + */ + cookies: Cookies; + /** * The default redirect URL if a URL cannot be determined for the previewed * document. */ defaultURL?: string; + + /** + * The route parameter prefixed during preview sessions. + */ + routePrefix?: string; }; /** @@ -49,6 +62,7 @@ export const redirectToPreviewURL = async ( new URL(config.request.url).searchParams.get("token") ?? undefined; const documentID = new URL(config.request.url).searchParams.get("documentId") ?? undefined; + const routePrefix = config.routePrefix ?? "preview"; const previewURL = await config.client.resolvePreviewURL({ previewToken, @@ -56,10 +70,19 @@ export const redirectToPreviewURL = async ( defaultURL: config.defaultURL || "/", }); + // Prevent a flash of non-preview content by setting the preview token + // on the initial page load. + if (previewToken) { + config.cookies.set(prismic.cookie.preview, previewToken, { + path: "/", + httpOnly: false, + }); + } + return new Response(undefined, { status: 307, headers: { - Location: previewURL, + Location: "/" + routePrefix + previewURL, }, }); };