Files
freeCodeCamp/common/app/routes/challenges/components/classic/Classic.jsx

113 lines
2.3 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';
import BugModal from '../Bug-Modal.jsx';
2016-05-13 22:34:40 -07:00
import { challengeSelector } from '../../redux/selectors';
2016-05-27 22:07:10 -07:00
import {
executeChallenge,
updateMain,
updateFile,
loadCode
} from '../../redux/actions';
2016-03-05 21:06:04 -08:00
2016-05-10 13:17:57 -07:00
const mapStateToProps = createSelector(
challengeSelector,
2016-05-13 20:04:56 -07:00
state => state.challengesApp.tests,
state => state.challengesApp.files,
2016-05-20 12:42:26 -07:00
state => state.challengesApp.key,
2016-05-27 22:07:10 -07:00
(
{ showPreview, mode },
tests,
files = {},
key = ''
) => ({
2016-05-20 12:42:26 -07:00
content: files[key] && files[key].contents || '',
file: files[key],
2016-05-10 13:17:57 -07:00
showPreview,
2016-05-13 20:04:56 -07:00
mode,
tests
2016-05-10 13:17:57 -07:00
})
);
2016-05-27 22:07:10 -07:00
const bindableActions = {
executeChallenge,
updateFile,
updateMain,
loadCode
};
2016-05-13 20:36:54 -07:00
2016-05-10 13:17:57 -07:00
export class Challenge extends PureComponent {
2016-03-05 21:06:04 -08:00
static displayName = 'Challenge';
static propTypes = {
showPreview: PropTypes.bool,
2016-05-13 20:04:56 -07:00
content: PropTypes.string,
2016-05-20 12:42:26 -07:00
mode: PropTypes.string,
updateFile: PropTypes.func,
executeChallenge: PropTypes.func,
2016-05-27 22:07:10 -07:00
updateMain: PropTypes.func,
loadCode: PropTypes.func
2016-03-05 21:06:04 -08:00
};
componentDidMount() {
2016-05-27 22:07:10 -07:00
this.props.loadCode();
this.props.updateMain();
}
2016-05-27 22:07:10 -07:00
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() {
2016-05-13 20:36:54 -07:00
const {
content,
updateFile,
file,
mode,
2016-05-20 12:42:26 -07:00
showPreview,
executeChallenge
2016-05-13 20:36:54 -07:00
} = this.props;
2016-03-05 21:06:04 -08:00
return (
<div>
<Col
2016-07-30 01:04:40 +05:30
lg={ showPreview ? 3 : 4 }
md={ showPreview ? 3 : 4 }
>
2016-05-13 20:04:56 -07:00
<SidePanel />
2016-03-05 21:06:04 -08:00
</Col>
<Col
2016-07-30 01:04:40 +05:30
lg={ showPreview ? 6 : 8 }
md={ showPreview ? 5 : 8 }
>
<Editor
content={ content }
2016-05-20 12:42:26 -07:00
executeChallenge={ executeChallenge }
mode={ mode }
2016-05-13 20:36:54 -07:00
updateFile={ content => updateFile(content, file) }
/>
2016-03-05 21:06:04 -08:00
</Col>
{ this.renderPreview(showPreview) }
<BugModal />
2016-03-05 21:06:04 -08:00
</div>
);
}
}
2016-05-10 13:17:57 -07:00
2016-05-13 20:36:54 -07:00
export default connect(mapStateToProps, bindableActions)(Challenge);