{"version":3,"file":"useSelect.mjs","sources":["../../../packages/select/useSelect.ts"],"sourcesContent":["import {\n  useCallback,\n  useMemo,\n  useState,\n  Children,\n  cloneElement,\n  useEffect,\n  MouseEvent,\n  KeyboardEvent,\n  ReactNode,\n} from 'react'\nimport { isElement } from 'react-is'\nimport { SelectProps, SelectHandleChange, OptionValue } from './types.js'\n\ntype SelectHandleClick = (event: MouseEvent<HTMLInputElement>) => void\n\ntype SelectHandleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => void\n\ntype SelectHandleClose = () => void\n\ntype UseSelect = (\n  props: Pick<\n    SelectProps,\n    | 'disabled'\n    | 'onClick'\n    | 'onChange'\n    | 'onKeyDown'\n    | 'children'\n    | 'value'\n    | 'defaultValue'\n  >,\n) => {\n  handleClick: SelectHandleClick\n  handleClose: SelectHandleClose\n  handleKeyDown: SelectHandleKeyDown\n  opened: boolean\n  title: string\n  options: ReactNode\n}\n\nexport const useSelect: UseSelect = ({\n  value,\n  defaultValue,\n  disabled,\n  onClick,\n  onChange,\n  onKeyDown,\n  children,\n}) => {\n  const [opened, setOpened] = useState(false)\n\n  const handleOpen = useCallback(() => {\n    if (disabled) return\n    setOpened(true)\n  }, [disabled])\n\n  const handleClick: SelectHandleClick = useCallback(\n    (event) => {\n      handleOpen()\n      onClick?.(event)\n    },\n    [handleOpen, onClick],\n  )\n\n  const handleClose = useCallback(() => {\n    setOpened(false)\n  }, [])\n\n  const handleChange: SelectHandleChange = useCallback(\n    (value) => {\n      handleClose()\n      setLocalValue(value)\n      onChange?.(value)\n    },\n    [handleClose, onChange],\n  )\n\n  const handleKeyDown: SelectHandleKeyDown = useCallback(\n    (event) => {\n      if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n        event.preventDefault()\n        handleOpen()\n      }\n      onKeyDown?.(event)\n    },\n    [handleOpen, onKeyDown],\n  )\n\n  const outerValue = value ?? defaultValue ?? null\n  const [localValue, setLocalValue] = useState<OptionValue | null>(outerValue)\n\n  useEffect(() => {\n    setLocalValue(outerValue)\n  }, [outerValue])\n\n  const { values, options } = useMemo(() => {\n    const values = new Map<OptionValue, string>()\n\n    const options: ReactNode = Children.map(children, (child) => {\n      if (!isElement(child)) return child\n\n      const value = child.props.value\n      const title = String(child.props.children)\n\n      if (values.get(value) === undefined) {\n        values.set(value, title)\n      }\n\n      return cloneElement(child, {\n        active: value === localValue,\n        onChange: handleChange,\n      })\n    })\n\n    return { values, options }\n  }, [localValue, children, handleChange])\n\n  const selectedTitle = localValue != null ? values.get(localValue) : null\n  const defaultTitle = String(localValue ?? '')\n  const title = selectedTitle ?? defaultTitle\n\n  return {\n    handleClick,\n    handleClose,\n    handleKeyDown,\n    opened,\n    title,\n    options,\n  }\n}\n"],"names":["useSelect","_ref","value","defaultValue","disabled","onClick","onChange","onKeyDown","children","opened","setOpened","useState","handleOpen","useCallback","handleClick","event","handleClose","handleChange","setLocalValue","handleKeyDown","includes","key","preventDefault","outerValue","localValue","useEffect","values","options","useMemo","Map","Children","map","child","isElement","props","title","String","get","undefined","set","cloneElement","active","selectedTitle","defaultTitle"],"mappings":"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"}