portfolio/src/pages/{ProjectsYaml.slug}.jsx

115 lines
2.6 KiB
React
Raw Permalink Normal View History

2021-03-13 01:03:23 +01:00
import React from 'react'
2018-04-21 13:39:18 +02:00
import PropTypes from 'prop-types'
2018-06-21 21:06:53 +02:00
import { graphql } from 'gatsby'
2021-03-13 16:19:24 +01:00
import { fullContainer } from '../components/Layout.module.css'
2020-11-20 23:36:55 +01:00
import ProjectImage from '../components/atoms/ProjectImage'
import ProjectTechstack from '../components/molecules/ProjectTechstack'
import ProjectLinks from '../components/molecules/ProjectLinks'
import ProjectNav from '../components/molecules/ProjectNav'
import SEO from '../components/atoms/SEO'
2021-03-12 23:47:28 +01:00
import {
meta,
headerTitle,
description
} from './{ProjectsYaml.slug}.module.css'
2018-04-21 13:39:18 +02:00
2021-03-13 01:03:23 +01:00
function ProjectMeta({ links, techstack }) {
return (
<footer className={meta}>
{!!links && <ProjectLinks links={links} />}
{!!techstack && <ProjectTechstack techstack={techstack} />}
</footer>
)
}
2018-11-25 01:52:31 +01:00
2021-03-13 01:03:23 +01:00
ProjectMeta.propTypes = {
links: PropTypes.array,
techstack: PropTypes.array
2018-11-25 01:52:31 +01:00
}
2018-05-22 22:41:59 +02:00
2021-03-13 01:03:23 +01:00
function ProjectImages({ projectImages, title }) {
2021-03-13 15:48:58 +01:00
return projectImages.map(({ node }) => (
<ProjectImage
image={node.gatsbyImageData}
alt={title}
key={node.id}
className={fullContainer}
/>
))
2021-03-13 01:03:23 +01:00
}
2018-05-23 00:03:46 +02:00
2021-03-13 01:03:23 +01:00
ProjectImages.propTypes = {
projectImages: PropTypes.array,
title: PropTypes.string
2018-05-23 00:03:46 +02:00
}
2021-03-13 01:03:23 +01:00
export default function Project({ data }) {
const project = data.projectsYaml
const projectImages = data.projectImages.edges
const descriptionHtml = data.projectsYaml.fields.descriptionHtml
const { title, links, techstack } = project
2018-11-25 01:52:31 +01:00
2021-03-13 01:03:23 +01:00
return (
<>
<SEO project={project} />
2018-11-25 01:52:31 +01:00
2021-03-13 01:03:23 +01:00
<article>
<header>
<h1 className={headerTitle}>{title}</h1>
</header>
<div
className={description}
dangerouslySetInnerHTML={{ __html: descriptionHtml }}
/>
<ProjectImages projectImages={projectImages} title={title} />
<ProjectMeta links={links} techstack={techstack} />
</article>
2018-04-21 13:39:18 +02:00
2021-03-13 01:03:23 +01:00
<ProjectNav currentSlug={project.slug} />
</>
)
}
2018-11-25 01:52:31 +01:00
2021-03-13 01:03:23 +01:00
Project.propTypes = {
data: PropTypes.object.isRequired,
location: PropTypes.object.isRequired
2018-11-25 01:52:31 +01:00
}
2018-04-21 13:39:18 +02:00
2018-12-07 10:31:35 +01:00
export const projectQuery = graphql`
2021-05-23 12:30:39 +02:00
query ($slug: String!, $imageRegex: String!) {
2018-05-05 00:17:26 +02:00
projectsYaml(slug: { eq: $slug }) {
2018-05-04 14:00:21 +02:00
title
slug
2018-11-25 01:52:31 +01:00
fields {
descriptionHtml
excerpt
2018-11-25 01:52:31 +01:00
}
2018-05-04 14:00:21 +02:00
links {
title
url
2019-11-13 11:59:59 +01:00
icon
2018-04-21 13:39:18 +02:00
}
2018-05-04 14:00:21 +02:00
techstack
2018-05-07 01:43:33 +02:00
img {
childImageSharp {
twitterImage: resize(width: 980) {
src
}
}
}
2018-04-21 13:39:18 +02:00
}
2018-05-04 16:54:08 +02:00
projectImages: allImageSharp(
2021-05-23 12:52:05 +02:00
filter: { original: { src: { regex: $imageRegex } } }
sort: { fields: [original___src], order: ASC }
2018-05-04 16:54:08 +02:00
) {
2018-05-04 01:58:43 +02:00
edges {
node {
id
2018-06-19 22:48:33 +02:00
...ProjectImageFluid
2018-04-21 20:01:50 +02:00
}
}
}
2018-04-21 13:39:18 +02:00
}
`