/* eslint-disable jsx-a11y/label-has-for */ /* eslint-disable jsx-a11y/label-has-associated-control */ import classNames from 'classnames' import { useSelect } from 'downshift' import Icon from './icon' type SelectProps = { items: T[] itemToString: (item: T | null) => string label?: string defaultText?: string itemToSubtitle?: (item: T | null) => string itemToKey: (item: T) => string onSelectedItemChanged?: (item: T | null | undefined) => void disabled?: boolean optionalLabel?: boolean loading?: boolean } export const Select = ({ items, itemToString = item => (item === null ? '' : String(item)), label, defaultText = 'Items', itemToSubtitle, itemToKey, onSelectedItemChanged, disabled = false, optionalLabel = false, loading = false, }: SelectProps) => { const { isOpen, selectedItem, getToggleButtonProps, getLabelProps, getMenuProps, getItemProps, highlightedIndex, } = useSelect({ items: items ?? [], itemToString, onSelectedItemChange: changes => { if (onSelectedItemChanged) { onSelectedItemChanged(changes.selectedItem) } }, }) return (
{label ? ( ) : null}
{selectedItem ? itemToString(selectedItem) : defaultText}
{isOpen ? ( ) : ( )}
    {isOpen && items?.map((item, index) => (
  • {itemToString(item)} {itemToSubtitle ? ( {itemToSubtitle(item)} ) : null}
  • ))}
) }