Skip to content

Instantly share code, notes, and snippets.

@miguelmota
Last active May 12, 2021 10:45
Show Gist options
  • Save miguelmota/a1b6a626eeefd6c101dcb27a1091d45c to your computer and use it in GitHub Desktop.
Save miguelmota/a1b6a626eeefd6c101dcb27a1091d45c to your computer and use it in GitHub Desktop.
React drag and drop full screen
import React, { Component } from 'react'
import DragAndDrop from './DragAndDrop'
class App extends Component {
handleDrop(files) {
console.log(files)
}
render() {
return (
<DragAndDrop
handleDrop={files => this.handleDrop(files)}>
</DragAndDrop>
)
}
}
import React, { Component } from 'react'
class DragAndDrop extends Component {
constructor(props) {
super(props)
this.state = {
drag: false
}
this.dragCounter = 0
}
handleDrag(event) {
event.preventDefault()
event.stopPropagation()
}
handleDragIn(event) {
event.preventDefault()
event.stopPropagation()
this.dragCounter++
if (event.dataTransfer.items &&
event.dataTransfer.items.length > 0) {
this.setState({drag: true})
}
}
handleDragOut(event) {
event.preventDefault()
event.stopPropagation()
this.dragCounter--
if (this.dragCounter === 0) {
this.setState({drag: false})
}
}
handleDrop(event) {
event.preventDefault()
event.stopPropagation()
this.setState({drag: false})
if (event.dataTransfer.files &&
event.dataTransfer.files.length > 0) {
this.props.handleDrop(event.dataTransfer.files)
event.dataTransfer.clearData()
this.dragCounter = 0
}
}
componentDidMount() {
let el = document.body
el.addEventListener('dragenter', event => this.handleDragIn(event))
el.addEventListener('dragleave', event => this.handleDragOut(event))
el.addEventListener('dragover', event => this.handleDrag(event))
el.addEventListener('drop', event => this.handleDrop(event))
}
componentWillUnmount() {
let el = document.body
el.removeEventListener('dragenter', event => this.handleDragIn(event))
el.removeEventListener('dragleave', event => this.handleDragOut(event))
el.removeEventListener('dragover', event => this.handleDrag(event))
el.removeEventListener('drop', event => this.handleDrop(event))
}
render() {
return (
<div
style={{
position: 'fixed',
top: 0,
left: 0,
width: '100%',
height: '100%',
display: 'flex',
pointerEvents: 'none',
justifyContent: 'center',
alignItems: 'center',
border: '5px solid red',
}}
>
{this.state.drag &&
<div
style={{
position: 'fixed',
top: 0,
left: 0,
width: '100%',
height: '100%',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
fontSize: '5em',
color: '#000',
border: '5px solid green',
}}
>
Drop here
</div>
}
{this.props.children}
</div>
)
}
}
export default DragAndDrop
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment