UNPKG

hydrogen-sanity

Version:
133 lines (130 loc) 4.52 kB
import { validatePreviewUrl } from '@sanity/preview-url-secret'; import { redirect } from 'react-router'; import { isHydrogenSession, sanitizePerspective, isSanityPreviewSession } from '../_chunks-es/utils.js'; function getSession(context) { const preview = context.sanity?.preview; const session = preview && "session" in preview && preview.session ? preview.session : context.session; return session; } const action = async ({ context, request }) => { switch (request.method) { case "POST": case "DELETE": { try { const session = getSession(context); const headers = new Headers(); if (isSanityPreviewSession(session)) { headers.set("Set-Cookie", await session.destroy()); } else if (isHydrogenSession(session)) { session.unset("projectId"); session.unset("perspective"); headers.set("Set-Cookie", await session.commit()); } return redirect("/", { headers }); } catch (error) { console.error(error); throw new Response( "Unable to disable preview mode. Please check your preview configuration", { status: 500 } ); } } case "PUT": { try { const sanity = context.sanity; if (!sanity.preview) { return new Response("Preview mode is not enabled in this environment.", { status: 403 }); } if (!sanity.preview.token) { throw new Error("Enabling preview mode requires a token."); } if (!sanity.preview) { return new Response("Preview mode is not enabled in this environment.", { status: 403 }); } if (!sanity.preview.token) { throw new Error("Enabling preview mode requires a token."); } const session = getSession(context); if (!isHydrogenSession(session)) { throw new Error("Session is not an instance of HydrogenSession"); } const projectId = sanity.client.config().projectId; if (!projectId) { throw new Error("No `projectId` found in the client config."); } const sessionProjectId = session.get("projectId"); if (sessionProjectId && sessionProjectId !== projectId) { return new Response("Invalid projectId", { status: 400 }); } const formData = await request.formData(); const perspective = sanitizePerspective(formData.get("perspective")); session.set("perspective", Array.isArray(perspective) ? perspective.join(",") : perspective); return new Response("OK", { status: 200, headers: { "Set-Cookie": await session.commit() } }); } catch (error) { console.error(error); throw new Response( "Unable to enable preview mode. Please check your preview configuration", { status: 500 } ); } } default: return new Response("Method not allowed", { status: 405 }); } }; const loader = async ({ context, request }) => { try { const session = getSession(context); const sanity = context.sanity; if (!sanity.preview) { return new Response("Preview mode is not enabled in this environment.", { status: 403 }); } if (!sanity.preview.token) { throw new Error("Enabling preview mode requires a token."); } const projectId = sanity.client.config().projectId; if (!projectId) { throw new Error("No `projectId` found in the client config."); } if (!isHydrogenSession(session)) { throw new Error("Session is not an instance of HydrogenSession"); } const clientWithToken = sanity.client.withConfig({ useCdn: false, token: sanity.preview.token }); const { isValid, redirectTo = "/", studioPreviewPerspective = "drafts" } = await validatePreviewUrl(clientWithToken, request.url); if (!isValid) { return new Response("Invalid secret", { status: 401 }); } session.set("projectId", projectId); session.set("perspective", studioPreviewPerspective); return redirect(redirectTo, { headers: { "Set-Cookie": await session.commit() } }); } catch (error) { console.error(error); throw new Response("Unable to enable preview mode. Please check your preview configuration", { status: 500 }); } }; export { action, loader }; //# sourceMappingURL=route.js.map