import React, { useCallback, useState } from 'react'; import { MenuItem, Button } from '@blueprintjs/core'; import intl from 'react-intl-universal'; import MultiSelect from 'components/MultiSelect'; import { FormattedMessage as T } from 'components'; import { safeInvoke } from 'utils'; /** * Contacts multi-select component. */ export default function ContactsMultiSelect({ contacts, defaultText = , buttonProps, onContactSelect, contactsSelected = [], ...multiSelectProps }) { const [localSelected, setLocalSelected] = useState([ ...contactsSelected]); // Detarmines the given id is selected. const isItemSelected = useCallback( (id) => localSelected.some(s => s === id), [localSelected], ); // Contact item renderer. const contactRenderer = useCallback( (contact, { handleClick }) => ( ), [isItemSelected], ); // Count selected items. const countSelected = localSelected.length; // Handle item selected. const handleItemSelect = useCallback( ({ id }) => { const selected = isItemSelected(id) ? localSelected.filter(s => s !== id) : [...localSelected, id]; setLocalSelected([ ...selected ]); safeInvoke(onContactSelect, selected); }, [setLocalSelected, localSelected, isItemSelected, onContactSelect], ); return ( } />} itemRenderer={contactRenderer} popoverProps={{ minimal: true }} filterable={true} onItemSelect={handleItemSelect} {...multiSelectProps} >