1
0
mirror of https://github.com/kremalicious/portfolio.git synced 2024-06-30 05:31:44 +02:00
portfolio/src/templates/Project.jsx

137 lines
3.2 KiB
React
Raw Normal View History

2018-07-11 11:10:13 +02:00
import React from 'react'
2018-04-21 13:39:18 +02:00
import PropTypes from 'prop-types'
import Helmet from 'react-helmet'
import ReactMarkdown from 'react-markdown'
2018-06-21 21:06:53 +02:00
import { graphql } from 'gatsby'
import Layout from '../components/Layout'
2018-04-21 13:39:18 +02:00
import Content from '../components/atoms/Content'
import FullWidth from '../components/atoms/FullWidth'
2018-05-04 01:58:43 +02:00
import ProjectImage from '../components/atoms/ProjectImage'
2018-04-21 13:39:18 +02:00
import ProjectTechstack from '../components/molecules/ProjectTechstack'
import ProjectLinks from '../components/molecules/ProjectLinks'
2018-05-04 14:00:21 +02:00
import ProjectNav from '../components/molecules/ProjectNav'
2018-04-23 23:55:12 +02:00
import SEO from '../components/atoms/SEO'
2018-06-23 15:50:02 +02:00
import styles from './Project.module.scss'
2018-04-21 13:39:18 +02:00
2018-07-11 11:10:13 +02:00
const ProjectMeta = ({ links, techstack }) => (
<footer className={styles.project__meta}>
{!!links && <ProjectLinks links={links} />}
{!!techstack && <ProjectTechstack techstack={techstack} />}
</footer>
)
2018-05-22 22:41:59 +02:00
2018-07-11 11:10:13 +02:00
const ProjectImages = ({ projectImages, title }) => (
2018-05-23 00:03:46 +02:00
<FullWidth>
2018-07-11 11:10:13 +02:00
{projectImages.map(({ node }) => (
2018-06-23 15:50:02 +02:00
<div className={styles.spacer} key={node.id}>
2018-07-11 11:10:13 +02:00
<ProjectImage fluid={node.fluid} alt={title} />
2018-06-23 15:50:02 +02:00
</div>
2018-05-23 00:03:46 +02:00
))}
</FullWidth>
)
2018-07-11 11:10:13 +02:00
const Project = ({ data, location }) => {
const meta = data.dataYaml
const project = data.projectsYaml
const projectImages = data.projectImages.edges
const { title, links, techstack } = project
const description = data.projectsYaml.description
const descriptionWithLineBreaks = description.split('\n').join('\n\n')
2018-07-11 11:10:13 +02:00
return (
<Layout location={location}>
<Helmet title={title} />
2018-04-21 13:39:18 +02:00
2018-07-11 11:10:13 +02:00
<SEO project={project} meta={meta} />
2018-04-23 23:55:12 +02:00
2018-07-11 11:10:13 +02:00
<article className={styles.project}>
<Content>
<h1 className={styles.project__title}>{title}</h1>
<ReactMarkdown
source={descriptionWithLineBreaks}
className={styles.project__description}
/>
<ProjectImages projectImages={projectImages} title={title} />
<ProjectMeta links={links} techstack={techstack} />
</Content>
</article>
2018-04-21 13:39:18 +02:00
2018-07-11 11:10:13 +02:00
<ProjectNav slug={project.slug} />
</Layout>
)
2018-04-21 13:39:18 +02:00
}
2018-05-22 22:41:59 +02:00
ProjectMeta.propTypes = {
links: PropTypes.array,
techstack: PropTypes.array
}
2018-05-23 00:03:46 +02:00
ProjectImages.propTypes = {
projectImages: PropTypes.array,
title: PropTypes.string
}
2018-04-21 13:39:18 +02:00
Project.propTypes = {
2018-06-23 00:54:45 +02:00
data: PropTypes.object.isRequired,
location: PropTypes.object.isRequired
2018-04-21 13:39:18 +02:00
}
export default Project
export const projectAndProjectsQuery = graphql`
2018-05-04 01:58:43 +02:00
query ProjectBySlug($slug: String!) {
2018-05-05 00:17:26 +02:00
projectsYaml(slug: { eq: $slug }) {
2018-05-04 14:00:21 +02:00
title
slug
description
links {
title
url
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
}
# the data/meta.yml file
2018-05-05 00:17:26 +02:00
dataYaml {
title
tagline
description
url
social {
Email
Blog
Twitter
GitHub
Dribbble
}
2018-05-07 01:43:33 +02:00
img {
childImageSharp {
resize(width: 980) {
src
}
}
}
2018-05-05 00:17:26 +02:00
}
2018-05-04 16:54:08 +02:00
projectImages: allImageSharp(
2018-06-19 22:48:33 +02:00
filter: { fluid: { originalName: { regex: $slug } } }
2018-05-04 16:54:08 +02:00
sort: { fields: [id], order: ASC }
) {
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
}
`