11import { useState , useEffect , useRef } from 'react' ;
22
3- /* --------------------- useStopwatch ----------------------- */
4-
53export default function useStopwatch ( settings ) {
64 const { autoStart } = settings || { } ;
75
8- // Seconds
9- const [ seconds , setSeconds ] = useState ( 0 ) ;
10- function addSecond ( ) {
11- setSeconds ( prevSeconds => {
12- if ( prevSeconds === 59 ) {
13- addMinute ( ) ;
6+ // Days
7+ const [ days , setDays ] = useState ( 0 ) ;
8+ function addDay ( ) {
9+ setDays ( ( prevDays ) => ( prevDays + 1 ) ) ;
10+ }
11+
12+ // Hours
13+ const [ hours , setHours ] = useState ( 0 ) ;
14+ function addHour ( ) {
15+ setHours ( ( prevHours ) => {
16+ if ( prevHours === 23 ) {
17+ addDay ( ) ;
1418 return 0 ;
1519 }
16- return prevSeconds + 1 ;
20+ return prevHours + 1 ;
1721 } ) ;
1822 }
1923
2024 // Minutes
2125 const [ minutes , setMinutes ] = useState ( 0 ) ;
2226 function addMinute ( ) {
23- setMinutes ( prevMinutes => {
27+ setMinutes ( ( prevMinutes ) => {
2428 if ( prevMinutes === 59 ) {
2529 addHour ( ) ;
2630 return 0 ;
@@ -29,37 +33,29 @@ export default function useStopwatch(settings) {
2933 } ) ;
3034 }
3135
32- // Hours
33- const [ hours , setHours ] = useState ( 0 ) ;
34- function addHour ( ) {
35- setHours ( prevHours => {
36- if ( prevHours === 23 ) {
37- addDay ( ) ;
36+ // Seconds
37+ const [ seconds , setSeconds ] = useState ( 0 ) ;
38+ function addSecond ( ) {
39+ setSeconds ( ( prevSeconds ) => {
40+ if ( prevSeconds === 59 ) {
41+ addMinute ( ) ;
3842 return 0 ;
3943 }
40- return prevHours + 1 ;
41- } ) ;
42- }
43-
44- // Days
45- const [ days , setDays ] = useState ( 0 ) ;
46- function addDay ( ) {
47- setDays ( prevDays => {
48- return prevDays + 1 ;
44+ return prevSeconds + 1 ;
4945 } ) ;
5046 }
5147
5248 // Control functions
5349 const intervalRef = useRef ( ) ;
5450
5551 function start ( ) {
56- if ( ! intervalRef . current ) {
52+ if ( ! intervalRef . current ) {
5753 intervalRef . current = setInterval ( ( ) => addSecond ( ) , 1000 ) ;
5854 }
5955 }
6056
6157 function pause ( ) {
62- if ( intervalRef . current ) {
58+ if ( intervalRef . current ) {
6359 clearInterval ( intervalRef . current ) ;
6460 intervalRef . current = undefined ;
6561 }
@@ -78,11 +74,13 @@ export default function useStopwatch(settings) {
7874
7975 // didMount effect
8076 useEffect ( ( ) => {
81- if ( autoStart ) {
77+ if ( autoStart ) {
8278 start ( ) ;
8379 }
8480 return reset ;
85- } , [ ] ) ;
81+ } , [ ] ) ;
8682
87- return { seconds, minutes, hours, days, start, pause, reset } ;
88- }
83+ return {
84+ seconds, minutes, hours, days, start, pause, reset,
85+ } ;
86+ }
0 commit comments