import { useState, useEffect } from 'react'; | |
interface CountdownData { | |
days: number; | |
hours: number; | |
minutes: number; | |
seconds: number; | |
isExpired: boolean; | |
} | |
export const useCountdown = (targetDate: Date | null): CountdownData => { | |
const [countdown, setCountdown] = useState<CountdownData>({ | |
days: 0, | |
hours: 0, | |
minutes: 0, | |
seconds: 0, | |
isExpired: false, | |
}); | |
useEffect(() => { | |
if (!targetDate) { | |
setCountdown({ | |
days: 0, | |
hours: 0, | |
minutes: 0, | |
seconds: 0, | |
isExpired: true, | |
}); | |
return; | |
} | |
const updateCountdown = () => { | |
const now = new Date().getTime(); | |
const target = targetDate.getTime(); | |
const difference = target - now; | |
if (difference <= 0) { | |
setCountdown({ | |
days: 0, | |
hours: 0, | |
minutes: 0, | |
seconds: 0, | |
isExpired: true, | |
}); | |
return; | |
} | |
const days = Math.floor(difference / (1000 * 60 * 60 * 24)); | |
const hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); | |
const minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60)); | |
const seconds = Math.floor((difference % (1000 * 60)) / 1000); | |
setCountdown({ | |
days, | |
hours, | |
minutes, | |
seconds, | |
isExpired: false, | |
}); | |
}; | |
// Update immediately | |
updateCountdown(); | |
// Set up interval to update every second | |
const interval = setInterval(updateCountdown, 1000); | |
return () => clearInterval(interval); | |
}, [targetDate]); | |
return countdown; | |
}; |