diff --git a/config.js b/config.js index a1a54c0..72cf56a 100644 --- a/config.js +++ b/config.js @@ -3,6 +3,11 @@ module.exports = { siteName: "KevinK.dev", siteAuthor: "@Unkn0wnKevin", siteURL: "https://kevink.dev", + modules: { + blog: true, + projects: true, + donation: true, + }, payPalMail: "kevin@1in9.net", siteKeywords: "Kevin Kandlbinder, Kevin, Kandlbinder, Web, Web Developer, Developer, JavaScript, PHP, Java, Photos, Fotos", diff --git a/gatsby-config.js b/gatsby-config.js index 5e2da60..28b1d5b 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -1,11 +1,101 @@ /* eslint-disable no-undef */ const extConfig = require("./config"); +const dynamicPlugins = []; + +if (extConfig.modules.blog) { + dynamicPlugins.push({ + resolve: `gatsby-plugin-feed`, + options: { + query: ` + { + site { + siteMetadata { + title + description + siteUrl + site_url: siteUrl + } + } + } + `, + feeds: [ + { + serialize: ({ query: { site, blog } }) => { + return blog.nodes.map((node) => { + if (!node.childMdx) return null; + + return { + title: node.childMdx.frontmatter.title, + description: node.childMdx.excerpt, + date: node.childMdx.frontmatter.date, + url: + site.siteMetadata.siteUrl + + `/${ + node.childMdx.frontmatter.language + }/blog/${ + node.childMdx.frontmatter.section + ? node.childMdx.frontmatter + .section + "/" + : "" + }${node.childMdx.frontmatter.published}/${ + node.childMdx.frontmatter.url + }`, + guid: + site.siteMetadata.siteUrl + + `/${ + node.childMdx.frontmatter.language + }/blog/${ + node.childMdx.frontmatter.section + ? node.childMdx.frontmatter + .section + "/" + : "" + }${node.childMdx.frontmatter.published}/${ + node.childMdx.frontmatter.url + }`, + category: node.childMdx.frontmatter.section, + }; + }); + }, + query: ` + { + blog: allFile( + filter: { sourceInstanceName: { eq: "blogContent" } } + ) { + nodes { + childMdx { + id + body + excerpt + frontmatter { + platform + tags + title + url + section + language + published(formatString: "YYYY/MM") + date: published + } + } + } + } + } + `, + output: "/blog/feed.rss", + title: extConfig.siteName + " Blog", + }, + ], + }, + }); +} + module.exports = { siteMetadata: { title: extConfig.siteName, author: extConfig.siteAuthor, siteUrl: extConfig.siteURL, + modules: extConfig.modules, keywords: extConfig.siteKeywords, payPalMail: extConfig.payPalMail, contactEmail: extConfig.contactEmail, @@ -146,89 +236,6 @@ module.exports = { generateMatchPathRewrites: false, }, }, - { - resolve: `gatsby-plugin-feed`, - options: { - query: ` - { - site { - siteMetadata { - title - description - siteUrl - site_url: siteUrl - } - } - } - `, - feeds: [ - { - serialize: ({ query: { site, blog } }) => { - return blog.nodes.map((node) => { - if (!node.childMdx) return null; - - return { - title: node.childMdx.frontmatter.title, - description: node.childMdx.excerpt, - date: node.childMdx.frontmatter.date, - url: - site.siteMetadata.siteUrl + - `/${ - node.childMdx.frontmatter.language - }/blog/${ - node.childMdx.frontmatter.section - ? node.childMdx.frontmatter - .section + "/" - : "" - }${ - node.childMdx.frontmatter.published - }/${node.childMdx.frontmatter.url}`, - guid: - site.siteMetadata.siteUrl + - `/${ - node.childMdx.frontmatter.language - }/blog/${ - node.childMdx.frontmatter.section - ? node.childMdx.frontmatter - .section + "/" - : "" - }${ - node.childMdx.frontmatter.published - }/${node.childMdx.frontmatter.url}`, - category: node.childMdx.frontmatter.section, - }; - }); - }, - query: ` - { - blog: allFile( - filter: { sourceInstanceName: { eq: "blogContent" } } - ) { - nodes { - childMdx { - id - body - excerpt - frontmatter { - platform - tags - title - url - section - language - published(formatString: "YYYY/MM") - date: published - } - } - } - } - } - `, - output: "/blog/feed.rss", - title: extConfig.siteName + " Blog", - }, - ], - }, - }, + ...dynamicPlugins, ], }; diff --git a/gatsby-node.js b/gatsby-node.js index d61d201..b1917ea 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -2,6 +2,8 @@ const path = require(`path`); const { paginate } = require("gatsby-awesome-pagination"); +const { modules: moduleConfig, languages } = require("./config.js"); + exports.createPages = async ({ actions, graphql, reporter }) => { const { createPage, createRedirect } = actions; @@ -48,129 +50,120 @@ exports.createPages = async ({ actions, graphql, reporter }) => { return; } - activity.setStatus("Generating project pages..."); + if (moduleConfig.projects) { + activity.setStatus("Generating project pages..."); - result.data.allProjectsJson.nodes.forEach((node) => { - if (node.lang === "ignoreme") return; - - reporter.info( - "Creating Page: " + `/${node.lang}/projects/${node.urlname}` - ); - - createPage({ - path: `/${node.lang}/projects/${node.urlname}`, - component: projectTemplate, - context: { - lang: node.lang, - urlname: node.urlname, - }, - }); - }); - - activity.setStatus("Generating blog pages..."); - - const blogListingTemplate = path.resolve(`src/templates/blogListing.js`); - const blogTemplate = path.resolve(`src/templates/blogPost.js`); - - reporter.info("Creating blog listings..."); - - ["en", "de"].forEach((lang) => - paginate({ - createPage, - items: result.data.blog.nodes, - itemsPerPage: 10, - pathPrefix: `/${lang}/blog`, - component: blogListingTemplate, - context: { - lang, - }, - }) - ); - - let processedSections = ["blog"]; - - result.data.blog.nodes.forEach((node) => { - if (!node.childMdx) return; - - if ( - !processedSections.includes( - node.childMdx.frontmatter.section ?? "blog" - ) - ) { - processedSections.push(node.childMdx.frontmatter.section); + result.data.allProjectsJson.nodes.forEach((node) => { + if (node.lang === "ignoreme") return; reporter.info( - "Creating section listing for " + - node.childMdx.frontmatter.section + - "..." + "Creating Page: " + `/${node.lang}/projects/${node.urlname}` ); - ["en", "de"].forEach((lang) => - paginate({ - createPage, - items: result.data.blog.nodes.filter( - (e) => - e.childMdx.frontmatter.section === - node.childMdx.frontmatter.section - ), - itemsPerPage: 10, - pathPrefix: `/${lang}/blog/${node.childMdx.frontmatter.section}`, - component: blogListingTemplate, - context: { - lang, - section: node.childMdx.frontmatter.section, - }, - }) - ); - } + createPage({ + path: `/${node.lang}/projects/${node.urlname}`, + component: projectTemplate, + context: { + lang: node.lang, + urlname: node.urlname, + }, + }); + }); + } - reporter.info( - "Creating Page: " + - `/${node.childMdx.frontmatter.language}/blog/${ - node.childMdx.frontmatter.section ?? "blog" - }/${node.childMdx.frontmatter.url}` + if (moduleConfig.blog) { + activity.setStatus("Generating blog pages..."); + + const blogListingTemplate = path.resolve( + `src/templates/blogListing.js` + ); + const blogTemplate = path.resolve(`src/templates/blogPost.js`); + + reporter.info("Creating blog listings..."); + + languages.forEach((lang) => + paginate({ + createPage, + items: result.data.blog.nodes, + itemsPerPage: 10, + pathPrefix: `/${lang}/blog`, + component: blogListingTemplate, + context: { + lang, + }, + }) ); - createPage({ - path: `/${node.childMdx.frontmatter.language}/blog/${ - node.childMdx.frontmatter.section - ? node.childMdx.frontmatter.section + "/" - : "" - }${node.childMdx.frontmatter.published}/${ - node.childMdx.frontmatter.url - }`, - component: blogTemplate, - context: { - mdxId: node.childMdx.id, - lang: node.childMdx.frontmatter.language, - }, - }); + let processedSections = ["blog"]; - ["en", "de"].forEach((lang) => { - if (lang === node.childMdx.frontmatter.language) return; + result.data.blog.nodes.forEach((node) => { + if (!node.childMdx) return; - createRedirect({ - fromPath: `/${lang}/blog/${ + if ( + !processedSections.includes( + node.childMdx.frontmatter.section ?? "blog" + ) + ) { + processedSections.push(node.childMdx.frontmatter.section); + + reporter.info( + "Creating section listing for " + + node.childMdx.frontmatter.section + + "..." + ); + + languages.forEach((lang) => + paginate({ + createPage, + items: result.data.blog.nodes.filter( + (e) => + e.childMdx.frontmatter.section === + node.childMdx.frontmatter.section + ), + itemsPerPage: 10, + pathPrefix: `/${lang}/blog/${node.childMdx.frontmatter.section}`, + component: blogListingTemplate, + context: { + lang, + section: node.childMdx.frontmatter.section, + }, + }) + ); + } + + reporter.info( + "Creating Page: " + + `/${node.childMdx.frontmatter.language}/blog/${ + node.childMdx.frontmatter.section ?? "blog" + }/${node.childMdx.frontmatter.url}` + ); + + createPage({ + path: `/${node.childMdx.frontmatter.language}/blog/${ node.childMdx.frontmatter.section ? node.childMdx.frontmatter.section + "/" : "" }${node.childMdx.frontmatter.published}/${ node.childMdx.frontmatter.url }`, - toPath: `/${node.childMdx.frontmatter.language}/blog/${ - node.childMdx.frontmatter.section - ? node.childMdx.frontmatter.section + "/" - : "" - }${node.childMdx.frontmatter.published}/${ - node.childMdx.frontmatter.url - }`, - redirectInBrowser: true, - permanent: true, + component: blogTemplate, + context: { + mdxId: node.childMdx.id, + lang: node.childMdx.frontmatter.language, + }, }); - if (node.childMdx.frontmatter.section === "scambox") { + languages.forEach((lang) => { + if (lang === node.childMdx.frontmatter.language) return; + createRedirect({ - fromPath: `/${lang}/scambox/${node.childMdx.frontmatter.url}`, + fromPath: `/${lang}/blog/${ + node.childMdx.frontmatter.section + ? node.childMdx.frontmatter.section + "/" + : "" + }${node.childMdx.frontmatter.published}/${ + node.childMdx.frontmatter.url + }`, toPath: `/${node.childMdx.frontmatter.language}/blog/${ node.childMdx.frontmatter.section ? node.childMdx.frontmatter.section + "/" @@ -181,10 +174,130 @@ exports.createPages = async ({ actions, graphql, reporter }) => { redirectInBrowser: true, permanent: true, }); - } + + if (node.childMdx.frontmatter.section === "scambox") { + createRedirect({ + fromPath: `/${lang}/scambox/${node.childMdx.frontmatter.url}`, + toPath: `/${node.childMdx.frontmatter.language}/blog/${ + node.childMdx.frontmatter.section + ? node.childMdx.frontmatter.section + "/" + : "" + }${node.childMdx.frontmatter.published}/${ + node.childMdx.frontmatter.url + }`, + redirectInBrowser: true, + permanent: true, + }); + } + }); }); - }); + } activity.setStatus("Pages generated."); activity.end(); }; + +exports.onCreatePage = ({ page, actions: { deletePage } }) => { + if (!moduleConfig.projects) { + if (page.path.startsWith("/projects")) { + deletePage(page); + return; + } + + languages.forEach((lng) => { + if (page.path.startsWith(`/${lng}/projects`)) { + deletePage(page); + } + }); + } + + if (!moduleConfig.donation) { + if (page.path.startsWith("/donate")) { + deletePage(page); + return; + } + + languages.forEach((lng) => { + if (page.path.startsWith(`/${lng}/donate`)) { + deletePage(page); + } + }); + } + + if (!moduleConfig.blog) { + if (page.path.startsWith("/blog")) { + deletePage(page); + return; + } + + languages.forEach((lng) => { + if (page.path.startsWith(`/${lng}/blog`)) { + deletePage(page); + } + }); + } +}; + +exports.createSchemaCustomization = ({ actions }) => { + const { createTypes } = actions; + const typeDefs = ` + type MultiLocaleString { + en: String + de: String + } + + + type CareerJson implements Node { + type: String + title: MultiLocaleString + sortDate(difference: String + formatString: String + fromNow: Boolean + locale: String): Date + startDate: MultiLocaleString + endDate: MultiLocaleString + description: MultiLocaleString + externalLink: String + } + + type FriendsJson implements Node { + profession: String + name: String + url: String + imageURL: String + localImage: File + } + + type ProjectsJsonLinks { + website: String + github: String + } + + type ProjectsJson implements Node { + urlname: String + lang: String + name: String + shortDescription: String + links: ProjectsJsonLinks + #image: File + featured: Int + date: String + } + + type SocialsJson implements Node { + platformName: String + platformHandle: String + url: String + image: String + localImage: File + } + + type SkillsJson implements Node { + name: String + href: String + type: String + } + + `; + createTypes(typeDefs); +}; diff --git a/src/components/navigation.js b/src/components/navigation.js index fb25401..6337b2a 100644 --- a/src/components/navigation.js +++ b/src/components/navigation.js @@ -7,12 +7,15 @@ import { graphql, StaticQuery } from "gatsby"; import * as styles from "./navigation.module.scss"; import { Fade as Hamburger } from "hamburger-react"; import OffScreenNav from "./offscreenNav"; +import useSiteMetadata from "../helpers/useSiteMetadata"; const Navigation = ({ isHome }) => { let [atTop, setAtTop] = useState(false); const [offscreenNavActive, setOffscreenNavActive] = useState(false); const { t } = useTranslation(); + const { modules } = useSiteMetadata(); + const closeOffscreenNav = () => setOffscreenNavActive(false); const updateTransparency = () => { @@ -87,15 +90,19 @@ const Navigation = ({ isHome }) => { about.title - - project.plural - + {modules.projects && ( + + project.plural + + )} social.title - - blog.title - + {modules.blog && ( + + blog.title + + )}
{ const { t } = useTranslation(); + const { modules } = useSiteMetadata(); + if (typeof document === "undefined") return <>; return createPortal( @@ -34,15 +37,19 @@ const OffScreenNav = ({ active, close }) => { about.title - - project.plural - + {modules.projects && ( + + project.plural + + )} social.title - - blog.title - + {modules.blog && ( + + blog.title + + )}
, document.getElementById("osnav") diff --git a/src/helpers/useSiteMetadata.js b/src/helpers/useSiteMetadata.js index 24820d2..03d67a9 100644 --- a/src/helpers/useSiteMetadata.js +++ b/src/helpers/useSiteMetadata.js @@ -26,6 +26,11 @@ const useSiteMetadata = () => { height nationality sameAs + modules { + blog + projects + donation + } } } } diff --git a/src/pages/about.js b/src/pages/about.js index 8237036..0676488 100644 --- a/src/pages/about.js +++ b/src/pages/about.js @@ -18,6 +18,7 @@ import { Loader, } from "lucide-react"; import { useTranslation } from "react-i18next"; +import useSiteMetadata from "../helpers/useSiteMetadata"; export const query = graphql` query GetProjectsAndSkills($language: String) { @@ -98,6 +99,7 @@ export const query = graphql` const AboutPage = (props) => { const { t, i18n } = useTranslation(); + const { modules } = useSiteMetadata(); let file = props.data.file; @@ -291,14 +293,16 @@ const AboutPage = (props) => { - -
- - about.donationCatchphrase - - -
- + {modules.donation && ( + +
+ + about.donationCatchphrase + + +
+ + )} ); }; diff --git a/src/pages/projects.js b/src/pages/projects.js index d7215b7..06c2029 100644 --- a/src/pages/projects.js +++ b/src/pages/projects.js @@ -45,6 +45,7 @@ export const query = graphql` const ProjectsPage = ({ data }) => { const { t } = useI18next(); const meta = useSiteMetadata(); + return (