-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathClock.js
More file actions
118 lines (111 loc) · 4.43 KB
/
Clock.js
File metadata and controls
118 lines (111 loc) · 4.43 KB
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
import Length from "./Length"
import { useState } from "react"
import { useEffect } from "react"
const Clock = () => {
const [displayTime, setDisplayTime] = useState(25 * 60)
const [breakTime, setBreakTime] = useState(5 * 60)
const [sessionTime, setSessionTime] = useState(25 * 60)
const [timerOn, setTimerOn] = useState(false)
const [onBreak, setOnBreak] = useState(false)
const [breakAudio, setBreakAudio] = useState(null)
useEffect(() => {
setBreakAudio(new Audio("https://raw.githubusercontent.com/freeCodeCamp/cdn/master/build/testable-projects-fcc/audio/BeepSound.wav"))
}, [])
const playBreakAudio = () => {
breakAudio.currentTime = 0
breakAudio.play()
}
const formatTime = (time) => {
let minutes = Math.floor(time / 60)
let seconds = time % 60
return (
(minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds)
)
}
const changeTime = (amount, type) => {
if (type == "break") {
if (breakTime <= 60 && amount < 0) {
return;
}
setBreakTime(prev => prev + amount)
} else {
if (sessionTime <= 60 && amount < 0) {
return;
}
setSessionTime(prev => prev + amount)
if (!timerOn) {
setDisplayTime(sessionTime + amount)
}
}
}
const resetTime = () => {
setDisplayTime(25 * 60)
setBreakTime(5 * 60)
setSessionTime(25 * 60)
}
const controlTime = () => {
let second = 1000
let date = new Date().getTime()
let nextDate = new Date().getTime() + second
let onBreakVariable = onBreak
if (!timerOn) {
let interval = setInterval(() => {
date = new Date().getTime()
if (date > nextDate) {
setDisplayTime((prev) => {
if (prev <= 0 && !onBreakVariable) {
playBreakAudio()
onBreakVariable = true
setOnBreak(true)
return breakTime
} else if (prev <= 0 && onBreakVariable) {
playBreakAudio()
onBreakVariable = false
setOnBreak(false)
return sessionTime
}
return prev - 1
})
nextDate += second
}
}, 30);
localStorage.clear();
localStorage.setItem("interval-id", interval)
}
if (timerOn) {
clearInterval(localStorage.getItem("interval-id"))
}
setTimerOn(!timerOn)
}
return (
<div className="screen">
<div className="text-container">
<h1 className="app-title">Promodoro Clock</h1>
</div>
<div className='box'>
<div className='wave'></div>
<div className="wave2"></div>
</div>
<div className="container">
<div className="settings-row">
<Length id="break-label" title={"Break Time"} changeTime={changeTime} type={"break"} time={breakTime} formatTime={formatTime} />
<Length id="session-label" title={"Session Time"} changeTime={changeTime} type={"session"} time={sessionTime} formatTime={formatTime} />
</div>
<div className="display">
<h2 id="timer-label" className="time-amount">{onBreak ? "Break" : "Session"}</h2>
<h1 id="time-left" className="time-amount">{formatTime(displayTime)}</h1>
<div className="controls">
<button id="start_stop" onClick={controlTime}>
{
timerOn ? (<i class="fas fa-pause"></i>) : (<i class="fas fa-play"></i>)
}
</button>
<button id="reset" onClick={resetTime}>
<i class="fas fa-redo-alt"></i>
</button>
</div>
</div></div>
</div>
)
}
export default Clock;