25 lines
645 B
JavaScript
25 lines
645 B
JavaScript
import { useEffect, useState } from 'react';
|
|
|
|
export function useCountdown(endsAt) {
|
|
const [remaining, setRemaining] = useState(0);
|
|
|
|
useEffect(() => {
|
|
if (!endsAt) {
|
|
setRemaining(0);
|
|
return undefined;
|
|
}
|
|
|
|
const tick = () => {
|
|
const ms = new Date(endsAt).getTime() - Date.now();
|
|
setRemaining(Math.max(0, Math.ceil(ms / 1000)));
|
|
};
|
|
tick();
|
|
const id = setInterval(tick, 250);
|
|
return () => clearInterval(id);
|
|
}, [endsAt]);
|
|
|
|
const mm = String(Math.floor(remaining / 60)).padStart(2, '0');
|
|
const ss = String(remaining % 60).padStart(2, '0');
|
|
return { remaining, label: `${mm}:${ss}` };
|
|
}
|