Added Timer component
This commit is contained in:
parent
5568a22952
commit
5e1541f2f3
46
src/Timer.css
Normal file
46
src/Timer.css
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
.app {
|
||||||
|
text-align: center;
|
||||||
|
background-color: #282c34;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: calc(10px + 2vmin);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.time {
|
||||||
|
font-size: 3rem;
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
padding: .6rem 1.5rem;
|
||||||
|
margin: .4rem;
|
||||||
|
border-radius: 3px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: .8rem;
|
||||||
|
border-style: groove;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button:focus {
|
||||||
|
outline-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-primary:hover {
|
||||||
|
background-color: #2641d4;
|
||||||
|
border: 1px solid #1b1f2b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-primary-active {
|
||||||
|
background-color: #3151ff;
|
||||||
|
border: 1px solid #152684;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-primary-inactive {
|
||||||
|
background-color: #3151ff;
|
||||||
|
border: 1px solid #152684;
|
||||||
|
color: white;
|
||||||
|
}
|
53
src/Timer.js
Normal file
53
src/Timer.js
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
// I used code as basis to this Timer
|
||||||
|
// Build a React Timer Component Using Hooks by James King
|
||||||
|
// https://upmostly.com/tutorials/build-a-react-timer-component-using-hooks
|
||||||
|
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
|
const Timer = () => {
|
||||||
|
const [seconds, setSeconds] = useState(0);
|
||||||
|
const [isActive, setIsActive] = useState(false);
|
||||||
|
|
||||||
|
function toggle() {
|
||||||
|
setIsActive(!isActive);
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop() {
|
||||||
|
setSeconds(0);
|
||||||
|
setIsActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let interval = null;
|
||||||
|
if (isActive) {
|
||||||
|
interval = setInterval(() => {
|
||||||
|
setSeconds(seconds => seconds + 1);
|
||||||
|
}, 1000);
|
||||||
|
} else if (!isActive && seconds !== 0) {
|
||||||
|
clearInterval(interval);
|
||||||
|
}
|
||||||
|
return () => clearInterval(interval);
|
||||||
|
}, [isActive, seconds]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="timer">
|
||||||
|
<div className="time">
|
||||||
|
{seconds}s
|
||||||
|
</div>
|
||||||
|
<div className="row">
|
||||||
|
<button className={`button button-primary button-primary-${isActive ? 'active' : 'inactive'}`} onClick={toggle}>
|
||||||
|
{isActive ? 'Pause' : 'Start'}
|
||||||
|
</button>
|
||||||
|
<button className="button" onClick={stop}>
|
||||||
|
Stop
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button className="button" onClick={stop}>
|
||||||
|
Stop
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Timer;
|
Loading…
Reference in New Issue
Block a user