{"version":3,"file":"TimePickerInput.mjs","sources":["../../../../src/lib/nextGenComponents/components/CustomRangePicker/TimePickerInput.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport {\n  MaskedInput,\n  isMaskComplete,\n  type MaskItem\n} from '@/components/CustomRangePicker/MaskedInput'\nimport SelectIcon from '../../../images/select.svg?react'\nimport { cn } from '@/lib/utils'\nimport {\n  buildHalfHourOptions,\n  getTimePlaceholder,\n  is12HourFormat,\n  parseTimeInput\n} from '@/utils/date.utils'\n\ntype Props = {\n  value: string\n  onChange: (value: string) => void\n  className?: string\n}\n\nconst PLACEHOLDER_CHAR = '_' as const\n\nconst use12h = is12HourFormat()\n\nconst timeMask12h = (value: string): MaskItem[] => {\n  const firstChar = value[0]\n  return [\n    /[0-1]/,\n    firstChar === '1' ? /[0-2]/ : /[0-9]/,\n    ':',\n    /[0-5]/,\n    /[0-9]/,\n    ' ',\n    /[AaPp]/,\n    /[Mm]/\n  ]\n}\n\nconst timeMask24h = (value: string): MaskItem[] => {\n  const firstChar = value[0]\n  return [/[0-2]/, firstChar === '2' ? /[0-3]/ : /[0-9]/, ':', /[0-5]/, /[0-9]/]\n}\n\nconst timeMask = use12h ? timeMask12h : timeMask24h\nconst timePlaceholder = getTimePlaceholder()\n\nexport const TimePickerInput = ({ value, onChange, className }: Props) => {\n  const [maskedValue, setMaskedValue] = useState('')\n  const [isOpen, setIsOpen] = useState(false)\n  const wrapperRef = useRef<HTMLDivElement>(null)\n  const listRef = useRef<HTMLDivElement>(null)\n  const options = useMemo(() => buildHalfHourOptions(), [])\n\n  useEffect(() => {\n    setMaskedValue(value)\n  }, [value])\n\n  useEffect(() => {\n    if (!isOpen) return\n    const handleClick = (e: MouseEvent) => {\n      if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n        setIsOpen(false)\n      }\n    }\n    document.addEventListener('mousedown', handleClick)\n    return () => document.removeEventListener('mousedown', handleClick)\n  }, [isOpen])\n\n  useEffect(() => {\n    if (!isOpen || !listRef.current || !value) return\n    const activeEl = listRef.current.querySelector('[data-active=\"true\"]')\n    if (activeEl) activeEl.scrollIntoView({ block: 'nearest' })\n  }, [isOpen, value])\n\n  const handleMaskedChange = useCallback(\n    (masked: string) => {\n      setMaskedValue(masked)\n      setIsOpen(false)\n      if (isMaskComplete(masked, PLACEHOLDER_CHAR)) {\n        const normalized = parseTimeInput(masked)\n        if (normalized) onChange(normalized)\n      }\n    },\n    [onChange]\n  )\n\n  const handleBlur = useCallback(() => {\n    if (!maskedValue) return\n    if (isMaskComplete(maskedValue, PLACEHOLDER_CHAR)) {\n      const normalized = parseTimeInput(maskedValue)\n      if (normalized) {\n        setMaskedValue(normalized)\n        onChange(normalized)\n      } else {\n        setMaskedValue(value)\n      }\n    } else {\n      setMaskedValue(value)\n    }\n  }, [maskedValue, value, onChange])\n\n  const handleOptionSelect = (option: string) => {\n    setMaskedValue(option)\n    onChange(option)\n    setIsOpen(false)\n  }\n\n  return (\n    <div ref={wrapperRef} className={cn('relative', className)}>\n      <MaskedInput\n        mask={timeMask}\n        value={maskedValue}\n        onChange={handleMaskedChange}\n        onBlur={handleBlur}\n        textPlaceholder={timePlaceholder}\n        className={cn(\n          'h-10 w-full pr-7 text-center text-[14px] border border-[#C4C2C8] rounded-md focus-visible:ring-1 focus-visible:ring-igz-light-purple focus-visible:outline-none',\n          value ? 'text-igz-primary' : 'text-[#C4C2C8]'\n        )}\n      />\n      <button\n        type=\"button\"\n        className=\"absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer\"\n        onMouseDown={e => e.preventDefault()}\n        onClick={() => setIsOpen(prev => !prev)}\n        tabIndex={-1}\n      >\n        <SelectIcon className=\"h-3 w-3 opacity-70\" />\n      </button>\n\n      {isOpen && (\n        <div\n          ref={listRef}\n          className=\"absolute top-full left-0 mt-1 w-full z-50 max-h-[200px] overflow-y-auto rounded-md border border-[#ccc] bg-white shadow-md\"\n        >\n          {options.map(time => (\n            <button\n              key={time}\n              type=\"button\"\n              data-active={time === value || undefined}\n              className={cn(\n                'w-full h-[46px] px-4 text-left text-[14px] hover:bg-igz-accent-hover cursor-pointer',\n                time === value && 'bg-igz-accent-hover font-medium'\n              )}\n              onMouseDown={e => {\n                e.preventDefault()\n                handleOptionSelect(time)\n              }}\n            >\n              {time}\n            </button>\n          ))}\n        </div>\n      )}\n    </div>\n  )\n}\n"],"names":["PLACEHOLDER_CHAR","use12h","is12HourFormat","timeMask12h","value","firstChar","timeMask24h","timeMask","timePlaceholder","getTimePlaceholder","TimePickerInput","onChange","className","maskedValue","setMaskedValue","useState","isOpen","setIsOpen","wrapperRef","useRef","listRef","options","useMemo","buildHalfHourOptions","useEffect","handleClick","e","activeEl","handleMaskedChange","useCallback","masked","isMaskComplete","normalized","parseTimeInput","handleBlur","handleOptionSelect","option","jsxs","cn","jsx","MaskedInput","prev","SelectIcon","time"],"mappings":"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"}