@bigfishtv/cockpit
Version:
66 lines (59 loc) • 2.31 kB
JavaScript
import PropTypes from 'prop-types'
import React, { Component } from 'react'
import classnames from 'classnames'
import { DropTarget } from 'react-dnd'
import * as DragTypes from '../../constants/DragTypes'
import { validateFiles } from '../../utils/fileUtils'
const fileTarget = {
drop: (props, monitor, component) => {
const files = monitor.getItem().files
const validatedFiles = validateFiles(files, props)
if (validatedFiles.length > 0) props.onReceivedFiles(validatedFiles)
},
}
/**
* Wraps children with a droppable region that gets overlaid with drag/drop messages when files are being dragged
*/
(DragTypes.NATIVE_FILE, fileTarget, (connect, monitor) => {
return {
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver(),
canDrop: monitor.canDrop(),
}
})
export default class FileDropzone extends Component {
static propTypes = {
/** Whether or not multiple files are allowed to be dropped */
multiple: PropTypes.bool,
/** Subject of file extensions e.g. documents, images. Will be checked against fileTypes redux store if no extensions are provided */
subject: PropTypes.string,
/** Either a comma-seperated string of extensions (without spaces) or an array of extensions. Neither contain dots before extensions. */
extensions: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
/** Array of tank asset objects */
files: PropTypes.arrayOf(PropTypes.object),
/** callback for when files have been dropped in zone */
onReceivedFiles: PropTypes.func,
}
static defaultProps = {
multiple: false,
subject: null,
extensions: null,
files: [],
onReceivedFiles: files => console.warn('No onReceivedFiles prop provided for FileDropzone', files),
}
render() {
const { children, canDrop, isOver, connectDropTarget, multiple, subject } = this.props
const subjectName = (subject || 'file') + (multiple ? '(s)' : '')
return connectDropTarget(
<div className={classnames('file-drop-container', { dragging: canDrop, over: isOver })}>
{canDrop && (
<div className="file-drop-overlay">
{!isOver && canDrop && <h3 className="file-drop-overlay-title">Drag {subjectName} here</h3>}
{isOver && <h3 className="file-drop-overlay-title">Drop {subjectName}!</h3>}
</div>
)}
{children}
</div>
)
}
}