1import React, { useState, useCallback } from 'react';
2import { Flex, ErrorText } from 'indigo-react';
3import cn from 'classnames';
4import { useField } from 'react-final-form';
5import { useFieldArray } from 'react-final-form-arrays';
7import { hasErrors } from 'form/validators';
9const Chip = ({ onDelete, disabled, name }) => {
10 const { input } = useField(name, { subscription: { value: true } });
13 className={cn('r32 ph2 m1 flex-center h7', {
14 'bg-gray2': !disabled,
15 'bg-gray1 gray4': disabled,
17 <Flex.Item>{input.value}</Flex.Item>
18 <Flex.Item onClick={disabled ? onDelete : undefined} className="ml1 f6">
25const EmailChipInput = ({ className, name, label, disabled }) => {
28 meta: { error, active },
29 } = useFieldArray(name, { subscription: { error: true, active: true } });
31 const [value, setValue] = useState('');
33 const handleChange = useCallback(
35 event.preventDefault();
36 setValue(event.target.value);
41 const addToChips = useCallback(() => {
44 }, [value, fields, setValue]);
46 const handleKeyDown = useCallback(
48 if (['Enter', 'Tab', ','].includes(event.key) && value !== '') {
49 event.preventDefault();
51 } else if ('Backspace' === event.key && value === '') {
52 event.preventDefault();
54 } else if (disabled) {
55 event.preventDefault();
58 [fields, value, disabled, addToChips]
61 const handleDelete = useCallback(
68 const handleBlur = useCallback(
78 const hasError = hasErrors(error);
81 <Flex col className={className}>
83 <Flex.Item as="label" className={cn('f6 lh-tall')} htmlFor={name}>
88 className={cn('flex b1 flex-wrap', {
89 'b-green2': active && !disabled && !hasError,
90 'b-red3': active && !disabled && hasError,
92 {fields.map((name, idx) => (
97 onDelete={handleDelete(idx)}
103 className="mv1 mh2 h7 b-none flex-grow"
104 placeholder="Enter an email address"
106 onChange={handleChange}
107 onKeyDown={handleKeyDown}
112 <Flex.Item as={ErrorText} className="mv1">
120export default EmailChipInput;
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list