import pick from 'lodash/pick'; import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import { Button } from 'semantic-ui-react'; import { Input, Popup } from '../../lib/custom-ui'; import { useField, useSteps } from '../../hooks'; import AddStep from './AddStep'; import EditStep from './EditStep'; import Item from './Item'; import styles from './LabelsStep.module.scss'; const StepTypes = { ADD: 'ADD', EDIT: 'EDIT', }; const LabelsStep = React.memo( ({ items, currentIds, title, canEdit, onSelect, onDeselect, onCreate, onUpdate, onDelete, onBack, }) => { const [t] = useTranslation(); const [step, openStep, handleBack] = useSteps(); const [search, handleSearchChange] = useField(''); const cleanSearch = useMemo(() => search.trim().toLowerCase(), [search]); const filteredItems = useMemo( () => items.filter( (label) => (label.name && label.name.toLowerCase().includes(cleanSearch)) || label.color.includes(cleanSearch), ), [items, cleanSearch], ); const searchField = useRef(null); const handleAddClick = useCallback(() => { openStep(StepTypes.ADD); }, [openStep]); const handleEdit = useCallback( (id) => { openStep(StepTypes.EDIT, { id, }); }, [openStep], ); const handleSelect = useCallback( (id) => { onSelect(id); }, [onSelect], ); const handleDeselect = useCallback( (id) => { onDeselect(id); }, [onDeselect], ); const handleUpdate = useCallback( (id, data) => { onUpdate(id, data); }, [onUpdate], ); const handleDelete = useCallback( (id) => { onDelete(id); }, [onDelete], ); useEffect(() => { searchField.current.focus(); }, []); if (step) { switch (step.type) { case StepTypes.ADD: return ( ); case StepTypes.EDIT: { const currentItem = items.find((item) => item.id === step.params.id); if (currentItem) { return ( handleUpdate(currentItem.id, data)} onDelete={() => handleDelete(currentItem.id)} onBack={handleBack} /> ); } openStep(null); break; } default: } } return ( <> {t(title, { context: 'title', })} {filteredItems.length > 0 && (
{filteredItems.map((item) => ( handleSelect(item.id)} onDeselect={() => handleDeselect(item.id)} onEdit={() => handleEdit(item.id)} /> ))}
)} {canEdit && (