import React, { useCallback, useRef } from 'react'; import ReactDOM from 'react-dom'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Draggable } from 'react-beautiful-dnd'; import { Button, Checkbox, Icon } from 'semantic-ui-react'; import { usePopup } from '../../../lib/popup'; import NameEdit from './NameEdit'; import ActionsStep from './ActionsStep'; import styles from './Item.module.scss'; const Item = React.memo( ({ id, index, name, isCompleted, isPersisted, canEdit, onUpdate, onDelete }) => { const nameEdit = useRef(null); const handleClick = useCallback(() => { if (isPersisted && canEdit) { nameEdit.current.open(); } }, [isPersisted, canEdit]); const handleNameUpdate = useCallback( (newName) => { onUpdate({ name: newName, }); }, [onUpdate], ); const handleToggleChange = useCallback(() => { onUpdate({ isCompleted: !isCompleted, }); }, [isCompleted, onUpdate]); const handleNameEdit = useCallback(() => { nameEdit.current.open(); }, []); const ActionsPopup = usePopup(ActionsStep); return ( {({ innerRef, draggableProps, dragHandleProps }, { isDragging }) => { const contentNode = ( // eslint-disable-next-line react/jsx-props-no-spreading
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */} {name} {isPersisted && canEdit && ( )}
); return isDragging ? ReactDOM.createPortal(contentNode, document.body) : contentNode; }}
); }, ); Item.propTypes = { id: PropTypes.string.isRequired, index: PropTypes.number.isRequired, name: PropTypes.string.isRequired, isCompleted: PropTypes.bool.isRequired, isPersisted: PropTypes.bool.isRequired, canEdit: PropTypes.bool.isRequired, onUpdate: PropTypes.func.isRequired, onDelete: PropTypes.func.isRequired, }; export default Item;