import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import { DragSource, DropTarget } from 'react-dnd'; class DraggableSeed extends Component { static propTypes = { // React DnD Props connectDragSource: PropTypes.func.isRequired, connectDropTarget: PropTypes.func.isRequired, isDragging: PropTypes.bool, isOver: PropTypes.bool, canDrop: PropTypes.bool, // Own Props onClick: PropTypes.func, setHoveringIndex: PropTypes.func.isRequired, index: PropTypes.number, word: PropTypes.string, className: PropTypes.string, selected: PropTypes.bool, }; static defaultProps = { className: '', onClick: undefined, }; UNSAFE_componentWillReceiveProps(nextProps) { const { isOver, setHoveringIndex } = this.props; if (isOver && !nextProps.isOver) { setHoveringIndex(-1); } } render() { const { connectDragSource, connectDropTarget, isDragging, index, word, selected, className, onClick, isOver, canDrop, } = this.props; return connectDropTarget( connectDragSource(
{word}
, ), ); } } const SEEDWORD = 'SEEDWORD'; const seedSource = { beginDrag(props) { setTimeout(() => props.setDraggingSeedIndex(props.seedIndex), 0); return { seedIndex: props.seedIndex, word: props.word, }; }, canDrag(props) { return props.draggable; }, endDrag(props, monitor) { const dropTarget = monitor.getDropResult(); if (!dropTarget) { setTimeout(() => props.setDraggingSeedIndex(-1), 0); return; } props.onDrop(dropTarget.targetIndex); }, }; const seedTarget = { drop(props) { return { targetIndex: props.index, }; }, canDrop(props) { return props.droppable; }, hover(props) { props.setHoveringIndex(props.index); }, }; const collectDrag = (connect, monitor) => { return { connectDragSource: connect.dragSource(), isDragging: monitor.isDragging(), }; }; const collectDrop = (connect, monitor) => { return { connectDropTarget: connect.dropTarget(), isOver: monitor.isOver(), canDrop: monitor.canDrop(), }; }; export default DropTarget( SEEDWORD, seedTarget, collectDrop, )(DragSource(SEEDWORD, seedSource, collectDrag)(DraggableSeed));