This package aims to simplify integrating Next.js, and the Sanity.io CMS. It gives you simple functions for setting up sanity, fetching static props, and using live previews as per https://www.sanity.io/blog/live-preview-with-nextjs Checkout out the sanity starter template at https://github.com/otterdev-io/sanity-template-nextjs-vercel-extra to see an example of usage.
First to setup the functions, create a module, eg lib/sanity.js
. Call setupNextSanity(config)
to get your helper functions:
import { setupNextSanity } from "next-sanity-extra"
// Standard sanity config
// Don't forget token, to get a preview client and authenticated client
const config = {
projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID,
dataset: process.env.NEXT_PUBLIC_SANITY_DATASET,
useCdn: process.env.NODE_ENV === "production",
token: process.env.SANITY_API_TOKEN
};
export const {
sanityClient,
imageUrlBuilder,
PortableText,
sanityStaticProps,
useSanityQuery
} = setupNextSanity(config);
Then you can use the functions in a page, eg pages/index.jsx
:
import { sanityStaticProps, useSanityQuery, PortableText } from "../lib/sanity";
import groq from "next-sanity";
const myQuery = groq`*[ etc... ]`;
export const getStaticProps = async (context) => ({
props: await sanityStaticProps({context, query: myQuery})
});
export default function ServicesPage(props) {
const { data, loading, error } = useSanityQuery(query, props);
// Render page with data
<h1>{data.title}</h1>
<PortableText blocks={data.content} />
}
To serve live previews, create eg pages/api/preview.js
.
With the default settings - forwarding to /[slug]:
import previewApi from 'next-sanity-extra/api/preview'
export default previewApi({token: process.env.SANITY_PREVIEW_TOKEN})
to forward to custom parameter - eg 'page'
import previewApi from 'next-sanity-extra/api/preview'
export default previewApi({
token: process.env.SANITY_PREVIEW_TOKEN,
redirect: (req) => `/${req.query.page}`
});
import { setupNextSanity } from "next-sanity-extra"
setupNextSanity(client: ClientConfig, serializers?: PortableTextSerializers)
Returns an object with functions you can use to ease integration:
sanityClient('anonymous' | 'authenticated' | 'preview')
- A sanity client with a given setup. Token must be set in order to use authenticated or previewimageUrlBuilder
- A ImageUrlBuilderPortableText
- Portable Text componentsanityStaticProps({context, query, queryParams, authenticated})
- Returns static props for getStaticProps.context
- the context passed into getStaticPropsquery
- the query to run for the page.queryParams
- [optional] params to substitute into the query. If not provided, will be taken from context.params.authenticated
- [optional] whether to use an authenticated sanity client, if you have provided token to config. Defaults to false.
useSanityPreview(query, props)
- A hook which returns preview-enabled data for use in each page.query
- the query to run for the pageprops
- props passed into the page component
import previewApi from "next-sanity-extra/api/preview"
previewApi({token, data, redirect})
- API handler to call from sanity for page previews:
token
- Sanity API Tokendata
- [optional] Function from request to preview data to return to clientredirect
- [optional] Function from request to a path to redirect to. Defaults to/${req.query.slug}
eg pages/index.tsx
:
import { sanityStaticProps, useSanityQuery, PortableText } from "../lib/sanity";
import groq from "next-sanity";
import { GetStaticPropsContext } from "next";
import { SanityProps } from "next-sanity-extra";
const myQuery = groq`*[ etc... ]`;
export const getStaticProps: GetStaticProps = async (context) => ({
props: sanityStaticProps({context, query: myQuery})
})
// Optionally type your page's data:
// SanityProps<{title: string, etc...}>
// Otherwise just use SanityProps
export default function ServicesPage(props: SanityProps) {
const { data, loading, error } = useSanityQuery(query, props);
// Render page with data
<h1>{data.title}</h1>
<PortableText blocks={data.content} />
}