import React, { useState, useCallback } from 'react'; import { Flex, ErrorText } from 'indigo-react'; import cn from 'classnames'; import { useField } from 'react-final-form'; import { useFieldArray } from 'react-final-form-arrays'; import { hasErrors } from 'form/validators'; const Chip = ({ onDelete, disabled, name }) => { const { input } = useField(name, { subscription: { value: true } }); return ( {input.value} ✗ ); }; const EmailChipInput = ({ className, name, label, disabled }) => { const { fields, meta: { error, active }, } = useFieldArray(name, { subscription: { error: true, active: true } }); const [value, setValue] = useState(''); const handleChange = useCallback( event => { event.preventDefault(); setValue(event.target.value); }, [setValue] ); const addToChips = useCallback(() => { fields.concat(value.split(/[\n\t, ]+/)); setValue(''); }, [value, fields, setValue]); const handleKeyDown = useCallback( event => { if (['Enter', 'Tab', ',', ' '].includes(event.key) && value !== '') { event.preventDefault(); addToChips(); } else if ('Backspace' === event.key && value === '') { event.preventDefault(); fields.pop(); } else if (disabled) { event.preventDefault(); } }, [fields, value, disabled, addToChips] ); const handleDelete = useCallback( idx => () => { fields.remove(idx); }, [fields] ); const handleBlur = useCallback( e => { e.preventDefault(); if (value !== '') { addToChips(); } }, [addToChips, value] ); const hasError = hasErrors(error); return ( {label && ( {label} )} {fields.map((name, idx) => ( ))} {error && ( {JSON.stringify(error)} )} ); }; export default EmailChipInput;