{"version":3,"file":"useTimePicker.hook.cjs","sources":["../../../../../src/components/forms/time-picker/hooks/useTimePicker.hook.ts"],"sourcesContent":["import { useCallback, useEffect, useId, useState } from 'react'\n\nimport { KEYS_THAT_OPEN_NATIVE_PICKER } from '@components/forms/time-picker/constants'\nimport type { UseTimePickerOptions, UseTimePickerReturn } from '@components/forms/time-picker/types'\nimport { clampTime, getCurrentTime, isValidTime, joinTime, splitTime } from '@components/forms/time-picker/utils/timePicker.utils.ts'\n\n/**\n * Manages state and interactions for the TimePicker component.\n *\n * Supports both controlled and uncontrolled modes, keeps the native time input\n * in sync with the popover selection, and only commits valid `HH:mm` values to\n * `onChange`.\n */\nexport const useTimePicker = ({\n    value,\n    defaultValue,\n    onChange,\n    id,\n    defaultPanelTime,\n    minTime,\n    maxTime,\n}: UseTimePickerOptions): UseTimePickerReturn => {\n    const isControlled = value !== undefined\n    const generatedId = useId()\n    const inputId = id ?? generatedId\n\n    const [selectedTime, setSelectedTime] = useState<string | undefined>(\n        isValidTime(defaultValue) ? defaultValue : undefined,\n    )\n    const [inputValue, setInputValue] = useState(\n        isValidTime(defaultValue) ? defaultValue : '',\n    )\n    const [open, setOpen] = useState(false)\n\n    const resolvedTime = isControlled ? (isValidTime(value) ? value : undefined) : selectedTime\n\n    useEffect(() => {\n        if (isControlled) {\n            setSelectedTime(isValidTime(value) ? value : undefined)\n            setInputValue(isValidTime(value) ? value : '')\n        }\n    }, [isControlled, value])\n\n    const updateTime = useCallback(\n        (time: string | undefined) => {\n            if (!isControlled) {\n                setSelectedTime(time)\n                setInputValue(time ?? '')\n            }\n            onChange?.(time)\n        },\n        [isControlled, onChange],\n    )\n\n    const handleInputChange = useCallback(\n        (event: React.ChangeEvent<HTMLInputElement>) => {\n            const newValue = event.target.value\n            setInputValue(newValue)\n\n            if (newValue === '') {\n                if (resolvedTime !== undefined) {\n                    updateTime(undefined)\n                }\n                return\n            }\n\n            if (isValidTime(newValue) && newValue !== resolvedTime) {\n                updateTime(newValue)\n            }\n        },\n        [resolvedTime, updateTime],\n    )\n\n    const handleHourSelect = useCallback(\n        (hour: string) => {\n            const minute = splitTime(resolvedTime)?.minute\n                ?? splitTime(defaultPanelTime)?.minute\n                ?? '00'\n            updateTime(clampTime(joinTime(hour, minute), minTime, maxTime))\n        },\n        [resolvedTime, defaultPanelTime, minTime, maxTime, updateTime],\n    )\n\n    const handleMinuteSelect = useCallback(\n        (minute: string) => {\n            const hour = splitTime(resolvedTime)?.hour\n                ?? splitTime(defaultPanelTime)?.hour\n                ?? '00'\n            updateTime(clampTime(joinTime(hour, minute), minTime, maxTime))\n            setOpen(false)\n        },\n        [resolvedTime, defaultPanelTime, minTime, maxTime, updateTime],\n    )\n\n    const handleNowSelect = useCallback(() => {\n        updateTime(clampTime(getCurrentTime(), minTime, maxTime))\n        setOpen(false)\n    }, [minTime, maxTime, updateTime])\n\n    const handleClear = useCallback(() => {\n        updateTime(undefined)\n        setOpen(false)\n    }, [updateTime])\n    const handleInputKeyDown = useCallback(\n        (event: React.KeyboardEvent<HTMLInputElement>) => {\n            const isSpace = KEYS_THAT_OPEN_NATIVE_PICKER.has(event.key)\n            const isAltArrowDown = event.key === 'ArrowDown' && event.altKey\n\n            if (isSpace || isAltArrowDown) {\n                event.preventDefault()\n                setOpen(true)\n            }\n        },\n        [],\n    )\n\n    return {\n        selectedTime: resolvedTime,\n        inputValue,\n        open,\n        inputId,\n        handleInputChange,\n        handleInputKeyDown,\n        handleHourSelect,\n        handleMinuteSelect,\n        handleNowSelect,\n        handleClear,\n        setOpen,\n    }\n}\r\n"],"names":["useTimePicker","value","defaultValue","onChange","id","defaultPanelTime","minTime","maxTime","isControlled","generatedId","useId","inputId","selectedTime","setSelectedTime","useState","isValidTime","inputValue","setInputValue","open","setOpen","resolvedTime","useEffect","updateTime","useCallback","time","handleInputChange","event","newValue","handleHourSelect","hour","minute","splitTime","clampTime","joinTime","handleMinuteSelect","handleNowSelect","getCurrentTime","handleClear","handleInputKeyDown","isSpace","KEYS_THAT_OPEN_NATIVE_PICKER","isAltArrowDown"],"mappings":"wLAaaA,EAAgB,CAAC,CAC1B,MAAAC,EACA,aAAAC,EACA,SAAAC,EACA,GAAAC,EACA,iBAAAC,EACA,QAAAC,EACA,QAAAC,CACJ,IAAiD,CAC7C,MAAMC,EAAeP,IAAU,OACzBQ,EAAcC,EAAAA,MAAA,EACdC,EAAUP,GAAMK,EAEhB,CAACG,EAAcC,CAAe,EAAIC,EAAAA,SACpCC,cAAYb,CAAY,EAAIA,EAAe,MAAA,EAEzC,CAACc,EAAYC,CAAa,EAAIH,EAAAA,SAChCC,cAAYb,CAAY,EAAIA,EAAe,EAAA,EAEzC,CAACgB,EAAMC,CAAO,EAAIL,EAAAA,SAAS,EAAK,EAEhCM,EAAeZ,EAAgBO,EAAAA,YAAYd,CAAK,EAAIA,EAAQ,OAAaW,EAE/ES,EAAAA,UAAU,IAAM,CACRb,IACAK,EAAgBE,EAAAA,YAAYd,CAAK,EAAIA,EAAQ,MAAS,EACtDgB,EAAcF,EAAAA,YAAYd,CAAK,EAAIA,EAAQ,EAAE,EAErD,EAAG,CAACO,EAAcP,CAAK,CAAC,EAExB,MAAMqB,EAAaC,EAAAA,YACdC,GAA6B,CACrBhB,IACDK,EAAgBW,CAAI,EACpBP,EAAcO,GAAQ,EAAE,GAE5BrB,IAAWqB,CAAI,CACnB,EACA,CAAChB,EAAcL,CAAQ,CAAA,EAGrBsB,EAAoBF,EAAAA,YACrBG,GAA+C,CAC5C,MAAMC,EAAWD,EAAM,OAAO,MAG9B,GAFAT,EAAcU,CAAQ,EAElBA,IAAa,GAAI,CACbP,IAAiB,QACjBE,EAAW,MAAS,EAExB,MACJ,CAEIP,cAAYY,CAAQ,GAAKA,IAAaP,GACtCE,EAAWK,CAAQ,CAE3B,EACA,CAACP,EAAcE,CAAU,CAAA,EAGvBM,EAAmBL,EAAAA,YACpBM,GAAiB,CACd,MAAMC,EAASC,EAAAA,UAAUX,CAAY,GAAG,QACjCW,YAAU1B,CAAgB,GAAG,QAC7B,KACPiB,EAAWU,EAAAA,UAAUC,WAASJ,EAAMC,CAAM,EAAGxB,EAASC,CAAO,CAAC,CAClE,EACA,CAACa,EAAcf,EAAkBC,EAASC,EAASe,CAAU,CAAA,EAG3DY,EAAqBX,EAAAA,YACtBO,GAAmB,CAChB,MAAMD,EAAOE,EAAAA,UAAUX,CAAY,GAAG,MAC/BW,YAAU1B,CAAgB,GAAG,MAC7B,KACPiB,EAAWU,EAAAA,UAAUC,WAASJ,EAAMC,CAAM,EAAGxB,EAASC,CAAO,CAAC,EAC9DY,EAAQ,EAAK,CACjB,EACA,CAACC,EAAcf,EAAkBC,EAASC,EAASe,CAAU,CAAA,EAG3Da,EAAkBZ,EAAAA,YAAY,IAAM,CACtCD,EAAWU,EAAAA,UAAUI,EAAAA,eAAA,EAAkB9B,EAASC,CAAO,CAAC,EACxDY,EAAQ,EAAK,CACjB,EAAG,CAACb,EAASC,EAASe,CAAU,CAAC,EAE3Be,EAAcd,EAAAA,YAAY,IAAM,CAClCD,EAAW,MAAS,EACpBH,EAAQ,EAAK,CACjB,EAAG,CAACG,CAAU,CAAC,EACTgB,EAAqBf,EAAAA,YACtBG,GAAiD,CAC9C,MAAMa,EAAUC,EAAAA,6BAA6B,IAAId,EAAM,GAAG,EACpDe,EAAiBf,EAAM,MAAQ,aAAeA,EAAM,QAEtDa,GAAWE,KACXf,EAAM,eAAA,EACNP,EAAQ,EAAI,EAEpB,EACA,CAAA,CAAC,EAGL,MAAO,CACH,aAAcC,EACd,WAAAJ,EACA,KAAAE,EACA,QAAAP,EACA,kBAAAc,EACA,mBAAAa,EACA,iBAAAV,EACA,mBAAAM,EACA,gBAAAC,EACA,YAAAE,EACA,QAAAlB,CAAA,CAER"}