1
- import { useCallback , useEffect , useMemo , useState } from "react" ;
1
+ import { useEffect , useMemo , useState } from "react" ;
2
2
3
3
type TimerType = "countup" | "countdown" ;
4
4
@@ -31,22 +31,29 @@ const calculateTimerState = (type: TimerType, startTime: number | null, timeout:
31
31
} ;
32
32
33
33
export const useTimer = ( { timeout = 0 , type = "countup" , isCounting = false , onTimeOut } : UseTimerOptions ) => {
34
+ const [ localTimeout , setLocalTimeout ] = useState ( timeout ) ;
34
35
const [ { seconds, minutes, timeLeft, timeLeftPercents } , setTimer ] = useState (
35
- calculateTimerState ( type , null , timeout )
36
+ calculateTimerState ( type , null , localTimeout )
36
37
) ;
37
38
38
39
const [ startTime , setStartTime ] = useState < number | null > ( isCounting ? Date . now ( ) : null ) ;
39
40
const [ endTime , setEndTime ] = useState < number | null > ( null ) ;
40
41
const [ localIsCounting , setIsCounting ] = useState ( isCounting ) ;
41
42
42
- const computeTimer = useCallback ( ( ) => {
43
- setTimer ( calculateTimerState ( type , startTime , timeout ) ) ;
44
- } , [ startTime , timeout , type , setTimer , localIsCounting ] ) ;
45
-
46
43
useEffect ( ( ) => {
47
44
setIsCounting ( isCounting ) ;
48
45
} , [ isCounting ] ) ;
49
46
47
+ useEffect ( ( ) => {
48
+ setStartTime ( null ) ;
49
+ setEndTime ( null ) ;
50
+ setLocalTimeout ( timeout ) ;
51
+ } , [ timeout , type , setStartTime , setEndTime , setLocalTimeout ] ) ;
52
+
53
+ useEffect ( ( ) => {
54
+ setTimer ( calculateTimerState ( type , startTime , timeout ) ) ;
55
+ } , [ localTimeout , setTimer ] ) ;
56
+
50
57
useEffect ( ( ) => {
51
58
if ( localIsCounting && ! startTime ) {
52
59
setStartTime ( Date . now ( ) ) ;
@@ -61,21 +68,25 @@ export const useTimer = ({ timeout = 0, type = "countup", isCounting = false, on
61
68
}
62
69
} , [ timeLeft , type , onTimeOut ] ) ;
63
70
64
- useEffect ( ( ) => {
65
- computeTimer ( ) ;
66
- } , [ computeTimer ] ) ;
71
+ // useEffect(() => {
72
+ // computeTimer();
73
+ // }, [computeTimer]);
67
74
68
75
useEffect ( ( ) => {
69
76
if ( ! localIsCounting ) {
70
77
return ( ) => { } ;
71
78
}
72
79
80
+ const computeTimer = ( ) => {
81
+ setTimer ( calculateTimerState ( type , startTime , timeout ) ) ;
82
+ } ;
83
+
73
84
const interval = setInterval ( computeTimer , 1000 ) ;
74
85
75
86
return ( ) => {
76
87
clearInterval ( interval ) ;
77
88
} ;
78
- } , [ computeTimer ] ) ;
89
+ } , [ startTime , timeout , type , setTimer , localIsCounting ] ) ;
79
90
80
91
return useMemo (
81
92
( ) => ( { timeLeft, minutes, seconds, timeLeftPercents, startTime, endTime, isCounting : localIsCounting } ) ,
0 commit comments