From 8457db33194868ef15c29295f8bb8692bcaa6c63 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Wed, 8 Jun 2016 15:40:32 -0700 Subject: [PATCH] Submit step --- .../challenges/components/step/Step.jsx | 80 ++++++++++++++----- .../challenges/redux/completion-saga.js | 5 +- 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/common/app/routes/challenges/components/step/Step.jsx b/common/app/routes/challenges/components/step/Step.jsx index 6d95f413cc..04a04a03a0 100644 --- a/common/app/routes/challenges/components/step/Step.jsx +++ b/common/app/routes/challenges/components/step/Step.jsx @@ -5,7 +5,7 @@ import { createSelector } from 'reselect'; import PureComponent from 'react-pure-render/component'; import ReactTransitionReplace from 'react-css-transition-replace'; -import { goToStep } from '../../redux/actions'; +import { submitChallenge, goToStep } from '../../redux/actions'; import { challengeSelector } from '../../redux/selectors'; import { Button, Col, Image, Row } from 'react-bootstrap'; @@ -18,15 +18,25 @@ const mapStateToProps = createSelector( challenge, currentStep, previousStep, + numOfSteps: + Array.isArray(challenge.description) ? + challenge.description.length : + 0, isGoingForward: currentStep > previousStep }) ); const dispatchActions = { - goToStep + goToStep, + submitChallenge }; export class StepChallenge extends PureComponent { + constructor(...args) { + super(...args); + this.handleNextClick = this.handleNextClick.bind(this); + this.handleBackClick = this.handleBackClick.bind(this); + } static displayName = 'StepChallenge'; static defaultProps = { currentStep: 0, @@ -38,9 +48,25 @@ export class StepChallenge extends PureComponent { currentStep: PropTypes.number, previousStep: PropTypes.number, isGoingForward: PropTypes.bool, - goToStep: PropTypes.func + goToStep: PropTypes.func, + submitChallenge: PropTypes.func, + numOfSteps: PropTypes.number }; + handleNextClick() { + const { numOfSteps, currentStep, submitChallenge, goToStep } = this.props; + const isLastStep = currentStep + 1 >= numOfSteps; + if (isLastStep) { + return submitChallenge(); + } + return goToStep(currentStep + 1); + } + + handleBackClick() { + const { currentStep, goToStep } = this.props; + goToStep(currentStep - 1); + } + renderActionButton(action) { if (!action) { return null; @@ -52,7 +78,8 @@ export class StepChallenge extends PureComponent { bsSize='large' bsStyle='primary' href={ action } - target='_blank'> + target='_blank' + > Open link in new tab (this unlocks the next step)
@@ -61,12 +88,12 @@ export class StepChallenge extends PureComponent { } renderBackButton(index) { - const { goToStep } = this.props; if (index === 0) { return ( + md={ 4 } + > { ' ' } ); @@ -76,14 +103,14 @@ export class StepChallenge extends PureComponent { bsSize='large' bsStyle='primary' className='col-sm-4 col-xs-12' - onClick={ () => goToStep(index - 1) }> + onClick={ this.handleBackClick } + > Go to my previous step ); } renderNextButton(hasAction, index, numOfSteps, isCompleted) { - const { goToStep } = this.props; const isLastStep = index + 1 >= numOfSteps; const btnClass = classnames({ 'col-sm-4 col-xs-12': true, @@ -94,7 +121,8 @@ export class StepChallenge extends PureComponent { bsSize='large' bsStyle='primary' className={ btnClass } - onClick={ () => !isLastStep ? goToStep(index + 1) : () => {} }> + onClick={ this.handleNextClick } + > { isLastStep ? 'Finish challenge' : 'Go to my next step'} ); @@ -108,12 +136,14 @@ export class StepChallenge extends PureComponent { return (
+ key={ imgUrl } + > { + src={ imgUrl } + />
@@ -122,10 +152,12 @@ export class StepChallenge extends PureComponent { mdOffset={ 2 } sm={ 10 } smOffset={ 1 } - xs={ 12 }> + xs={ 12 } + >

+ dangerouslySetInnerHTML={{ __html: info }} + />

@@ -135,7 +167,8 @@ export class StepChallenge extends PureComponent { + xs={ 12 } + > ( { currentStep + 1 } / { numOfSteps }) { @@ -162,16 +195,19 @@ export class StepChallenge extends PureComponent { { + src={ imgUrl } + />
)); } render() { - const { challenge, currentStep, isGoingForward } = this.props; - const numOfSteps = Array.isArray(challenge.description) ? - challenge.description.length : - 0; + const { + numOfSteps, + challenge, + currentStep, + isGoingForward + } = this.props; const step = challenge.description[currentStep]; const transitionName = 'challenge-step-' + (isGoingForward ? 'forward' : 'backward'); @@ -179,11 +215,13 @@ export class StepChallenge extends PureComponent { return ( + mdOffset={ 2 } + > + transitionName={ transitionName } + > { this.renderStep(step, currentStep, numOfSteps) }
diff --git a/common/app/routes/challenges/redux/completion-saga.js b/common/app/routes/challenges/redux/completion-saga.js index 86cddd4ec4..52d8a69753 100644 --- a/common/app/routes/challenges/redux/completion-saga.js +++ b/common/app/routes/challenges/redux/completion-saga.js @@ -129,7 +129,7 @@ function submitProject(type, state, { solution, githubLink }) { return Observable.merge(saveChallenge$, challengeCompleted$); } -function submitSimpleProject(type, state) { +function submitSimpleChallenge(type, state) { const { challenge: { id } } = challengeSelector(state); @@ -169,9 +169,10 @@ function submitSimpleProject(type, state) { const submitTypes = { tests: submitModern, + step: submitSimpleChallenge, 'project.frontEnd': submitProject, 'project.backEnd': submitProject, - 'project.simple': submitSimpleProject + 'project.simple': submitSimpleChallenge }; export default function completionSaga(actions$, getState) {