import React from 'react'; import {IDropZoneComponentProps} from 'superdesk-api'; interface IState { hover: boolean; } interface IJQueryDragEvent extends JQueryEventObject { originalEvent: DragEvent; } export class DropZone extends React.PureComponent { elem: React.RefObject; input: React.RefObject; readonly state = {hover: false}; constructor(props) { super(props); this.elem = React.createRef(); this.input = React.createRef(); this.onDrop = this.onDrop.bind(this); this.onDragEnter = this.onDragEnter.bind(this); this.onDragLeave = this.onDragLeave.bind(this); } onDrop(event: IJQueryDragEvent) { event.stopPropagation(); if (this.props.canDrop(event.originalEvent)) { event.preventDefault(); if (this.state.hover) { this.setState({hover: false}); } this.props.onDrop(event.originalEvent); } } onDragEnter(event: IJQueryDragEvent) { event.stopPropagation(); const isAllowed = this.props.canDrop(event.originalEvent); if (isAllowed) { event.preventDefault(); } if (!this.state.hover && isAllowed) { this.setState({hover: true}); } } onDragLeave(event: IJQueryDragEvent) { event.stopPropagation(); if (this.state.hover) { this.setState({hover: false}); } } componentDidMount() { $(this.elem.current).on('drop', this.onDrop); $(this.elem.current).on('dragleave', this.onDragLeave); $(this.elem.current).on('dragover dragenter', this.onDragEnter); } componentWillUnmount() { $(this.elem.current).off('drop dragleave dragover dragenter'); } render() { const className = ( this.props.className != null ? this.props.className : 'item-association' ) + (this.state.hover ? ' dragover' : ''); return ( ); } }