Skip to main content

Countdown Timer

Hooks for managing countdown timers with pause, resume, and tab-visibility support.

useCountdown

Core hook. Returns remaining time in milliseconds plus controls.

import { useCountdown } from '@traveloka/utils/countdown-timer';

const {
remaining,
isRunning,
isFinished,
start,
pause,
resume,
reset,
restart,
} = useCountdown({
duration: 30000, // ms
interval: 1000, // tick every 1s (default)
autoStart: false, // start immediately (default: false)
pauseOnHidden: true, // pause when tab hidden (default: true)
onFinish: () => console.log('done'),
onTick: remaining => console.log(remaining),
});

Options

PropTypeDefaultDescription
durationnumberrequiredTotal duration in ms
intervalnumber1000Tick interval in ms
autoStartbooleanfalseStart on mount
pauseOnHiddenbooleantruePause when tab loses focus
onFinish() => voidCalled when countdown reaches 0
onTick(remaining: number) => voidCalled on each tick

Returns

FieldTypeDescription
remainingnumberRemaining time in ms
statusCountdownStatus'idle' | 'running' | 'paused' | 'finished'
isRunningboolean
isFinishedboolean
isIdleboolean
start() => voidReset to duration and start
pause() => voidPause (no-op if not running)
resume() => voidResume from paused (no-op otherwise)
reset() => voidReset to duration, status → idle
restart() => voidReset to duration and start immediately

useCountdownSeconds

Wraps useCountdown. Same API plus hours, minutes, seconds fields derived from remaining.

import { useCountdownSeconds } from '@traveloka/utils/countdown-timer';

const { hours, minutes, seconds, isFinished, start } = useCountdownSeconds({
duration: 3600000, // 1 hour
autoStart: true,
});

return (
<span>
{hours}:{minutes}:{seconds}
</span>
);

Additional Returns

FieldTypeDescription
hoursnumberFull hours remaining
minutesnumberRemaining minutes (0–59)
secondsnumberRemaining seconds (0–59)

Status Machine

stateDiagram-v2
[*] --> idle

idle --> running : start()
running --> paused : pause()
running --> idle : reset()
running --> finished : timer hits 0
paused --> running : resume()
paused --> idle : reset()
finished --> idle : reset()

idle --> running : restart()
running --> running : restart()
paused --> running : restart()
finished --> running : restart()

Notes

  • pauseOnHidden auto-pauses on visibilitychange and resumes when tab becomes visible again.
  • start and reset always reset remaining to duration. Use resume to continue from where it left off.
  • interval precision depends on setInterval; sub-100ms values may drift.