Source data from Prismic with GraphQL
This plugin will require graphql enabled in your Prismic instance.
The feature is currently in alpha and not recommended in production. However that being said, by using Gatsby you have the garantee of production builds to never break as they are statically compiled.
Install module
npm install --save gatsby-source-prismic-graphql
Add plugin to gatsby-config.js
:
{
resolve: 'gatsby-source-prismic-graphql',
options: {
repositoryName: 'gatsby-source-prismic-test-site', // (required)
accessToken: '...', // (optional)
path: '/preview', // (optional, default: /preview)
previews: true, // (optional, default: false)
}
}
Edit your gatsby-browser.js
:
const { registerResolvers } = require('gatsby-source-prismic-graphql');
const { linkResolver } = require('./src/utils/linkResolver');
registerResolvers(linkResolver);
It is very easy to fetch data from prismic.
You need to create a page from gatsby node and wrap the createPages
function in the createPages
exposed by this plugin
without the plugin
exports.createPages = async ({graphql, actions}) => {
// gatsby code
}
with the plugin
exports.createPages = createPages(async ({graphql, actions}) => {
// gatsby code
})
Once you've done this, you have two ways to create pages:
- createPage: A function exposed by gatsby to create a regular page
- createPrismicPage: A wrapper function that implements some mechanism to allow your component to be filled dynamically in case you're in a preview
A regular page:
createPage({
path: `/blogpost/${edge.node._meta.uid}`,
component: path.resolve(path.join(__dirname, './src/components/blogpost.js')),
context: {
// some context
}
});
A prismic page:
createPrismicPage({
pattern: `/blogpost/:uid`,
params: {
uid: edge.node._meta.uid
},
component: path.resolve(path.join(__dirname, './src/components/blogpost.js')),
context: {
data: edge.node
}
});
To be able to generate pages with embedded previews, you'll have to set specific options while creating a prismic page:
pattern
: It represents the model of the url of your page with parameters likeuid
. It looks like the expresss.js model/blogpost/:uid
params
: This property represents all the url parameters that will be combine later by the plugin with the patternparams.uid
: If you have a url which rely on a prismicuid
, you must explicitely put auid
param in your patternparams.lang
: If you have a url which rely on the language so you can fetch your content accordingly from prismic, you must explicitely put alang
param in your pattern
context.data
: When you create a prismic page, you need to provide the prismic document data asdata
option in yourcontext
so we can retrieve it and deliver it to your component.
You can refer to the examples above
You can enable previews by setting options.previews = true
in gatsby-config.js
.
To fetch the content in preview, this plugin will generate a preview query based on the original query made in gatsby-node.js
.
In case it requires a uid and a lang, it will be taken from the url and injected in the preview query.
You have full control over your page components and use the built in higher order component like this:
import React from 'react'
import { RichText } from 'prismic-reactjs'
import { linkResolver } from '../prismic/linkResolver'
import { withPreview } from 'gatsby-source-prismic-graphql'
const BlogPost = (props) => {
const data = props.pageContext.data
return (
<div id="blogpost">
<h1>{RichText.asText(data.title)}</h1>
{RichText.render(data.body, linkResolver)}
</div>
)
}
export default withPreview(BlogPost)
-
The plugin creates a new page at
/preview
(by default, you can change this), that will be your preview URL you setup in the Prismic admin interface.It will automatically set cookies based on the query parameters and attempt to find the correct page to redirect to with your linkResolver.
-
Once redirected to a page with the content, everything will load normally.
In the background, the plugin takes your original gatsby graphql query, extracts the prismic subquery and uses it to make a graphql request to Prismic with a preview reference.
Once data is received, it will update the
data
prop with merged data from Prismic preview and re-render the component.
This plugin does not have gatsby-plugin-sharp support.
Please raise an issue on GitHub if you have any problems.