UNPKG

patternplate-client

Version:

Universal javascript client application for patternplate

168 lines (159 loc) 4.08 kB
import React, {Component, PropTypes as t} from 'react'; import join from 'classnames'; import autobind from 'autobind-decorator'; import md5 from 'md5'; import PatternControl from './pattern-control'; import PatternCode from './pattern-code'; import PatternDocumentation from './pattern-documentation'; export default PatternSources; function PatternSources(props) { const {sources} = props; return ( <div className="pattern-sources"> { sources.map(source => ( <PatternSource active={source.active} update={source.update} base={props.base} concern={source.concern} concerns={source.concerns} environment={props.environment} extname={source.extname} id={source.id} shortid={source.shortid} key={source.shortid} language={source.language} loading={source.loading} location={props.location} name={source.name} onConcernChange={props.onConcernChange} onFileRequest={props.onFileRequest} onTypeChange={props.onTypeChange} source={source.source} type={source.type} types={source.types} /> )) } </div> ); } PatternSources.propTypes = { base: t.string.isRequired, environment: t.string.isRequired, location: t.shape({ pathname: t.string.isRequired, query: t.object.isRequired }).isRequired, onConcernChange: t.func.isRequired, onFileRequest: t.func.isRequired, onTypeChange: t.func.isRequired, sources: t.arrayOf(t.shape({ active: t.bool.isRequired, concern: t.string.isRequired, id: t.string.isRequired, language: t.string.isRequired, name: t.string.isRequired, source: t.string.isRequired, type: t.string.isRequired })) }; @autobind class PatternSource extends Component { static propTypes = { active: t.bool.isRequired, base: t.string.isRequired, concern: t.string.isRequired, concerns: t.arrayOf(t.string).isRequired, environment: t.string.isRequired, id: t.string.isRequired, shortid: t.string.isRequired, loading: t.bool, location: t.shape({ pathname: t.string.isRequired, query: t.object.isRequired }).isRequired, name: t.string.isRequired, onFileRequest: t.func.isRequired, language: t.string.isRequired, source: t.string.isRequired, type: t.string.isRequired, types: t.arrayOf(t.string).isRequired, title: t.string, update: t.bool.isRequired }; componentDidMount() { const {props} = this; if (props.update) { props.onFileRequest({ id: props.id, shortid: props.shortid, environment: props.environment, type: props.type, base: props.base }); } } componentWillUpdate(next) { if (next.update) { next.onFileRequest({ id: this.props.id, shortid: this.props.shortid, environment: this.props.environment, type: this.props.type, base: this.props.base }); } } render() { const {props} = this; const className = join('pattern-source', { 'pattern-source--loading': props.loading }); const verb = props.active ? `Close` : `View`; const title = `${verb} ${props.concern}${props.extname}`; return ( <div className={className}> <PatternControl active={props.active} base={props.base} disabled={props.loading} expand key={props.id} location={props.location} name={props.name} shortid={props.id} title={title} /> { props.active && props.language === 'md' && <PatternDocumentation base={props.base} name={props.name} source={props.source} /> } { props.active && props.language !== 'md' && <PatternCode base={props.base} concern={props.concern} concerns={props.concerns} copy extname={props.extname} format={props.language} highlight id={md5([props.id, props.source].join(':'))} name={props.name} onConcernChange={props.onConcernChange} onTypeChange={props.onTypeChange} source={props.source} type={props.type} types={props.types} /> } </div> ); } }