{"version":3,"file":"useDatePicker.hook.cjs","sources":["../../../../../src/components/forms/date-picker/hooks/useDatePicker.hook.ts"],"sourcesContent":["import { useCallback, useEffect, useId, useState } from 'react'\r\n\r\nimport { formatDateToString, parseStringToDate } from '@components/forms/date-picker/utils/datePicker.utils.ts'\r\nimport type { UseDatePickerOptions, UseDatePickerReturn } from '@components/forms/date-picker/types'\r\nimport { KEYS_THAT_OPEN_NATIVE_PICKER } from '@components/forms/date-picker/constants'\r\n\r\n/**\r\n * Manages state and interactions for the DatePicker component.\r\n *\r\n * Supports both controlled and uncontrolled modes, keeps the native date input\r\n * in sync with the calendar selection, and only commits valid `YYYY-MM-DD`\r\n * values to `onChange`.\r\n */\r\nexport const useDatePicker = ({\r\n    value,\r\n    defaultValue,\r\n    onChange,\r\n    id,\r\n}: UseDatePickerOptions): UseDatePickerReturn => {\r\n    const isControlled = value !== undefined\r\n    const generatedId = useId()\r\n    const inputId = id ?? generatedId\r\n\r\n    const [selectedDate, setSelectedDate] = useState<Date | undefined>(defaultValue)\r\n    const [inputValue, setInputValue] = useState(formatDateToString(defaultValue))\r\n    const [open, setOpen] = useState(false)\r\n\r\n    const resolvedDate = isControlled ? value : selectedDate\r\n\r\n    useEffect(() => {\r\n        if (isControlled) {\r\n            setSelectedDate(value)\r\n            setInputValue(formatDateToString(value))\r\n        }\r\n    }, [isControlled, value])\r\n\r\n    const updateDate = useCallback(\r\n        (date: Date | undefined) => {\r\n            if (!isControlled) {\r\n                setSelectedDate(date)\r\n                setInputValue(formatDateToString(date))\r\n            }\r\n            onChange?.(date)\r\n        },\r\n        [isControlled, onChange],\r\n    )\r\n\r\n    const handleInputChange = useCallback(\r\n        (event: React.ChangeEvent<HTMLInputElement>) => {\r\n            const newValue = event.target.value\r\n            setInputValue(newValue)\r\n\r\n            if (newValue === '') {\r\n                if (resolvedDate !== undefined) {\r\n                    updateDate(undefined)\r\n                }\r\n                return\r\n            }\r\n\r\n            const parsed = parseStringToDate(newValue)\r\n            if (parsed && parsed.getTime() !== resolvedDate?.getTime()) {\r\n                updateDate(parsed)\r\n            }\r\n        },\r\n        [resolvedDate, updateDate],\r\n    )\r\n\r\n    const handleCalendarSelect = useCallback(\r\n        (date: Date | undefined) => {\r\n            updateDate(date)\r\n            setOpen(false)\r\n        },\r\n        [updateDate],\r\n    )\r\n\r\n    const handleInputKeyDown = useCallback(\r\n        (event: React.KeyboardEvent<HTMLInputElement>) => {\r\n            const isSpace = KEYS_THAT_OPEN_NATIVE_PICKER.has(event.key)\r\n            const isAltArrowDown = event.key === 'ArrowDown' && event.altKey\r\n\r\n            if (isSpace || isAltArrowDown) {\r\n                event.preventDefault()\r\n                setOpen(true)\r\n            }\r\n        },\r\n        [],\r\n    )\r\n\r\n    return {\r\n        selectedDate: resolvedDate,\r\n        inputValue,\r\n        open,\r\n        inputId,\r\n        handleInputChange,\r\n        handleInputKeyDown,\r\n        handleCalendarSelect,\r\n        setOpen,\r\n    }\r\n}\r\n"],"names":["useDatePicker","value","defaultValue","onChange","id","isControlled","generatedId","useId","inputId","selectedDate","setSelectedDate","useState","inputValue","setInputValue","formatDateToString","open","setOpen","resolvedDate","useEffect","updateDate","useCallback","date","handleInputChange","event","newValue","parsed","parseStringToDate","handleCalendarSelect","handleInputKeyDown","isSpace","KEYS_THAT_OPEN_NATIVE_PICKER","isAltArrowDown"],"mappings":"wLAaaA,EAAgB,CAAC,CAC1B,MAAAC,EACA,aAAAC,EACA,SAAAC,EACA,GAAAC,CACJ,IAAiD,CAC7C,MAAMC,EAAeJ,IAAU,OACzBK,EAAcC,EAAAA,MAAA,EACdC,EAAUJ,GAAME,EAEhB,CAACG,EAAcC,CAAe,EAAIC,EAAAA,SAA2BT,CAAY,EACzE,CAACU,EAAYC,CAAa,EAAIF,EAAAA,SAASG,EAAAA,mBAAmBZ,CAAY,CAAC,EACvE,CAACa,EAAMC,CAAO,EAAIL,EAAAA,SAAS,EAAK,EAEhCM,EAAeZ,EAAeJ,EAAQQ,EAE5CS,EAAAA,UAAU,IAAM,CACRb,IACAK,EAAgBT,CAAK,EACrBY,EAAcC,EAAAA,mBAAmBb,CAAK,CAAC,EAE/C,EAAG,CAACI,EAAcJ,CAAK,CAAC,EAExB,MAAMkB,EAAaC,EAAAA,YACdC,GAA2B,CACnBhB,IACDK,EAAgBW,CAAI,EACpBR,EAAcC,EAAAA,mBAAmBO,CAAI,CAAC,GAE1ClB,IAAWkB,CAAI,CACnB,EACA,CAAChB,EAAcF,CAAQ,CAAA,EAGrBmB,EAAoBF,EAAAA,YACrBG,GAA+C,CAC5C,MAAMC,EAAWD,EAAM,OAAO,MAG9B,GAFAV,EAAcW,CAAQ,EAElBA,IAAa,GAAI,CACbP,IAAiB,QACjBE,EAAW,MAAS,EAExB,MACJ,CAEA,MAAMM,EAASC,EAAAA,kBAAkBF,CAAQ,EACrCC,GAAUA,EAAO,QAAA,IAAcR,GAAc,WAC7CE,EAAWM,CAAM,CAEzB,EACA,CAACR,EAAcE,CAAU,CAAA,EAGvBQ,EAAuBP,EAAAA,YACxBC,GAA2B,CACxBF,EAAWE,CAAI,EACfL,EAAQ,EAAK,CACjB,EACA,CAACG,CAAU,CAAA,EAGTS,EAAqBR,EAAAA,YACtBG,GAAiD,CAC9C,MAAMM,EAAUC,EAAAA,6BAA6B,IAAIP,EAAM,GAAG,EACpDQ,EAAiBR,EAAM,MAAQ,aAAeA,EAAM,QAEtDM,GAAWE,KACXR,EAAM,eAAA,EACNP,EAAQ,EAAI,EAEpB,EACA,CAAA,CAAC,EAGL,MAAO,CACH,aAAcC,EACd,WAAAL,EACA,KAAAG,EACA,QAAAP,EACA,kBAAAc,EACA,mBAAAM,EACA,qBAAAD,EACA,QAAAX,CAAA,CAER"}