Skip to content

useCountdown

A reactive countdown timer built on useIntervalFn. Decrements a counter by 1 on each tick, auto-pauses at 0, and provides full Pausable controls plus reset, stop, and start.

60
paused
import {
import useCountdown
useCountdown
} from "@usels/web";
const {
const remaining$: any
remaining$
} =
import useCountdown
useCountdown
(60);
// remaining$.get() → 60, 59, 58, ... 0
import {
import useCountdown
useCountdown
} from "@usels/web";
const {
const remaining$: any
remaining$
} =
import useCountdown
useCountdown
(10, {
onTick: (remaining: any) => any
onTick
: (
remaining: any
remaining
) =>
any
console
.
any
log
(`${
remaining: any
remaining
}s left`),
onComplete: () => any
onComplete
: () =>
any
console
.
any
log
("Done!"),
});
import {
import useCountdown
useCountdown
} from "@usels/web";
// Tick every 500ms instead of the default 1000ms
const {
const remaining$: any
remaining$
} =
import useCountdown
useCountdown
(30, {
interval: number
interval
: 500 });
import {
import useCountdown
useCountdown
} from "@usels/web";
const {
const remaining$: any
remaining$
,
const start: any
start
} =
import useCountdown
useCountdown
(10, {
immediate: boolean
immediate
: false });
// remaining$.get() === 10 (not started)
// start() to begin countdown
import {
import useCountdown
useCountdown
} from "@usels/web";
const {
const remaining$: any
remaining$
,
const reset: any
reset
,
const stop: any
stop
,
const start: any
start
,
const pause: any
pause
,
const resume: any
resume
} =
import useCountdown
useCountdown
(60);
// reset() → remaining$ back to 60 (timer keeps running)
// reset(30) → remaining$ set to 30
// stop() → pause + reset (fully stop)
// start() → reset + resume (restart)
// start(30) → reset to 30 + resume
// pause() → freeze countdown
// resume() → continue from current remaining$
export interface UseCountdownOptions {
interval?: number;
immediate?: boolean;
onTick?: (remaining: number) => void;
onComplete?: () => void;
}
export interface UseCountdownReturn extends Pausable {
remaining$: ReadonlyObservable<number>;
reset: (count?: number) => void;
stop: Fn;
start: (count?: number) => void;
}
export declare function useCountdown(initialCount: MaybeObservable<number>, options?: DeepMaybeObservable<UseCountdownOptions>): UseCountdownReturn;

View on GitHub

  • tigerwest
  • a7392ab 2026-03-06 - feat(core,browser): add sync strategy hooks (tigerwest)