import React, { useCallback, useRef, useState } from 'react'; import cn from 'classnames'; import { useField } from 'react-final-form'; import useOnClickOutside from 'indigo-react/lib/useOnClickOutside'; import Flex from './Flex'; import { ErrorText } from './Typography'; import AccessoryIcon from './AccessoryIcon'; // NOTE: if we really care about accessibility, we should pull in a dependency export default function SelectInput({ name, label, placeholder, className, mono = false, options = [], disabled = false, warning, }) { const { input, meta: { active, error, submitting, submitSucceeded, touched, valid }, } = useField(name, { type: 'select', }); disabled = disabled || submitting || submitSucceeded; const [isOpen, setIsOpen] = useState(false); const ref = useRef(); // close select on outside clicks useOnClickOutside( ref, useCallback(() => setIsOpen(false), [setIsOpen]) ); const toggleOpen = useCallback(() => { input.onFocus(); setIsOpen(isOpen => !isOpen); }, [input]); const onChange = value => { // construct a pseudo event that sets the value correctly input.onChange({ target: { value } }); input.onBlur(); setIsOpen(false); }; const text = options.find(o => o.value === input.value).text; return ( {label} {isOpen ? placeholder : text}
{isOpen ? '▲' : '▼'}
{isOpen && ( {options.map(option => ( { e.stopPropagation(); onChange(option.value); }}> {option.text} ))} )}
{warning && ( {warning} )} {touched && !active && error && ( {error} )}
); }