Created
December 6, 2020 21:19
-
-
Save leemac/c709b258d34b5c82e5bf99b6ac096cdb to your computer and use it in GitHub Desktop.
Gatsby changes to hide drafts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const path = require(`path`) | |
const { createFilePath } = require(`gatsby-source-filesystem`) | |
const isProduction = process.env.NODE_ENV === `production`; | |
exports.createPages = async ({ graphql, actions, reporter }) => { | |
const { createPage } = actions | |
// Define a template for blog post | |
const blogPost = path.resolve(`./src/templates/blog-post.js`) | |
// Get all markdown blog posts sorted by date | |
const result = await graphql( | |
` | |
{ | |
allMarkdownRemark( | |
sort: { fields: [frontmatter___date], order: ASC } | |
limit: 1000 | |
) { | |
nodes { | |
id | |
fields { | |
slug, | |
isDraft | |
} | |
} | |
} | |
} | |
` | |
) | |
if (result.errors) { | |
reporter.panicOnBuild( | |
`There was an error loading your blog posts`, | |
result.errors | |
) | |
return | |
} | |
const posts = result.data.allMarkdownRemark.nodes | |
// Create blog posts pages | |
// But only if there's at least one markdown file found at "content/blog" (defined in gatsby-config.js) | |
// `context` is available in the template as a prop and as a variable in GraphQL | |
if (posts.length > 0) { | |
posts.forEach((post, index) => { | |
// Do not expose drafts as pages | |
if(post.fields.isDraft && isProduction) { | |
return; | |
} | |
const previousPostId = index === 0 ? null : posts[index - 1].id | |
const nextPostId = index === posts.length - 1 ? null : posts[index + 1].id | |
createPage({ | |
path: post.fields.slug, | |
component: blogPost, | |
context: { | |
id: post.id, | |
previousPostId, | |
nextPostId, | |
}, | |
}) | |
}) | |
} | |
} | |
exports.onCreateNode = ({ node, actions, getNode }) => { | |
const { createNodeField } = actions | |
if (node.internal.type === `MarkdownRemark`) { | |
const slug = createFilePath({ node, getNode }) | |
createNodeField({ | |
name: `slug`, | |
node, | |
value: slug, | |
}); | |
if(isProduction) { | |
const isDraft = slug.indexOf('/draft') === 0; | |
createNodeField({ | |
name: `isDraft`, | |
node, | |
value: isDraft, | |
}) | |
} | |
} | |
} | |
exports.createSchemaCustomization = ({ actions }) => { | |
const { createTypes } = actions | |
// Explicitly define the siteMetadata {} object | |
// This way those will always be defined even if removed from gatsby-config.js | |
// Also explicitly define the Markdown frontmatter | |
// This way the "MarkdownRemark" queries will return `null` even when no | |
// blog posts are stored inside "content/blog" instead of returning an error | |
createTypes(` | |
type SiteSiteMetadata { | |
author: Author | |
siteUrl: String | |
social: Social | |
} | |
type Author { | |
name: String | |
summary: String | |
} | |
type Social { | |
twitter: String | |
} | |
type MarkdownRemark implements Node { | |
frontmatter: Frontmatter | |
fields: Fields | |
} | |
type Frontmatter { | |
title: String | |
description: String | |
date: Date @dateformat | |
} | |
type Fields { | |
slug: String, | |
isDraft: Boolean | |
} | |
`) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// src/pages/index.js | |
import React from "react" | |
import { Link, graphql } from "gatsby" | |
import Bio from "../components/bio" | |
import Layout from "../components/layout" | |
import SEO from "../components/seo" | |
const BlogIndex = ({ data, location }) => { | |
const siteTitle = data.site.siteMetadata?.title || `Title` | |
const posts = data.allMarkdownRemark.nodes.filter(n => { | |
if(n.fields['isDraft']) { | |
return false; | |
} | |
return true; | |
}); | |
if (posts.length === 0) { | |
return ( | |
<Layout location={location} title={siteTitle}> | |
<SEO title="All posts" /> | |
<Bio /> | |
<p> | |
No blog posts found. Add markdown posts to "content/blog" (or the | |
directory you specified for the "gatsby-source-filesystem" plugin in | |
gatsby-config.js). | |
</p> | |
</Layout> | |
) | |
} | |
return ( | |
<Layout location={location} title={siteTitle}> | |
<SEO title="All posts" /> | |
<Bio /> | |
<ol style={{ listStyle: `none` }}> | |
{posts.map(post => { | |
const title = post.frontmatter.title || post.fields.slug | |
return ( | |
<li key={post.fields.slug}> | |
<article | |
className="post-list-item" | |
itemScope | |
itemType="http://schema.org/Article" | |
> | |
<header> | |
<h2> | |
<Link to={post.fields.slug} itemProp="url"> | |
<span itemProp="headline">{title}</span> | |
</Link> | |
</h2> | |
<small>{post.frontmatter.date}</small> | |
</header> | |
<section> | |
<p | |
dangerouslySetInnerHTML={{ | |
__html: post.frontmatter.description || post.excerpt, | |
}} | |
itemProp="description" | |
/> | |
</section> | |
</article> | |
</li> | |
) | |
})} | |
</ol> | |
</Layout> | |
) | |
} | |
export default BlogIndex | |
export const pageQuery = graphql` | |
query { | |
site { | |
siteMetadata { | |
title | |
} | |
} | |
allMarkdownRemark(sort: { fields: [frontmatter___date], order: DESC }) { | |
nodes { | |
excerpt | |
fields { | |
slug, | |
isDraft | |
} | |
frontmatter { | |
date(formatString: "MMMM DD, YYYY") | |
title | |
description | |
} | |
} | |
} | |
} | |
` |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment