1
0
mirror of https://github.com/kremalicious/portfolio.git synced 2024-06-28 00:27:40 +02:00
portfolio/src/templates/Project.jsx

133 lines
3.1 KiB
React
Raw Normal View History

2018-04-24 22:56:19 +02:00
import React, { Component, Fragment } 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'
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-04-21 13:39:18 +02:00
import './Project.scss'
2018-04-22 23:51:50 +02:00
class Project extends Component {
constructor(props) {
super(props)
const description = this.props.data.projectsYaml.description
this.state = {
2018-05-12 01:42:29 +02:00
descriptionWithLineBreaks: description.split('\n').join('\n\n'),
}
2018-04-21 13:39:18 +02:00
}
render() {
2018-05-05 00:17:26 +02:00
const meta = this.props.data.dataYaml
const project = this.props.data.projectsYaml
2018-05-04 01:58:43 +02:00
const projectImages = this.props.data.projectImages.edges
2018-05-04 14:00:21 +02:00
const pathContext = this.props.pathContext
2018-04-23 23:55:12 +02:00
const { title, links, techstack } = project
2018-05-04 14:00:21 +02:00
const { next, previous } = pathContext
2018-04-21 13:39:18 +02:00
2018-05-04 01:58:43 +02:00
return (
<Fragment>
2018-04-21 13:39:18 +02:00
<Helmet>
<title>{title}</title>
</Helmet>
2018-05-07 01:43:33 +02:00
<SEO project={project} meta={meta} />
2018-04-23 23:55:12 +02:00
2018-04-21 13:39:18 +02:00
<article className="project">
<Content>
<h1 className="project__title">{title}</h1>
2018-05-05 00:43:54 +02:00
<ReactMarkdown
source={this.state.descriptionWithLineBreaks}
2018-05-05 00:43:54 +02:00
className="project__description"
/>
2018-04-21 13:39:18 +02:00
2018-04-30 01:18:54 +02:00
<FullWidth>
2018-05-04 01:58:43 +02:00
{projectImages.map(({ node }) => (
2018-05-05 00:43:54 +02:00
<ProjectImage key={node.id} sizes={node.sizes} alt={title} />
2018-05-04 01:58:43 +02:00
))}
2018-04-21 13:39:18 +02:00
</FullWidth>
<footer className="project__meta">
{!!links && <ProjectLinks links={links} />}
2018-05-05 23:47:12 +02:00
{!!techstack && <ProjectTechstack techstack={techstack} />}
2018-04-21 13:39:18 +02:00
</footer>
</Content>
</article>
2018-05-04 14:00:21 +02:00
<ProjectNav previous={previous} next={next} />
2018-04-24 22:56:19 +02:00
</Fragment>
2018-05-04 01:58:43 +02:00
)
2018-04-21 13:39:18 +02:00
}
}
Project.propTypes = {
data: PropTypes.object.isRequired,
2018-05-04 14:00:21 +02:00
pathContext: PropTypes.object.isRequired,
2018-04-21 13:39:18 +02:00
}
export default Project
export const projectQuery = 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
}
2018-05-05 00:17:26 +02:00
dataYaml {
title
tagline
description
url
social {
Email
Blog
Twitter
GitHub
Dribbble
}
availability {
status
available
unavailable
}
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(
filter: { id: { regex: $slug } }
sort: { fields: [id], order: ASC }
) {
2018-05-04 01:58:43 +02:00
edges {
node {
id
2018-05-04 14:00:21 +02:00
...ProjectImageSizes
2018-04-21 20:01:50 +02:00
}
}
}
2018-04-21 13:39:18 +02:00
}
`