next-sanity
Version:
Sanity.io toolkit for Next.js
53 lines (52 loc) • 1.84 kB
JavaScript
import { validatePreviewUrl } from "@sanity/preview-url-secret";
import { perspectiveCookieName } from "@sanity/preview-url-secret/constants";
import { cookies, draftMode } from "next/headers";
import { redirect } from "next/navigation";
/**
* Sets up an API route for enabling draft mode, can be paired with the `previewUrl.previewMode.enable` in `sanity/presentation`.
* Can also be used with `sanity-plugin-iframe-pane`.
* @example
* ```ts
* // src/app/api/draft-mode/enable/route.ts
*
* import { defineEnableDraftMode } from "next-sanity/draft-mode";
* import { client } from "@/sanity/lib/client";
*
* export const { GET } = defineEnableDraftMode({
* client: client.withConfig({ token: process.env.SANITY_API_READ_TOKEN }),
* });
* ```
*
* @public
*/
function defineEnableDraftMode(options) {
const { client } = options;
return { GET: async (request) => {
const { isValid, redirectTo = "/", studioPreviewPerspective } = await validatePreviewUrl(client, request.url);
if (!isValid) return new Response("Invalid secret", { status: 401 });
const draftModeStore = await draftMode();
if (!draftModeStore.isEnabled) draftModeStore.enable();
const isSecure = process.env.NODE_ENV === "production" || (options.secureDevMode ?? false);
const cookieStore = await cookies();
const cookie = cookieStore.get("__prerender_bypass");
cookieStore.set({
name: "__prerender_bypass",
value: cookie?.value,
httpOnly: true,
path: "/",
secure: isSecure,
sameSite: isSecure ? "none" : "lax"
});
if (studioPreviewPerspective) cookieStore.set({
name: perspectiveCookieName,
value: studioPreviewPerspective,
httpOnly: true,
path: "/",
secure: isSecure,
sameSite: isSecure ? "none" : "lax"
});
return redirect(redirectTo);
} };
}
export { defineEnableDraftMode };
//# sourceMappingURL=index.js.map