I am trying to add a back button to my react app to render previous question. At the moment when an answer is selected it automatically moves to the next question with no way of user going back to check previous answers.
This is my App.js file
import React, { Component } from 'react';
import update from 'react-addons-update';
import quizQuestions from './api/quizQuestions';
import Quiz from './components/Quiz';
import Result from './components/Result';
import logo from './svg/logo.svg';
import './App.css';
class App extends Component {
constructor(props) {
super(props);
this.state = {
counter: 0,
questionId: 1,
question: '',
answerOptions: [],
answer: '',
answersCount: {
Nintendo: 0,
Microsoft: 0,
Sony: 0
},
result: ''
};
this.handleAnswerSelected = this.handleAnswerSelected.bind(this);
}
componentWillMount() {
const shuffledAnswerOptions = quizQuestions.map((question) => this.shuffleArray(question.answers));
this.setState({
question: quizQuestions[0].question,
answerOptions: shuffledAnswerOptions[0]
});
}
shuffleArray(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
};
handleAnswerSelected(event) {
this.setUserAnswer(event.currentTarget.value);
if (this.state.questionId < quizQuestions.length) {
setTimeout(() => this.setNextQuestion(), 300);
} else {
setTimeout(() => this.setResults(this.getResults()), 300);
}
}
// handleBackButtonSelected() {
// if (true) {}
// }
setUserAnswer(answer) {
const updatedAnswersCount = update(this.state.answersCount, {
[answer]: {$apply: (currentValue) => currentValue + 1}
});
this.setState({
answersCount: updatedAnswersCount,
answer: answer
});
}
setNextQuestion() {
const counter = this.state.counter + 1;
const questionId = this.state.questionId + 1;
this.setState({
counter: counter,
questionId: questionId,
question: quizQuestions[counter].question,
answerOptions: quizQuestions[counter].answers,
answer: ''
});
}
setPrevQuestion() {
const counter = this.state.counter - 1;
const questionId = this.state.questionId - 1;
this.setState({
counter: counter,
questionId: questionId,
question: quizQuestions[counter].question,
answerOptions: quizQuestions[counter].answers,
answer: ''
});
}
getResults() {
const answersCount = this.state.answersCount;
const answersCountKeys = Object.keys(answersCount);
const answersCountValues = answersCountKeys.map((key) => answersCount[key]);
const maxAnswerCount = Math.max.apply(null, answersCountValues);
return answersCountKeys.filter((key) => answersCount[key] === maxAnswerCount);
}
setResults(result) {
if (result.length === 1) {
this.setState({ result: result[0] });
} else {
this.setState({ result: 'Undetermined' });
}
}
renderQuiz() {
return (
<Quiz
answer={this.state.answer}
answerOptions={this.state.answerOptions}
questionId={this.state.questionId}
question={this.state.question}
questionTotal={quizQuestions.length}
onAnswerSelected={this.handleAnswerSelected}
backButtonSelected={this.setPrevQuestion}
/>
);
}
renderResult() {
return (
<Result quizResult={this.state.result} />
);
}
render() {
return (
<div className="App">
<div className="App-header">
<h2>Actavo Yellow Belt Exam</h2>
</div>
{this.state.result ? this.renderResult() : this.renderQuiz()}
</div>
);
}
}
export default App;
My Quiz.js file
import React from 'react';
import Question from '../components/Question';
import QuestionCount from '../components/QuestionCount';
import AnswerOption from '../components/AnswerOption';
function Quiz(props) {
function renderAnswerOptions(key) {
return (
<AnswerOption
key={key.content}
answerContent={key.content}
answerType={key.type}
answer={props.answer}
questionId={props.questionId}
onAnswerSelected={props.onAnswerSelected}
/>
);
}
return (
<div className="quiz">
<QuestionCount
counter={props.questionId}
total={props.questionTotal}
/>
<Question content={props.question} />
<ul className="answerOptions">
{props.answerOptions.map(renderAnswerOptions)}
</ul>
</div>
);
}
Quiz.propTypes = {
answer: React.PropTypes.string.isRequired,
answerOptions: React.PropTypes.array.isRequired,
counter: React.PropTypes.number.isRequired,
question: React.PropTypes.string.isRequired,
questionId: React.PropTypes.number.isRequired,
questionTotal: React.PropTypes.number.isRequired,
onAnswerSelected: React.PropTypes.func.isRequired
};
export default Quiz;
And my AnswerOption.js file
import React from 'react';
function AnswerOption(props) {
return (
<li className="answerOption">
<input
type="radio"
className="radioCustomButton"
name="radioGroup"
checked={props.answerType === props.answer}
id={props.answerType}
value={props.answerType}
disabled={props.answer}
onChange={props.onAnswerSelected}
/>
<label className="radioCustomLabel" htmlFor={props.answerType}>
{props.answerContent}
</label>
</li>
);
}
AnswerOption.propTypes = {
answerType: React.PropTypes.string.isRequired,
answerContent: React.PropTypes.string.isRequired,
answer: React.PropTypes.string.isRequired,
onAnswerSelected: React.PropTypes.func.isRequired
};
export default AnswerOption;
via TheWan
No comments:
Post a Comment