hydrogen-sanity
Version:
Sanity.io toolkit for Hydrogen
133 lines (130 loc) • 4.52 kB
JavaScript
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