Skip to main content

useTimePicker

Hook behind <TimePicker>. Use when building custom time UIs (sliders, wheels, custom option lists).

import { useTimePicker } from '@kalyx/react';

Signature

function useTimePicker(options?: UseTimePickerOptions): UseTimePickerReturn;

Options

FieldTypeDefaultDescription
valueISODateString | nullControlled value.
defaultValueISODateStringUncontrolled initial value.
onChange(value: ISODateString | null) => voidChange callback.
format'12h' | '24h''24h'Time format.
stepnumber1Minute granularity.
withSecondsbooleanfalseInclude seconds.
displayTimezonestringIANA zone. When set, currentTime / setHour / setMinute read and write time-of-day as observed in this zone (DST-aware). See Timezone.

Return

FieldTypeDescription
valueISODateString | nullCurrent value.
currentTimeTimeValue{ hours, minutes, seconds }.
setTime(partial: Partial<TimeValue>) => voidMerge an update.
setHour(hour: number) => voidSet hour only (24h).
setMinute(minute: number) => voidSet minute only.
setSecond(second: number) => voidSet second only.
setPeriod(period: 'AM' | 'PM') => voidChange AM/PM (12h only).
availableHoursnumber[]Hour options for current format.
availableMinutesnumber[]Minute options filtered by step.
format'12h' | '24h'Resolved format.
displayHournumberHour in current format (12h maps 0/13 → 12/1).
period'AM' | 'PM' | nullnull in 24h mode.
pickerIdstringStable ID for ARIA wiring.

TimeValue

type TimeValue = {
hours: number; // 0–23
minutes: number; // 0–59
seconds: number; // 0–59
};

Example — scroll wheel

import { useTimePicker } from '@kalyx/react';

export function TimeWheel() {
const {
availableHours,
availableMinutes,
currentTime,
setHour,
setMinute,
} = useTimePicker({ step: 15 });

return (
<div className="flex gap-2">
<ul className="overflow-y-auto h-40">
{availableHours.map((h) => (
<li key={h}>
<button
aria-pressed={h === currentTime.hours}
onClick={() => setHour(h)}>
{String(h).padStart(2, '0')}
</button>
</li>
))}
</ul>
<ul className="overflow-y-auto h-40">
{availableMinutes.map((m) => (
<li key={m}>
<button
aria-pressed={m === currentTime.minutes}
onClick={() => setMinute(m)}>
{String(m).padStart(2, '0')}
</button>
</li>
))}
</ul>
</div>
);
}