Skip to content

Instantly share code, notes, and snippets.

@gregjsmith
Created October 15, 2018 23:46
Show Gist options
  • Save gregjsmith/3573107f4a516604d733ee424dc118a2 to your computer and use it in GitHub Desktop.
Save gregjsmith/3573107f4a516604d733ee424dc118a2 to your computer and use it in GitHub Desktop.
const Stars = (props) => {
return(
<div className="col-5">
{_.range(props.numberOfStars).map(i =>
<i key={i} className="fa fa-star"></i>
)}
</div>
)
}
const Button = (props) => {
let button;
switch(props.answerIsCorrect){
case true:
button =
<button className="btn-success">
<i className="fa fa-check"></i>
</button>;
break;
case false:
button =
<button className="btn-danger">
<i className="fa fa-times"></i>
</button>;
break;
default:
button =
<button className="btn" onClick={props.checkAnswer} disabled={props.selectedNumbers.length === 0}>
=
</button>;
break;
}
return(
<div className="col-2">
{button}
</div>
)
}
const Answer = (props) => {
return(
<div className="col-5">
{props.selectedNumbers.map((number, i) =>
<span key={i} onClick={() => props.removeNumber(number)}>
{number}
</span>
)}
</div>
)
}
const Numbers = (props) => {
const numberClassName = (number) => {
if(props.usedNumbers.indexOf(number) >= 0) {
return 'used';
}
if(props.selectedNumbers.indexOf(number) >= 0) {
return 'selected';
}
};
return(
<div className="card text-center">
<div>
{Numbers.list.map((number, i) =>
<span key={i} className={numberClassName(number)}
onClick={() => props.selectNumber(number)}>
{number}
</span>
)}
</div>
</div>
)
}
Numbers.list = _.range(1,10);
class Game extends React.Component {
state = {
selectedNumbers: [],
randomNumberOfStars: 1 + Math.floor(Math.random()*9),
answerIsCorrect: null,
usedNumbers: [3,4]
};
selectNumber = (clickedNumber) => {
if(this.state.selectedNumbers.indexOf(clickedNumber) >= 0) {return;};
this.setState(prevState => ({
answerIsCorrect: null,
selectedNumbers: prevState.selectedNumbers.concat(clickedNumber)
}));
};
removeNumber = (numberToRemove) => {
this.setState(prevState => ({
answerIsCorrect: null,
selectedNumbers: prevState.selectedNumbers.filter(number => number !== numberToRemove)
}))
};
checkAnswer = () => {
this.setState(prevState => ({
answerIsCorrect: prevState.randomNumberOfStars ===
prevState.selectedNumbers.reduce((acc, num) => acc + num, 0)
}))
};
render(){
const {selectedNumbers, randomNumberOfStars, answerIsCorrect, usedNumbers} = this.state;
return (
<div className="container">
<h3>Play Nine</h3>
<hr/>
<div className="row">
<Stars numberOfStars={randomNumberOfStars}/>
<Button selectedNumbers={selectedNumbers}
checkAnswer={this.checkAnswer}
answerIsCorrect={answerIsCorrect}/>
<Answer selectedNumbers={selectedNumbers}
removeNumber={this.removeNumber}/>
</div>
<br/>
<Numbers selectedNumbers={selectedNumbers}
selectNumber={this.selectNumber}
usedNumbers={this.usedNumbers}/>
</div>
)
}
}
class App extends React.Component {
render(){
return (
<div>
<Game />
</div>
)
}
}
ReactDOM.render(<App />, mountNode)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment