-
Notifications
You must be signed in to change notification settings - Fork 0
/
StopWatch.jsx
120 lines (94 loc) · 2.73 KB
/
StopWatch.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import React, { useEffect, useState }from 'react'
import './stopwatch.css';
const StopWatch = () => {
const initialTime = {
hours: 0,
minutes: 0,
seconds: 0,
miliseconds: 0,
}
const [timer, setTimer] = useState(initialTime)
const [timerRunning, setTimerRunning] = useState(false)
const [resetTimer, setResetTimer] = useState(false)
const timeFormat = (time) => {
if (!time) {
return '00';
}
if (time.toString().length === 1) {
time = "0" + time;
}
return time;
}
const handleStartTimer = (e) => {
setTimerRunning(!timerRunning); // Start / Stop
setResetTimer(false);
}
const handleResetTimer = (e) => {
setResetTimer(true); // Reset
}
useEffect(() => {
let newTimer = Object.assign({}, timer);
let timeInterval = null;
if (timerRunning) {
timeInterval = setInterval(() => {
let hours = newTimer.hours;
let minutes = newTimer.minutes;
let seconds = newTimer.seconds;
let miliseconds = newTimer.miliseconds + 1;
if (miliseconds >= 100) {
miliseconds = 0;
seconds = seconds + 1;
}
if (seconds >= 60) {
seconds = 0;
minutes = minutes + 1;
}
if (minutes >= 60) {
minutes = 0;
hours = hours + 1;
}
if (hours >= 60) {
hours = 0;
}
newTimer.hours = hours;
newTimer.minutes = minutes;
newTimer.seconds = seconds;
newTimer.miliseconds = miliseconds;
setTimer((preTimer) => {
return {...preTimer, ...newTimer}
});
}, 10);
} else {
clearInterval(timeInterval);
}
if (resetTimer) {
console.log('clicked')
clearInterval(timeInterval);
setTimer(initialTime); // Reset
}
return () => {
clearInterval(timeInterval);
}
}, [timerRunning, resetTimer])
return (
<React.Fragment>
<div className='stopwatch-ui'>
<div className='timer'>
{ (timer.hours > 0) && <span>{timeFormat(timer.hours)}<sub>h</sub></span> }
{ (timer.minutes > 0) && <span>{timeFormat(timer.minutes)}<sub>m</sub></span> }
<span>{timeFormat(timer.seconds)}<sub>s</sub></span>
<span>{timeFormat(timer.miliseconds.toString().slice(0,2))}<sub>ms</sub></span>
</div>
<div className='actions'>
<button onClick={(e) => handleStartTimer(e)} className='startstop-btn'>
Start/Stop
</button>
<button onClick={(e) => handleResetTimer(e)} className='reset-btn'>
Reset
</button>
</div>
</div>
</React.Fragment>
)
}
export default StopWatch