solution
//App
import React, { Component } from 'react';
import Timer from './Timer'
class App extends Component {
//no props being used here, so we can use the shorthand declaration of state
state = {
timerIDs: []
}
componentDidMount() {
this.handleAddTimer()
}
// No need to modify anything in render or the class methods below
// Unless, of course, you're curious about how it all works
render() {
return (
<div className="App">
<h1>MultiTimer</h1>
<button onClick={this.handleAddTimer}>Add New Timer</button>
<div className="TimerGrid">
{this.renderTimers()}
</div>
</div>
);
}
// returns array of components written in JSX, mapped from this.state.timerIDs
renderTimers = () => this.state.timerIDs.map(id => {
return <Timer key={id} id={id} removeTimer={this.removeTimer} />
})
// adds a random number for timer ID
handleAddTimer = () => {
this.setState(prevState => ({
timerIDs: [...prevState.timerIDs, Math.floor(Math.random()*1000)]
}))
}
// removeTimer updates state, removing any timer that matches the provided author
removeTimer = id => {
this.setState(prevState => ({
timerIDs: prevState.timerIDs.filter(timer_id => timer_id !== id)
}))
}
}
export default App;
//Timer
import React, { Component } from "react";
class Timer extends Component {
state = {
time: 0,
color: "#" + Math.floor(Math.random() * 16777215).toString(16)
};
componentDidMount() {
this.interval = setInterval(this.clockTick, 1000)
}
componentWillUnmount() {
this.stopClock()
}
render() {
const { time, color } = this.state;
return (
<section className="Timer" style={{ background: color }}>
<h1>{time}</h1>
<button onClick={this.stopClock}>Stop</button>
<aside className="mountText">Mounted</aside>
<small onClick={this.handleClose}>X</small>
</section>
);
}
//clock functions
clockTick = () => {
this.setState(prevState => ({
time: prevState.time + 1
}));
};
stopClock = () => {
clearInterval(this.interval);
};
// for the 'x' button,
handleClose = () => {
this.props.removeTimer(this.props.id);
};
}
export default Timer;