mirror of
https://github.com/LukeHagar/unicorn-utterances.git
synced 2025-12-09 12:57:45 +00:00
Merge branch 'integration' into filter-listbox-refactor
# Conflicts: # src/components/dropdown-button/dropdown-button.js # src/components/filter-search-bar/filter-listbox/filter-listbox.js # src/utils/a11y/useSelectRef.js # src/utils/useLunr.js # src/utils/useOutsideClick.js # src/utils/useRefBoundingBox.js # src/utils/useWindowSize.js
This commit is contained in:
313
gatsby-node.js
313
gatsby-node.js
@@ -1,134 +1,213 @@
|
||||
const path = require(`path`)
|
||||
const fs = require("fs")
|
||||
const { createFilePath } = require(`gatsby-source-filesystem`)
|
||||
const path = require(`path`);
|
||||
const fs = require("fs");
|
||||
const { createFilePath } = require(`gatsby-source-filesystem`);
|
||||
|
||||
exports.onCreateNode = ({ node, actions, getNode }) => {
|
||||
const { createNodeField } = actions
|
||||
const { createNodeField } = actions;
|
||||
|
||||
if (node.internal.type === `MarkdownRemark`) {
|
||||
const value = createFilePath({
|
||||
node,
|
||||
getNode,
|
||||
})
|
||||
createNodeField({
|
||||
name: `slug`,
|
||||
node,
|
||||
value,
|
||||
})
|
||||
}
|
||||
if (node.internal.type === `MarkdownRemark`) {
|
||||
const value = createFilePath({
|
||||
node,
|
||||
getNode
|
||||
});
|
||||
createNodeField({
|
||||
name: `slug`,
|
||||
node,
|
||||
value
|
||||
});
|
||||
}
|
||||
|
||||
if (node.internal.type === `UnicornsJson`) {
|
||||
const value = createFilePath({
|
||||
node,
|
||||
getNode,
|
||||
})
|
||||
createNodeField({
|
||||
name: `slug`,
|
||||
node,
|
||||
value,
|
||||
})
|
||||
}
|
||||
}
|
||||
if (node.internal.type === `UnicornsJson`) {
|
||||
const value = createFilePath({
|
||||
node,
|
||||
getNode
|
||||
});
|
||||
createNodeField({
|
||||
name: `slug`,
|
||||
node,
|
||||
value
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
exports.sourceNodes = ({ getNodesByType, actions: { createNodeField } }) => {
|
||||
const postNodes = getNodesByType(`MarkdownRemark`)
|
||||
const unicornNodes = getNodesByType(`UnicornsJson`)
|
||||
const postNodes = getNodesByType(`MarkdownRemark`);
|
||||
const unicornNodes = getNodesByType(`UnicornsJson`);
|
||||
|
||||
unicornNodes.forEach(unicornNode => {
|
||||
const isAuthor = postNodes.some(post => post.frontmatter.author === unicornNode.id)
|
||||
unicornNodes.forEach(unicornNode => {
|
||||
const isAuthor = postNodes
|
||||
// Ensure it's actually a post
|
||||
.filter(post => !!post.frontmatter.authors)
|
||||
.some(post => {
|
||||
return post.frontmatter.authors.includes(unicornNode.id);
|
||||
});
|
||||
|
||||
createNodeField({
|
||||
name: `isAuthor`,
|
||||
node: unicornNode,
|
||||
value: isAuthor,
|
||||
})
|
||||
})
|
||||
}
|
||||
createNodeField({
|
||||
name: `isAuthor`,
|
||||
node: unicornNode,
|
||||
value: isAuthor
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
exports.createPages = ({ graphql, actions }) => {
|
||||
const { createPage, createNodeField } = actions
|
||||
const { createPage } = actions;
|
||||
|
||||
const blogPost = path.resolve(`./src/templates/blog-post.js`)
|
||||
const blogProfile = path.resolve(`./src/templates/blog-profile.js`)
|
||||
return graphql(
|
||||
`
|
||||
{
|
||||
allMarkdownRemark(
|
||||
sort: {fields: [frontmatter___published], order: DESC},
|
||||
filter: {fileAbsolutePath: {regex: "/content/blog/"}},
|
||||
limit: 1000
|
||||
) {
|
||||
edges {
|
||||
node {
|
||||
fields {
|
||||
slug
|
||||
}
|
||||
frontmatter {
|
||||
title
|
||||
author {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
allUnicornsJson(limit: 100) {
|
||||
edges {
|
||||
node {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
).then(result => {
|
||||
if (result.errors) {
|
||||
throw result.errors
|
||||
}
|
||||
const blogPost = path.resolve(`./src/templates/blog-post.js`);
|
||||
const blogProfile = path.resolve(`./src/templates/blog-profile.js`);
|
||||
const postList = path.resolve(`./src/templates/post-list.js`);
|
||||
return graphql(
|
||||
`
|
||||
{
|
||||
allMarkdownRemark(
|
||||
sort: { fields: [frontmatter___published], order: DESC }
|
||||
filter: { fileAbsolutePath: { regex: "/content/blog/" } }
|
||||
limit: 1000
|
||||
) {
|
||||
edges {
|
||||
node {
|
||||
fields {
|
||||
slug
|
||||
}
|
||||
frontmatter {
|
||||
title
|
||||
authors {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
allUnicornsJson(limit: 100) {
|
||||
edges {
|
||||
node {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
).then(result => {
|
||||
if (result.errors) {
|
||||
throw result.errors;
|
||||
}
|
||||
|
||||
// Create blog posts pages.
|
||||
const posts = result.data.allMarkdownRemark.edges
|
||||
const unicorns = result.data.allUnicornsJson.edges
|
||||
// Create blog posts pages.
|
||||
const posts = result.data.allMarkdownRemark.edges;
|
||||
const unicorns = result.data.allUnicornsJson.edges;
|
||||
|
||||
posts.forEach((post, index, arr) => {
|
||||
const previous = index === arr.length - 1 ? null : arr[index + 1].node
|
||||
const next = index === 0 ? null : arr[index - 1].node
|
||||
posts.forEach((post, index, arr) => {
|
||||
const previous = index === arr.length - 1 ? null : arr[index + 1].node;
|
||||
const next = index === 0 ? null : arr[index - 1].node;
|
||||
|
||||
const postInfo = post.node.frontmatter
|
||||
if (postInfo.attached && postInfo.attached.length > 0) {
|
||||
postInfo.attached.forEach(({ file: fileStr }) => {
|
||||
const postPath = post.node.fields.slug
|
||||
const relFilePath = path.join(__dirname, "static", "posts", postPath, fileStr)
|
||||
const fileExists = fs.existsSync(path.resolve(relFilePath))
|
||||
if (!fileExists) {
|
||||
console.error(`Could not find file to attach in the static folder: ${postPath}${fileStr}`)
|
||||
console.error(`To fix this problem, attach the file to the static folder's expected path above, or remove it from the post frontmatter definition`)
|
||||
process.exit(1)
|
||||
}
|
||||
})
|
||||
}
|
||||
const postInfo = post.node.frontmatter;
|
||||
if (postInfo.attached && postInfo.attached.length > 0) {
|
||||
postInfo.attached.forEach(({ file: fileStr }) => {
|
||||
const postPath = post.node.fields.slug;
|
||||
const relFilePath = path.join(
|
||||
__dirname,
|
||||
"static",
|
||||
"posts",
|
||||
postPath,
|
||||
fileStr
|
||||
);
|
||||
const fileExists = fs.existsSync(path.resolve(relFilePath));
|
||||
if (!fileExists) {
|
||||
console.error(
|
||||
`Could not find file to attach in the static folder: ${postPath}${fileStr}`
|
||||
);
|
||||
console.error(
|
||||
`To fix this problem, attach the file to the static folder's expected path above, or remove it from the post frontmatter definition`
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
createPage({
|
||||
path: `posts${post.node.fields.slug}`,
|
||||
component: blogPost,
|
||||
context: {
|
||||
slug: post.node.fields.slug,
|
||||
previous,
|
||||
next,
|
||||
},
|
||||
})
|
||||
})
|
||||
createPage({
|
||||
path: `posts${post.node.fields.slug}`,
|
||||
component: blogPost,
|
||||
context: {
|
||||
slug: post.node.fields.slug,
|
||||
previous,
|
||||
next
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
unicorns.forEach((unicorn) => {
|
||||
createPage({
|
||||
path: `unicorns/${unicorn.node.id}`,
|
||||
component: blogProfile,
|
||||
context: {
|
||||
slug: unicorn.node.id,
|
||||
},
|
||||
})
|
||||
})
|
||||
const postsPerPage = 8;
|
||||
const numberOfPages = Math.ceil(posts.length / postsPerPage);
|
||||
|
||||
return null
|
||||
})
|
||||
}
|
||||
createPage({
|
||||
path: `/`,
|
||||
component: postList,
|
||||
context: {
|
||||
limitNumber: postsPerPage,
|
||||
skipNumber: 0,
|
||||
pageIndex: 1,
|
||||
numberOfPages,
|
||||
relativePath: ""
|
||||
}
|
||||
});
|
||||
|
||||
for (const i of Array(numberOfPages).keys()) {
|
||||
if (i === 0) continue;
|
||||
const pageNum = i + 1;
|
||||
const skipNumber = postsPerPage * i;
|
||||
createPage({
|
||||
path: `page/${pageNum}`,
|
||||
component: postList,
|
||||
context: {
|
||||
limitNumber: postsPerPage,
|
||||
skipNumber,
|
||||
pageIndex: pageNum,
|
||||
numberOfPages,
|
||||
relativePath: ""
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
unicorns.forEach(unicorn => {
|
||||
const uniId = unicorn.node.id;
|
||||
|
||||
const uniPosts = posts.filter(({ node: { frontmatter } }) =>
|
||||
frontmatter.authors.find(uni => uni.id === uniId)
|
||||
);
|
||||
|
||||
const numberOfUniPages = Math.ceil(uniPosts.length / postsPerPage);
|
||||
|
||||
createPage({
|
||||
path: `unicorns/${unicorn.node.id}`,
|
||||
component: blogProfile,
|
||||
context: {
|
||||
slug: uniId,
|
||||
limitNumber: postsPerPage,
|
||||
skipNumber: 0,
|
||||
pageIndex: 1,
|
||||
numberOfPages: numberOfUniPages,
|
||||
relativePath: `unicorns/${uniId}`
|
||||
}
|
||||
});
|
||||
|
||||
for (const i of Array(numberOfUniPages).keys()) {
|
||||
if (i === 0) continue;
|
||||
const pageNum = i + 1;
|
||||
const skipNumber = postsPerPage * i;
|
||||
createPage({
|
||||
path: `unicorns/${uniId}/page/${pageNum}`,
|
||||
component: blogProfile,
|
||||
context: {
|
||||
slug: uniId,
|
||||
limitNumber: postsPerPage,
|
||||
skipNumber,
|
||||
pageIndex: pageNum,
|
||||
numberOfPages: numberOfUniPages,
|
||||
relativePath: `unicorns/${uniId}`
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return null;
|
||||
});
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user