import React, { useMemo } from 'react' import withDefaults from '../utils/with-defaults' import useTheme from '../use-theme' import { useAutoCompleteContext } from './auto-complete-context' import { NormalSizes } from '../utils/prop-types' import Ellipsis from '../shared/ellipsis' interface Props { value: string isLabelOnly?: boolean } const defaultProps = {} export type AutoCompleteItemProps = Props & typeof defaultProps & React.HTMLAttributes const getSizes = (size: NormalSizes) => { const fontSizes: { [key in NormalSizes]: string } = { mini: '.7rem', small: '.75rem', medium: '.875rem', large: '1rem' } return fontSizes[size] } const AutoCompleteItem: React.FC> = ({ value: identValue, children, isLabelOnly }) => { const theme = useTheme() const { value, updateValue, size, updateVisible } = useAutoCompleteContext() const selectHandler = () => { updateValue && updateValue(identValue) updateVisible && updateVisible(false) } const isActive = useMemo(() => value === identValue, [identValue, value]) const fontSize = useMemo(() => getSizes(size), [size]) // The 'isLabelOnly' is only used inside the component, // Automatically adjust width when only label children is included. const itemHeight = useMemo(() => { if (isLabelOnly) return `calc(1.688 * ${theme.layout.gap})` return 'auto' }, [isLabelOnly, theme.layout.gap]) return (
{isLabelOnly ? ( {children} ) : ( children )}
) } export default withDefaults(AutoCompleteItem, defaultProps)