Home Reference Source Repository

src/components/ProjectViewer/ProjectViewer.js

/*!
 * Codefolio
 * Copyright(c) 2016 MSMFSD
 * MIT Licensed
 */
 /* eslint no-return-assign: "off" */
 /* eslint react/prop-types: "off" */
import React, { Component, PropTypes } from 'react'
import { Link } from 'react-router'
import Markdown from 'react-markdown'
import CssModules from 'react-css-modules'
import __CONFIG__ from '../../../config'
import Slider from '../Slider/Slider'
import Loader from '../Loader/Loader'
import Panel from '../Panel/Panel'
import IconLinks from '../IconLinks/IconLinks'
import RepoLink from '../RepoLink/RepoLink'
import IconTechChips from '../IconTechChips/IconTechChips'
import CodeSnippet from '../CodeSnippet/CodeSnippet'
import ScrollTopButton from '../ScrollTopButton/ScrollTopButton'
import styles from './ProjectViewer.css'

/**
 * @class ProjectViewer
 * @extends {Component}
 */
class ProjectViewer extends Component {

  componentWillUpdate () {
    // on route update reset gallery index
    if(typeof this._imageGallery !== 'undefined') {
      // TODO this._imageGallery.slideToIndex(0)
    }
  }

  render () {
    // vars
    const { projects } = this.props
    const API_URL = process.env.NODE_ENV !== 'production' ? __CONFIG__.API_DEV_URL : __CONFIG__.API_PROD_URL
    const slug = this.props.params.projectId
    let project = null
    let images = []
    // async render states
    if(projects.loading || (!projects.hasLoaded && !projects.error)) {
      return (<div><Loader /></div>)
    } else if(projects.error) {
      return (<div><Panel message={'Error: ' + projects.errMessage} /></div>)
    } else {
      // async success - get project with route paramater
      project = projects.data.find((item) => item.slug === slug)
      if(typeof project !== 'undefined') {
        images = project.media.map((img, index) => {
          let imgUrl = API_URL + '/uploads/projects/' + img
          return <div key={index} styleName="cf-slide" style={{ backgroundImage: 'url(' + imgUrl + ')' }}></div>
        })
      }
      // render project
      return (
        <div styleName="cf-project">
          <Link styleName="projects-back-btn" className="btn" to="/"><i className="material-icons left">arrow_back</i>profile</Link>
          <h1 styleName="project-name">{project.name}</h1>
          <span styleName="project-client">{project.client}</span>
          <div styleName="project-gallery" className={images && images.length > 0 ? 'show' : 'hide'}>
            <Slider loop={true} showNav={false}>{images}</Slider>
          </div>
          <IconLinks icon="web" data={project.linkWeb} />
          <RepoLink data={project.repo} />
          <IconTechChips icon="code" data={project.projectTech} />
          <div styleName="cf-project-description" className="cf-markdown">
            <Markdown source={project.description} />
          </div>
          <CodeSnippet data={project.codeSnippet} />
          <ScrollTopButton />
        </div>
      )
    }
  }

}

ProjectViewer.propTypes = {
  projects: PropTypes.object,
  params: PropTypes.object
}

ProjectViewer = CssModules(ProjectViewer, styles)
export default ProjectViewer