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], ); // Filters accounts items. const filterContactsPredicater = useCallback( (query, contact, _index, exactMatch) => { const normalizedTitle = contact.display_name.toLowerCase(); const normalizedQuery = query.toLowerCase(); if (exactMatch) { return normalizedTitle === normalizedQuery; } else { return normalizedTitle.indexOf(normalizedQuery) >= 0; } }, [], ); return ( } />} itemRenderer={contactRenderer} popoverProps={{ minimal: true }} filterable={true} onItemSelect={handleItemSelect} itemPredicate={filterContactsPredicater} {...multiSelectProps} >