hydrogen-sanity
Version:
Sanity.io toolkit for Hydrogen
83 lines (67 loc) • 2.49 kB
text/typescript
import {validatePreviewUrl} from '@sanity/preview-url-secret'
import type {HydrogenSession} from '@shopify/hydrogen'
import {type ActionFunction, json, type LoaderFunction, redirect} from '@shopify/remix-oxygen'
import type {SanityContext} from '../context'
import {assertSession} from '../utils'
/**
* A `POST` request to this route will exit preview mode
*/
export const action: ActionFunction = async ({context, request}) => {
if (request.method !== 'POST') {
return json({message: 'Method not allowed'}, 405)
}
try {
const {session} = context
if (!assertSession(session)) {
throw new Error('Session is not an instance of HydrogenSession')
}
// TODO: make this a callback? `onExitPreview`?
await session.unset('projectId')
// TODO: confirm that the redirect and setting cookie has to happen here?
return redirect('/')
} catch (error) {
console.error(error)
throw new Response('Unable to disable preview mode. Please check your preview configuration', {
status: 500,
})
}
}
/**
* A `GET` request to this route will enter preview mode
*/
export const loader: LoaderFunction = async ({context, request}) => {
try {
// TODO: to remove
const {sanity, session} = context as {sanity: SanityContext; session: HydrogenSession}
const projectId = sanity.client.config().projectId
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 (!projectId) {
throw new Error('No `projectId` found in the client config.')
}
if (!assertSession(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 = '/'} = await validatePreviewUrl(clientWithToken, request.url)
if (!isValid) {
return new Response('Invalid secret', {status: 401})
}
// TODO: make this a callback? `onEnterPreview`?
await session.set('projectId', projectId)
// TODO: confirm that the redirect and setting cookie has to happen here?
return redirect(redirectTo)
} catch (error) {
console.error(error)
throw new Response('Unable to enable preview mode. Please check your preview configuration', {
status: 500,
})
}
}