Skip to main content

useTimePicker

Time picker hook with spinbutton fields, keyboard input, and AM/PM support.

import { useTimePicker } from '@gentleduck/calendar'
import type { Time, UseTimePicker } from '@gentleduck/calendar'
import { useTimePicker } from '@gentleduck/calendar'
import type { Time, UseTimePicker } from '@gentleduck/calendar'

Usage

import { useTimePicker } from '@gentleduck/calendar'
 
function MyTimePicker() {
  const { state, actions, getFieldProps } = useTimePicker({
    hourCycle: '12',
    showSeconds: true,
  })
 
  return (
    <div>
      <input {...getFieldProps('hour')} />
      <span>:</span>
      <input {...getFieldProps('minute')} />
      <span>:</span>
      <input {...getFieldProps('second')} />
      <button {...getFieldProps('ampm')}>{state.displayAmPm}</button>
    </div>
  )
}
import { useTimePicker } from '@gentleduck/calendar'
 
function MyTimePicker() {
  const { state, actions, getFieldProps } = useTimePicker({
    hourCycle: '12',
    showSeconds: true,
  })
 
  return (
    <div>
      <input {...getFieldProps('hour')} />
      <span>:</span>
      <input {...getFieldProps('minute')} />
      <span>:</span>
      <input {...getFieldProps('second')} />
      <button {...getFieldProps('ampm')}>{state.displayAmPm}</button>
    </div>
  )
}

Config

useTimePicker accepts UseTimePicker.IUseTimePickerConfig (extends Time.ITimePickerConfig).

PropTypeDefaultDescription
valueTime.ITimeValue-Controlled time value
defaultValueTime.ITimeValue{ hour: 0, minute: 0 }Default time (uncontrolled)
onChange(value: Time.ITimeValue) => void-Called when time changes
hourCycleTime.HourCycle'24''12' or '24' hour display
showSecondsbooleanfalseShow the seconds field
minTimeTime.ITimeValue-Minimum selectable time
maxTimeTime.ITimeValue-Maximum selectable time
minuteStepnumber1Step increment for minutes
secondStepnumber1Step increment for seconds

Return value

useTimePicker returns UseTimePicker.IUseTimePickerReturn.

state

PropertyTypeDescription
valueTime.ITimeValueCurrent time value { hour, minute, second? }
focusedFieldTime.TimeFieldCurrently focused field
hourCycleTime.HourCycleActive hour cycle
displayHournumberHour adjusted for 12h display
displayAmPm'AM' | 'PM'Current AM/PM value

actions

MethodSignatureDescription
setValue(value: Time.ITimeValue) => voidSet the full time value
setField(field: Time.TimeField, value: number) => voidSet a single field
increment(field: Time.TimeField, delta?: number) => voidIncrement a field
decrement(field: Time.TimeField, delta?: number) => voidDecrement a field
toggleAmPm() => voidToggle between AM and PM
focusField(field: Time.TimeField) => voidMove focus to a field

getFieldProps

getFieldProps(field: Time.TimeField) => UseTimePicker.ITimeFieldProps
getFieldProps(field: Time.TimeField) => UseTimePicker.ITimeFieldProps

Returns props to spread on each time field element:

PropTypeDescription
role'spinbutton'ARIA spinbutton role
aria-labelstringField label
aria-valueminnumberMinimum value
aria-valuemaxnumberMaximum value
aria-valuenownumberCurrent value
aria-valuetextstringDisplay value
tabIndex0 | -1Focus management
data-slotstringSlot identifier
data-focused'true' | undefinedWhether field is focused
onKeyDownKeyboardEventHandlerKeyboard input handler
onFocus() => voidFocus handler