1import React, { useState, useCallback } from 'react';
2import { isEqual } from 'lodash';
3import { Flex, ErrorText } from 'indigo-react';
4import cn from 'classnames';
5import { useField } from 'react-final-form';
7import { hasErrors } from 'form/validators';
9const Chip = ({ value, onDelete, disabled }) => {
12 className={cn('r32 ph2 m1 flex-center h7', {
13 'bg-gray2': !disabled,
14 'bg-gray1 gray4': disabled,
16 <Flex.Item>{value}</Flex.Item>
17 <Flex.Item onClick={disabled ? onDelete : undefined} className="ml1 f6">
24const EmailChipInput = ({ className, name, label, disabled }) => {
25 const [chips, _setChips] = useState([]);
27 const [value, setValue] = useState('');
29 const handleChange = useCallback(
31 setValue(event.target.value);
38 meta: { active, error },
48 const setChips = useCallback(
52 input.onChange(chips);
57 const addToChips = useCallback(() => {
58 setChips([...chips, value]);
60 }, [chips, value, setChips]);
62 const handleKeyDown = useCallback(
64 if (['Enter', 'Tab', ','].includes(event.key) && value !== '') {
65 event.preventDefault();
67 } else if ('Backspace' === event.key && value === '') {
68 event.preventDefault();
69 setChips(chips.slice(0, -1));
70 } else if (disabled) {
71 event.preventDefault();
74 [setChips, chips, value, addToChips, disabled]
77 const handleDelete = useCallback(
79 setChips([...chips.slice(0, idx), ...chips.slice(idx + 1)]);
84 const handleBlur = useCallback(
91 [addToChips, value, input]
94 const hasError = hasErrors(error);
97 <Flex col className={className}>
99 <Flex.Item as="label" className={cn('f6 lh-tall')} htmlFor={name}>
104 className={cn('flex b1 flex-wrap', {
105 'b-green2': active && !disabled && !hasError,
106 'b-red3': active && !disabled && hasError,
108 {chips.map((chip, idx) => (
113 onDelete={handleDelete(idx)}
119 className="mv1 mh2 h7 b-none flex-grow"
120 placeholder="Enter an email address"
123 onChange={handleChange}
124 onKeyDown={handleKeyDown}
129 <Flex.Item as={ErrorText} className="mv1">
137export 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