trc-client-core
Version:
The core of the TRC Client
71 lines (61 loc) • 2.27 kB
JSX
import Loader from 'trc-client-core/src/components/Loader';
import React from 'react';
import {List} from 'immutable';
import UserStore from 'trc-client-core/src/user/UserStore';
import {connect} from 'react-redux';
import {requestPrerequisiteGet} from 'trc-client-core/src/course/PrerequisiteDuck';
import {
courseParticipationRequest,
requestCourse,
requestCourseListSimilar
} from 'trc-client-core/src/course/CourseActions';
var SingleCourseHandler = React.createClass({
displayName: 'SingleCourseHandler',
componentWillReceiveProps(nextProps) {
var {params} = this.props;
if(params.id !== nextProps.params.id) {
this.fetchData(nextProps);
}
},
componentDidMount() {
this.fetchData(this.props);
},
fetchData(props) {
var {dispatch} = props;
dispatch(requestCourse(props.params.id));
dispatch(requestCourseListSimilar({courseCode: props.params.id }));
dispatch(requestPrerequisiteGet(props.params.id))
dispatch(courseParticipationRequest({
courseCode: props.params.id,
participantId: UserStore.get('participantId')
}));
},
render: function () {
if (!this.props.course || !this.props.similarCourses) {
return <Loader/>;
}
return React.cloneElement(this.props.children, {
course: this.props.course,
similarCourses: this.props.similarCourses,
prerequisite: this.props.prerequisite,
fetchData: this.fetchData
});
}
});
export default connect(
(state, props) => {
function getByCourseCode(courseCode) {
return state.course.getIn(['collection', courseCode]);
}
var course = getByCourseCode(props.params.id);
var prerequisite = state.prerequisite.getIn(['collection', props.params.id]);
if (course && prerequisite) {
course = course.set('prerequisiteExpression', prerequisite.get('expression'))
}
return {
course: course,
prerequisite: prerequisite,
similarCourses: (course) ? course.get('similarCourses').map(cc => getByCourseCode(cc)).toList() : List()
}
}
)(SingleCourseHandler);