diff --git a/client/src/components/ContactsMultiSelect.js b/client/src/components/ContactsMultiSelect.js index 5c8171294..75755ab9a 100644 --- a/client/src/components/ContactsMultiSelect.js +++ b/client/src/components/ContactsMultiSelect.js @@ -1,58 +1,57 @@ -import React, { useMemo, useCallback, useState } from 'react'; +import React, { useCallback, useState } from 'react'; import { MenuItem, Button } from '@blueprintjs/core'; -import { omit } from 'lodash'; +import intl from 'react-intl-universal'; import MultiSelect from 'components/MultiSelect'; import { FormattedMessage as T } from 'components'; -import intl from 'react-intl-universal'; +import { safeInvoke } from 'utils'; +/** + * Contacts multi-select component. + */ export default function ContactsMultiSelect({ contacts, defaultText = , buttonProps, - onCustomerSelected: onContactSelected, - ...selectProps + onContactSelect, + contactsSelected = [], + ...multiSelectProps }) { - const [selectedContacts, setSelectedContacts] = useState({}); + const [localSelected, setLocalSelected] = useState([ ...contactsSelected]); - const isContactSelect = useCallback( - (id) => typeof selectedContacts[id] !== 'undefined', - [selectedContacts], + // Detarmines the given id is selected. + const isItemSelected = useCallback( + (id) => localSelected.some(s => s === id), + [localSelected], ); + // Contact item renderer. const contactRenderer = useCallback( (contact, { handleClick }) => ( ), - [isContactSelect], + [isItemSelected], ); - const countSelected = useMemo( - () => Object.values(selectedContacts).length, - [selectedContacts], - ); + // Count selected items. + const countSelected = localSelected.length; - const onContactSelect = useCallback( + // Handle item selected. + const handleItemSelect = useCallback( ({ id }) => { - const selected = { - ...(isContactSelect(id) - ? { - ...omit(selectedContacts, [id]), - } - : { - ...selectedContacts, - [id]: true, - }), - }; - setSelectedContacts({ ...selected }); - onContactSelected && onContactSelected(selected); + const selected = isItemSelected(id) + ? localSelected.filter(s => s !== id) + : [...localSelected, id]; + + setLocalSelected([ ...selected ]); + safeInvoke(onContactSelect, selected); }, - [setSelectedContacts, selectedContacts, isContactSelect, onContactSelected], + [setLocalSelected, localSelected, isItemSelected, onContactSelect], ); return ( @@ -62,7 +61,8 @@ export default function ContactsMultiSelect({ itemRenderer={contactRenderer} popoverProps={{ minimal: true }} filterable={true} - onItemSelect={onContactSelect} + onItemSelect={handleItemSelect} + {...multiSelectProps} >