@prismicio/next
Version:
Helpers to integrate Prismic into Next.js apps
78 lines (65 loc) • 2.17 kB
text/typescript
import type { LinkResolverFunction, Client } from "@prismicio/client";
import type { NextApiRequestLike, NextApiResponseLike } from "./types";
export type RedirectToPreviewURLConfig = {
/** The Prismic client configured for the preview session's repository. */
// `Pick` is used to use the smallest possible subset of
// `prismic.Client`. Doing this reduces the surface area for breaking
// type changes.
client: Pick<Client, "resolvePreviewURL">;
/**
* The `req` object from a Next.js API route.
*
* @see Next.js API route docs: \<https://nextjs.org/docs/pages/building-your-application/routing/api-routes\>
*/
req: NextApiRequestLike;
/**
* The `res` object from a Next.js API route.
*
* @see Next.js API route docs: \<https://nextjs.org/docs/pages/building-your-application/routing/api-routes\>
*/
res: NextApiResponseLike;
/**
* A Link Resolver used to resolve the previewed document's URL.
*
* @see To learn more about Link Resolver: {@link https://prismic.io/docs/core-concepts/link-resolver-route-resolver}
*/
linkResolver?: LinkResolverFunction;
/**
* The default redirect URL if a URL cannot be determined for the previewed
* document.
*
* **Note**: If you `next.config.js` file contains a `basePath`, the
* `defaultURL` option must _not_ include it. Instead, provide the `basePath`
* property using the `basePath` option.
*/
defaultURL?: string;
/**
* The `basePath` for the Next.js app as it is defined in `next.config.js`.
* This option can be omitted if the app does not have a `basePath`.
*
* @remarks
* The Router Handler or API route is unable to detect the app's `basePath`
* automatically. It must be provided to `redirectToPreviewURL()` manually.
*/
basePath?: string;
};
export async function redirectToPreviewURL(
config: RedirectToPreviewURLConfig,
): Promise<void> {
const {
client,
req,
res,
linkResolver,
defaultURL = "/",
basePath = "",
} = config;
const previewToken = req.query.token?.toString();
const previewURL = await client.resolvePreviewURL({
linkResolver,
defaultURL,
previewToken,
});
res.redirect(basePath + previewURL);
return;
}