diff --git a/package.json b/package.json index f79b761..795120b 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "react-highlight": "briancappello/react-highlight#react-v16-compiled", "react-redux": "^5.0.7", "react-remarkable": "^1.1.3", - "react-router-dom": "^4.2.2", + "react-router-dom": "^4.3.1", "react-scripts": "1.1.1", "react-transition-group": "^2.2.1", "redux": "^3.7.2", diff --git a/src/App.component.js b/src/App.component.js new file mode 100644 index 0000000..8da3c1f --- /dev/null +++ b/src/App.component.js @@ -0,0 +1,24 @@ +import React, { Component } from 'react'; + +import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; + +import './App.css'; + +import { Quiz, Completed } from 'src/components'; + +class App extends Component { + render() { + return ( + +
+ + + + +
+
+ ); + } +} + +export default App; diff --git a/src/components/App/App.css b/src/App.css similarity index 100% rename from src/components/App/App.css rename to src/App.css diff --git a/src/components/App/App.component.js b/src/components/App/App.component.js deleted file mode 100644 index e7f7f24..0000000 --- a/src/components/App/App.component.js +++ /dev/null @@ -1,35 +0,0 @@ -import React, { Component } from 'react'; -import './App.css'; - -import PropTypes from 'prop-types'; - -import { Quiz, Completed } from 'src/components'; - -class App extends Component { - static propTypes = { - state: PropTypes.string.isRequired, - }; - - render() { - const { state } = this.props; - - let content =
; - - switch (state) { - case 'completed': - content = ; - break; - - case 'quiz': - content = ; - break; - - default: - content =
; - } - - return
{content}
; - } -} - -export default App; diff --git a/src/components/App/App.container.js b/src/components/App/App.container.js deleted file mode 100644 index 2130b8a..0000000 --- a/src/components/App/App.container.js +++ /dev/null @@ -1,9 +0,0 @@ -import { connect } from 'react-redux'; - -import { stateSelector } from 'src/selectors'; - -import App from './App.component'; - -export default connect((st) => ({ - state: stateSelector(st), -}))(App); diff --git a/src/components/App/App.test.js b/src/components/App/App.test.js deleted file mode 100644 index 4b64f4d..0000000 --- a/src/components/App/App.test.js +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import App from './App.component'; - -it('renders without crashing', () => { - const div = document.createElement('div'); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); -}); diff --git a/src/components/App/index.js b/src/components/App/index.js deleted file mode 100644 index 5a45ad9..0000000 --- a/src/components/App/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as App } from './App.container'; diff --git a/src/components/Completed/Completed/Completed.container.js b/src/components/Completed/Completed/Completed.container.js index 42fd91c..81a3e53 100644 --- a/src/components/Completed/Completed/Completed.container.js +++ b/src/components/Completed/Completed/Completed.container.js @@ -1,9 +1,13 @@ import { connect } from 'react-redux'; +import { withRouter } from 'react-router-dom'; + import { quizNameSelector } from 'src/selectors'; import CompletedResults from './Completed.component'; -export default connect((st) => ({ - name: quizNameSelector(st), -}))(CompletedResults); +export default withRouter( + connect((st) => ({ + name: quizNameSelector(st), + }))(CompletedResults) +); diff --git a/src/components/Completed/CompletedResultsList/CompletedResultsList.component.js b/src/components/Completed/CompletedResultsList/CompletedResultsList.component.js index 4232aeb..0f6a388 100644 --- a/src/components/Completed/CompletedResultsList/CompletedResultsList.component.js +++ b/src/components/Completed/CompletedResultsList/CompletedResultsList.component.js @@ -49,7 +49,7 @@ export default class CompletedResultsList extends PureComponent { const answersWrapperClasses = classNames( 'CompletedResultsList__answers-wrapper', { - ['--no-grid']: !!codeFigure, + '--no-grid': !!codeFigure, } ); diff --git a/src/components/NameCapture/NameCapture/NameCapture.component.js b/src/components/NameCapture/NameCapture/NameCapture.component.js index f59688b..3f6ee79 100644 --- a/src/components/NameCapture/NameCapture/NameCapture.component.js +++ b/src/components/NameCapture/NameCapture/NameCapture.component.js @@ -3,7 +3,6 @@ import React, { PureComponent } from 'react'; import { NameCaptureNameInput, NameCaptureContinueButton, - SubscribeToMailingListCheckbox, } from 'src/components'; import './NameCapture.css'; diff --git a/src/components/Quiz/Quiz.component.js b/src/components/Quiz/Quiz.component.js index 8733759..b022e4a 100644 --- a/src/components/Quiz/Quiz.component.js +++ b/src/components/Quiz/Quiz.component.js @@ -21,14 +21,14 @@ export default class Quiz extends PureComponent { }; handleOnSubmit = (e) => { - const { onSubmit, quizComplete } = this.props; + const { onSubmit, quizComplete, history } = this.props; e.preventDefault(); if (!quizComplete) { return false; } else { - onSubmit(); + onSubmit(history); } }; diff --git a/src/components/Quiz/Quiz.container.js b/src/components/Quiz/Quiz.container.js index e386633..5880619 100644 --- a/src/components/Quiz/Quiz.container.js +++ b/src/components/Quiz/Quiz.container.js @@ -1,22 +1,26 @@ import { connect } from 'react-redux'; +import { withRouter } from 'react-router-dom'; + import { quizStateSelector, quizIsCompleteSelector } from 'src/selectors'; import { submitQuizAction as onSubmit } from 'src/store/quiz/quiz.actions'; import Quiz from './Quiz.component'; -export default connect( - (st) => { - const state = quizStateSelector(st); - const quizComplete = quizIsCompleteSelector(st); +export default withRouter( + connect( + (st) => { + const state = quizStateSelector(st); + const quizComplete = quizIsCompleteSelector(st); - return { - state, - quizComplete, - }; - }, - { - onSubmit, - } -)(Quiz); + return { + state, + quizComplete, + }; + }, + { + onSubmit, + } + )(Quiz) +); diff --git a/src/components/QuizQuestion/QuizQuestion.component.js b/src/components/QuizQuestion/QuizQuestion.component.js index a87fe59..f5d2d28 100644 --- a/src/components/QuizQuestion/QuizQuestion.component.js +++ b/src/components/QuizQuestion/QuizQuestion.component.js @@ -50,11 +50,11 @@ export default class QuizQuestion extends PureComponent { const active = userAnswers.length + 1 === questionNumber; const questionClasses = classNames('QuizQuestion', { - ['visuallyhidden']: !active, + 'visuallyhidden': !active, }); const answerListClasses = classNames('QuizQuestion__answers-list', { - ['--grid']: answerType === 'code', + '--grid': answerType === 'code', }); return ( diff --git a/src/components/index.js b/src/components/index.js index f4767df..3eb7fde 100644 --- a/src/components/index.js +++ b/src/components/index.js @@ -1,7 +1,6 @@ export * from './ActionButton'; export * from './ActivityIndicator'; export * from './Answer'; -export * from './App'; export * from './Checkbox'; export * from './CodeFigure'; export * from './Completed'; diff --git a/src/index.js b/src/index.js index 1d78a95..ead625f 100644 --- a/src/index.js +++ b/src/index.js @@ -6,7 +6,7 @@ import { Provider } from 'react-redux'; import store from 'src/store'; -import { App } from 'src/components'; +import App from './App.component'; import registerServiceWorker from './registerServiceWorker'; diff --git a/src/store/quiz/quiz.actions.js b/src/store/quiz/quiz.actions.js index 9a249e0..40ab520 100644 --- a/src/store/quiz/quiz.actions.js +++ b/src/store/quiz/quiz.actions.js @@ -1,4 +1,4 @@ -import { call, put, select, take } from 'redux-saga/effects'; +import { call, put, select, take, fork } from 'redux-saga/effects'; import { version, questions } from 'src/questions'; @@ -63,8 +63,11 @@ export const submitNameAction = () => ({ type: 'SUBMIT_NAME', }); -export const submitQuizAction = () => ({ +export const submitQuizAction = (history) => ({ type: 'SUBMIT_QUIZ_ACTION', + payload: { + history, + }, }); function* addAnswer() { @@ -113,6 +116,8 @@ export default function*() { yield put(setStateAction('question')); for (let i = 0; i < questions.length; i++) { + yield take(setSelectedAnswerAction().type); + yield take(submitAnswerAction().type); yield* addAnswer(); @@ -120,7 +125,9 @@ export default function*() { yield put(setStateAction('emailCapture')); - yield take(submitQuizAction().type); + const { payload: { history } } = yield take(submitQuizAction().type); + + yield fork(submitQuiz); - yield* submitQuiz(); + yield call(history.push, '/completed'); } diff --git a/yarn.lock b/yarn.lock index 4ffe6bb..4c31faf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3818,7 +3818,7 @@ hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" -hoist-non-react-statics@^2.3.0, hoist-non-react-statics@^2.5.0: +hoist-non-react-statics@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" @@ -4079,7 +4079,7 @@ invariant@^2.0.0, invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -invariant@^2.2.1: +invariant@^2.2.1, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -6259,7 +6259,7 @@ prop-types@^15.5.10, prop-types@^15.6.0: loose-envify "^1.3.1" object-assign "^4.1.1" -prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.1: +prop-types@^15.5.8, prop-types@^15.6.1: version "15.6.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" dependencies: @@ -6497,28 +6497,28 @@ react-remarkable@^1.1.3: dependencies: remarkable "^1.x" -react-router-dom@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d" +react-router-dom@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" dependencies: history "^4.7.2" - invariant "^2.2.2" + invariant "^2.2.4" loose-envify "^1.3.1" - prop-types "^15.5.4" - react-router "^4.2.0" - warning "^3.0.0" + prop-types "^15.6.1" + react-router "^4.3.1" + warning "^4.0.1" -react-router@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.2.0.tgz#61f7b3e3770daeb24062dae3eedef1b054155986" +react-router@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" dependencies: history "^4.7.2" - hoist-non-react-statics "^2.3.0" - invariant "^2.2.2" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.4" loose-envify "^1.3.1" path-to-regexp "^1.7.0" - prop-types "^15.5.4" - warning "^3.0.0" + prop-types "^15.6.1" + warning "^4.0.1" react-scripts@1.1.1: version "1.1.1" @@ -7905,6 +7905,12 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" +warning@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.1.tgz#66ce376b7fbfe8a887c22bdf0e7349d73d397745" + dependencies: + loose-envify "^1.0.0" + watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"