1- import { Fragment , useEffect , useState } from " react" ;
1+ import { Fragment , useEffect , useState } from ' react'
22
33interface CountdownProps {
4- targetDate : string ; // YYYY-MM-DD format
4+ targetDate : string // YYYY-MM-DD format
55}
66
77interface TimeLeft {
8- days : number ;
9- hours : number ;
10- minutes : number ;
11- seconds : number ;
8+ days : number
9+ hours : number
10+ minutes : number
11+ seconds : number
1212}
1313
1414function calculateTimeLeft ( targetDate : string ) : TimeLeft {
15- const target = new Date ( `${ targetDate } T00:00:00-08:00` ) ;
16- const now = new Date ( ) ;
17- const difference = + target - + now ;
15+ const target = new Date ( `${ targetDate } T00:00:00-08:00` )
16+ const now = new Date ( )
17+ const difference = + target - + now
1818
1919 if ( difference <= 0 ) {
2020 return {
2121 days : 0 ,
2222 hours : 0 ,
2323 minutes : 0 ,
2424 seconds : 0 ,
25- } ;
25+ }
2626 }
2727
2828 return {
2929 days : Math . floor ( difference / ( 1000 * 60 * 60 * 24 ) ) ,
3030 hours : Math . floor ( ( difference / ( 1000 * 60 * 60 ) ) % 24 ) ,
3131 minutes : Math . floor ( ( difference / 1000 / 60 ) % 60 ) ,
3232 seconds : Math . floor ( ( difference / 1000 ) % 60 ) ,
33- } ;
33+ }
3434}
3535
36- const formatNumber = ( number : number ) => number . toString ( ) . padStart ( 2 , "0" ) ;
36+ const formatNumber = ( number : number ) => number . toString ( ) . padStart ( 2 , '0' )
3737
3838const Countdown : React . FC < CountdownProps > = ( { targetDate } ) => {
3939 const [ timeLeft , setTimeLeft ] = useState < TimeLeft > (
40- calculateTimeLeft ( targetDate ) ,
41- ) ;
40+ calculateTimeLeft ( targetDate )
41+ )
4242
4343 useEffect ( ( ) => {
4444 const timer = setInterval ( ( ) => {
45- const newTimeLeft = calculateTimeLeft ( targetDate ) ;
46- setTimeLeft ( newTimeLeft ) ;
45+ const newTimeLeft = calculateTimeLeft ( targetDate )
46+ setTimeLeft ( newTimeLeft )
4747 if (
4848 newTimeLeft . days === 0 &&
4949 newTimeLeft . hours === 0 &&
5050 newTimeLeft . minutes === 0 &&
5151 newTimeLeft . seconds === 0
5252 ) {
53- clearInterval ( timer ) ;
53+ clearInterval ( timer )
5454 }
55- } , 1000 ) ;
55+ } , 1000 )
5656
57- return ( ) => clearInterval ( timer ) ;
58- } , [ targetDate ] ) ;
57+ return ( ) => clearInterval ( timer )
58+ } , [ targetDate ] )
5959
6060 if (
6161 timeLeft . days === 0 &&
6262 timeLeft . hours === 0 &&
6363 timeLeft . minutes === 0 &&
6464 timeLeft . seconds === 0
6565 ) {
66- return null ;
66+ return null
6767 }
6868
6969 return (
7070 < div className = "flex gap-2 justify-center" >
71- { [ " days" , " hours" , " minutes" , " seconds" ] . map ( ( unit , index ) => (
71+ { [ ' days' , ' hours' , ' minutes' , ' seconds' ] . map ( ( unit , index ) => (
7272 < Fragment key = { unit } >
73- { index > 0 && < span className = "h-[2rem] grid place-content-center" > :</ span > }
73+ { index > 0 && (
74+ < span className = "h-[2rem] grid place-content-center" > :</ span >
75+ ) }
7476
7577 < div className = { `${ unit } grid grid-cols-2 gap-x-1 gap-y-1.5` } >
7678 < span className = "h-[2.3rem] aspect-[6/7] grid place-content-center rounded-sm bg-[#f9f4da] bg-opacity-10 font-semibold" >
@@ -84,7 +86,7 @@ const Countdown: React.FC<CountdownProps> = ({ targetDate }) => {
8486 </ Fragment >
8587 ) ) }
8688 </ div >
87- ) ;
88- } ;
89+ )
90+ }
8991
90- export default Countdown ;
92+ export default Countdown
0 commit comments