Files
freeCodeCamp/common/app/routes/challenges/components/Challenge.jsx

73 lines
1.6 KiB
JavaScript
Raw Normal View History

2016-03-05 21:06:04 -08:00
import React, { PropTypes } from 'react';
2016-05-10 13:17:57 -07:00
import { connect } from 'react-redux';
2016-03-05 21:06:04 -08:00
import { Col } from 'react-bootstrap';
2016-05-10 13:17:57 -07:00
import { createSelector } from 'reselect';
import PureComponent from 'react-pure-render/component';
2016-03-05 21:06:04 -08:00
import Editor from './Editor.jsx';
import SidePanel from './Side-Panel.jsx';
import Preview from './Preview.jsx';
2016-05-10 13:17:57 -07:00
import { challengeSelector } from '../redux/selectors';
2016-03-05 21:06:04 -08:00
2016-05-10 13:17:57 -07:00
const mapStateToProps = createSelector(
challengeSelector,
state => state.challengesApp.files,
state => state.challengesApp.path,
({ challenge, showPreview, mode }, files, path) => ({
content: files[path] && files[path].contents,
2016-05-10 13:17:57 -07:00
challenge,
showPreview,
mode
})
);
export class Challenge extends PureComponent {
2016-03-05 21:06:04 -08:00
static displayName = 'Challenge';
static propTypes = {
showPreview: PropTypes.bool,
challenge: PropTypes.object
};
static defaultProps = {
challenge: {}
2016-03-05 21:06:04 -08:00
};
renderPreview(showPreview) {
if (!showPreview) {
return null;
}
return (
<Col
lg={ 3 }
md={ 4 }>
2016-03-05 21:06:04 -08:00
<Preview />
</Col>
);
}
render() {
const { content, challenge, mode, showPreview } = this.props;
2016-03-05 21:06:04 -08:00
return (
<div>
<Col
lg={ 3 }
md={ showPreview ? 3 : 4 }>
<SidePanel { ...challenge }/>
2016-03-05 21:06:04 -08:00
</Col>
<Col
lg={ showPreview ? 6 : 9 }
md={ showPreview ? 5 : 8 }>
<Editor
content={ content }
mode={ mode }
/>
2016-03-05 21:06:04 -08:00
</Col>
{ this.renderPreview(showPreview) }
</div>
);
}
}
2016-05-10 13:17:57 -07:00
export default connect(mapStateToProps)(Challenge);