import { useEffect, useState } from "preact/hooks"; const timeFmt = new Intl.RelativeTimeFormat("en-US"); export default function Countdown(props: { target: string }) { const target = new Date(props.target); const [now, setNow] = useState(new Date()); useEffect(() => { const timer = setInterval(() => { setNow((now) => { if (now > target) { clearInterval(timer); } return new Date(); }); }, 1000); return () => clearInterval(timer); }, [props.target]); if (now > target) { return 🎉; } const secondsLeft = Math.ceil((target.getTime() - now.getTime()) / 1000); return {timeFmt.format(secondsLeft, "seconds")}; }