Use Countdown
wednesday-ui/use-countdownFreeHook
A hook for creating a countdown timer
Install it
npx shadcn@latest add https://ui.ednesdayw.com/r/use-countdown.jsonSource
1import { useCallback, useEffect, useState } from "react";23interface UseCountdownType {4 initialSeconds: number;5 autoStart?: boolean;6 onComplete?: () => void;7}89type CountdownState = "idle" | "running" | "finished";1011export const useCountdown = ({12 initialSeconds,13 autoStart = false,14 onComplete,15}: UseCountdownType) => {16 const [countdown, setCountdown] = useState(Math.max(initialSeconds, 0));17 const [status, setStatus] = useState<CountdownState>(18 autoStart ? "running" : "idle",19 );2021 const start = useCallback(() => {22 if (countdown <= 0) {23 setCountdown(Math.max(initialSeconds, 0));24 }2526 setStatus("running");27 }, [initialSeconds, countdown]);2829 const reset = useCallback(() => {30 setCountdown(Math.max(initialSeconds, 0));31 setStatus("idle");32 }, [initialSeconds]);3334 useEffect(() => {35 if (status === "idle" || status === "finished") return;3637 const interval = setInterval(() => {38 setCountdown((prev) => {39 const next = prev - 1;40 if (next <= 0) {41 clearInterval(interval);42 setStatus("finished");43 onComplete?.();44 return 0;45 }46 return next;47 });48 }, 1000);4950 return () => clearInterval(interval);51 }, [status, countdown, onComplete]);5253 return {54 countdown,55 status,56 start,57 reset,58 setCountdown,59 };60};6162export type UseCountdownReturn = ReturnType<typeof useCountdown>;
Files it writes
More from Wednesday UI
All 99 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Use Disclosureuse-disclosure | Wednesday UI | Hooks | Free | 1 dep | |
| Use Media Queryuse-media-query | Wednesday UI | Hooks | Free | no deps | |
| Use Rippleuse-ripple | Wednesday UI | Hooks | Free | no deps |
