Refactor FileUpload, abstract out some logic
parent
27dc997d70
commit
25d51ef4eb
@ -1,45 +1,44 @@
|
||||
'use strict';
|
||||
const React = require('react');
|
||||
const create = require('create-react-class');
|
||||
|
||||
let fileUpload = create({
|
||||
displayName: "FileUpload",
|
||||
const Promise = require("bluebird");
|
||||
const React = require('react');
|
||||
|
||||
setFileRef: function(e) {
|
||||
if (e != null) {
|
||||
e.addEventListener('change', this.startUpload);
|
||||
this.setState({
|
||||
fileRef: e
|
||||
});
|
||||
}
|
||||
},
|
||||
const withElement = require("../lib/with-element");
|
||||
const fileToDataUrl = require("../lib/file-to-data-url");
|
||||
|
||||
startUpload: function(e) {
|
||||
Array.from(e.target.files).forEach((file) => {
|
||||
module.exports = function FileUpload({ addUpload }) {
|
||||
function handleChange(event) {
|
||||
return Promise.map(Array.from(event.target.files), (file) => {
|
||||
if (file.type.startsWith("image/")) {
|
||||
let reader = new FileReader();
|
||||
reader.onloadend = () => {
|
||||
let fileObject = {
|
||||
return Promise.try(() => {
|
||||
return fileToDataUrl(file);
|
||||
}).then((url) => {
|
||||
return addUpload({
|
||||
file: file,
|
||||
preview: reader.result
|
||||
};
|
||||
this.props.addUpload(fileObject);
|
||||
};
|
||||
reader.readAsDataURL(file);
|
||||
preview: url
|
||||
});
|
||||
});
|
||||
} else {
|
||||
this.props.addUpload({file: file, preview: "/icons/file.svg"});
|
||||
return addUpload({
|
||||
file: file,
|
||||
preview: "/icons/file.svg"
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
render: function() {
|
||||
return (
|
||||
<div className="fileUpload">
|
||||
<input type="file" id="fileUpload" multiple ref={this.setFileRef} />
|
||||
<label htmlFor="fileUpload"><img src="/icons/file.svg"/></label>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = fileUpload;
|
||||
let setFileRef = withElement((element) => {
|
||||
element.addEventListener("change", handleChange);
|
||||
|
||||
return function() {
|
||||
element.removeEventListener("change", handleChange);
|
||||
};
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="fileUpload">
|
||||
<input type="file" id="fileUpload" multiple ref={setFileRef} />
|
||||
<label htmlFor="fileUpload"><img src="/icons/file.svg"/></label>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
|
||||
const Promise = require("bluebird");
|
||||
|
||||
module.exports = function readFileAsDataUrl(dataUrl) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
|
||||
reader.onload = function(event) {
|
||||
resolve(event.target.result);
|
||||
};
|
||||
|
||||
reader.onerror = function(error) {
|
||||
reject(error);
|
||||
};
|
||||
|
||||
reader.readAsDataURL(dataUrl);
|
||||
});
|
||||
};
|
@ -0,0 +1,15 @@
|
||||
"use strict";
|
||||
|
||||
const React = require("react");
|
||||
|
||||
module.exports = function withElement(callback) {
|
||||
let [ elementRef, setElementRef ] = React.useState();
|
||||
|
||||
React.useEffect(() => {
|
||||
if (elementRef != null) {
|
||||
callback(elementRef);
|
||||
}
|
||||
}, [ elementRef ]);
|
||||
|
||||
return setElementRef;
|
||||
};
|
Loading…
Reference in New Issue