import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import { Menu } from 'semantic-ui-react'; import { Input, Popup } from '../../lib/custom-ui'; import { useField } from '../../hooks'; import Item from './Item'; import styles from './BoardMembershipsStep.module.scss'; const BoardMembershipsStep = React.memo( ({ items, currentUserIds, title, onUserSelect, onUserDeselect, onBack }) => { const [t] = useTranslation(); const [search, handleSearchChange] = useField(''); const cleanSearch = useMemo(() => search.trim().toLowerCase(), [search]); const filteredItems = useMemo( () => items.filter( ({ user }) => user.email.includes(cleanSearch) || user.name.toLowerCase().includes(cleanSearch) || (user.username && user.username.includes(cleanSearch)), ), [items, cleanSearch], ); const searchField = useRef(null); const handleUserSelect = useCallback( (id) => { onUserSelect(id); }, [onUserSelect], ); const handleUserDeselect = useCallback( (id) => { onUserDeselect(id); }, [onUserDeselect], ); useEffect(() => { searchField.current.focus({ preventScroll: true, }); }, []); return ( <> {t(title, { context: 'title', })} {filteredItems.length > 0 && ( {filteredItems.map((item) => ( handleUserSelect(item.user.id)} onUserDeselect={() => handleUserDeselect(item.user.id)} /> ))} )} ); }, ); BoardMembershipsStep.propTypes = { /* eslint-disable react/forbid-prop-types */ items: PropTypes.array.isRequired, currentUserIds: PropTypes.array.isRequired, /* eslint-enable react/forbid-prop-types */ title: PropTypes.string, onUserSelect: PropTypes.func.isRequired, onUserDeselect: PropTypes.func.isRequired, onBack: PropTypes.func, }; BoardMembershipsStep.defaultProps = { title: 'common.members', onBack: undefined, }; export default BoardMembershipsStep;