import React from 'react'; const DETAILS = 'DETAILS'; class PublishDropzone extends React.Component { constructor (props) { super(props); this.state = { fileError: null, dragOver : false, } this.handleDrop = this.handleDrop.bind(this); this.handleDragOver = this.handleDragOver.bind(this); this.handleDragEnd = this.handleDragEnd.bind(this); this.handleDragEnter = this.handleDragEnter.bind(this); this.handleDragLeave = this.handleDragLeave.bind(this); this.handleClick = this.handleClick.bind(this); this.handleFileInput = this.handleFileInput.bind(this); this.stageFile = this.stageFile.bind(this); this.setClaimNameFromFileName = this.setClaimNameFromFileName.bind(this); } validateFile (file) { if (!file) { console.log('no file found'); throw new Error('no file provided'); } if (/'/.test(file.name)) { console.log('file name had apostrophe in it'); throw new Error('apostrophes are not allowed in the file name'); } // validate size and type switch (file.type) { case 'image/jpeg': case 'image/jpg': case 'image/png': if (file.size > 10000000) { console.log('file was too big'); throw new Error('Sorry, images are limited to 10 megabytes.'); } break; case 'image/gif': if (file.size > 50000000) { console.log('file was too big'); throw new Error('Sorry, .gifs are limited to 50 megabytes.'); } break; case 'video/mp4': if (file.size > 50000000) { console.log('file was too big'); throw new Error('Sorry, videos are limited to 50 megabytes.'); } break; default: console.log('file type is not supported'); throw new Error(file.type + ' is not a supported file type. Only, .jpeg, .png, .gif, and .mp4 files are currently supported.'); } } handleDrop (event) { event.preventDefault(); this.setState({dragOver: false}); // if dropped items aren't files, reject them const dt = event.dataTransfer; console.log('dt', dt); if (dt.items) { if (dt.items[0].kind == 'file') { const droppedFile = dt.items[0].getAsFile(); console.log('droppedFile', droppedFile); // When a file is selected for publish, validate that file and try { this.validateFile(droppedFile); // validate the file's name, type, and size } catch (error) { return this.setState({fileError: error.message}); } // stage it so it will be ready when the publish button is clicked this.setClaimNameFromFileName(droppedFile.name); this.stageFile(droppedFile); } } } handleDragOver (event) { event.preventDefault(); } handleDragEnd (event) { var dt = event.dataTransfer; if (dt.items) { for (var i = 0; i < dt.items.length; i++) { dt.items.remove(i); } } else { event.dataTransfer.clearData(); } } handleDragEnter () { this.setState({dragOver: true}); } handleDragLeave () { this.setState({dragOver: false}); } handleClick (event) { event.preventDefault(); // trigger file input document.getElementById('file_input').click(); } handleFileInput (event) { event.preventDefault(); const fileList = event.target.files; const chosenFile = fileList[0]; if (chosenFile) { try { this.validateFile(chosenFile); // validate the file's name, type, and size } catch (error) { return this.setState({fileError: error.message}); } // stage it so it will be ready when the publish button is clicked this.setClaimNameFromFileName(chosenFile.name); this.stageFile(chosenFile); } } stageFile (selectedFile) { console.log('stageFileAndShowDetails', selectedFile); // store the selected file for upload this.props.updateUploaderState('file', selectedFile); // show the publish form this.props.updateUploaderState('showComponent', DETAILS); } setClaimNameFromFileName (fileName) { console.log('setClaimNameFromFileName', fileName); const fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.')); const cleanClaimName = this.props.cleanseInput(fileNameWithoutEnding); this.props.updateUploaderState('claim', cleanClaimName); } render () { return (
{ this.state.dragOver ? (

Drop it.

) : (

{this.state.fileError}

Drag & drop image or video here to publish

OR

CHOOSE FILE

)}
); } }; module.exports = PublishDropzone;