Refactor FileUpload, abstract out some logic

refactor
Sven Slootweg 5 years ago
parent 27dc997d70
commit 25d51ef4eb

@ -16,6 +16,7 @@ const generateJdenticon = require("../lib/generate-jdenticon");
const generateThumbnailUrl = require("../lib/generate-thumbnail-url"); const generateThumbnailUrl = require("../lib/generate-thumbnail-url");
const groupEvents = require("../lib/group-events"); const groupEvents = require("../lib/group-events");
const parseMXC = require("../lib/parse-mxc"); const parseMXC = require("../lib/parse-mxc");
const withElement = require("../lib/with-element");
let eventFunctions = { let eventFunctions = {
plaintext: function() { plaintext: function() {
@ -163,13 +164,9 @@ let chat = create({
}); });
function EventGroup({ events, room, client, onReplyClick }) { function EventGroup({ events, room, client, onReplyClick }) {
let [ avatarRef, setAvatarRef ] = React.useState(); let setAvatarRef = withElement((element) => {
generateJdenticon(user.userId).update(element);
React.useEffect(() => { });
if (avatarRef != null) {
generateJdenticon(user.userId).update(avatarRef);
}
}, [ avatarRef ]);
let user = client.getUser(events[0].sender); let user = client.getUser(events[0].sender);

@ -1,45 +1,44 @@
'use strict'; 'use strict';
const React = require('react');
const create = require('create-react-class');
let fileUpload = create({ const Promise = require("bluebird");
displayName: "FileUpload", const React = require('react');
setFileRef: function(e) { const withElement = require("../lib/with-element");
if (e != null) { const fileToDataUrl = require("../lib/file-to-data-url");
e.addEventListener('change', this.startUpload);
this.setState({
fileRef: e
});
}
},
startUpload: function(e) { module.exports = function FileUpload({ addUpload }) {
Array.from(e.target.files).forEach((file) => { function handleChange(event) {
return Promise.map(Array.from(event.target.files), (file) => {
if (file.type.startsWith("image/")) { if (file.type.startsWith("image/")) {
let reader = new FileReader(); return Promise.try(() => {
reader.onloadend = () => { return fileToDataUrl(file);
let fileObject = { }).then((url) => {
return addUpload({
file: file, file: file,
preview: reader.result preview: url
}; });
this.props.addUpload(fileObject); });
};
reader.readAsDataURL(file);
} else { } 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);
});
};

@ -17,6 +17,9 @@ limitations under the License.
const Promise = require('bluebird'); const Promise = require('bluebird');
const sanitize = require('sanitize-html'); const sanitize = require('sanitize-html');
const fileToDataUrl = require("./file-to-data-url");
const COLOR_REGEX = /^#[0-9a-fA-F]{6}$/; const COLOR_REGEX = /^#[0-9a-fA-F]{6}$/;
/** /**
@ -57,22 +60,6 @@ function awaitImageLoad(image) {
}); });
} }
function awaitFileReader(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);
});
}
function awaitVideoLoad(video) { function awaitVideoLoad(video) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
video.onloadeddata = function() { video.onloadeddata = function() {
@ -150,6 +137,8 @@ module.exports = {
return awaitImageLoad(img); return awaitImageLoad(img);
}).then(() => { }).then(() => {
URL.revokeObjectURL(objectUrl); URL.revokeObjectURL(objectUrl);
return img;
}); });
}); });
}, },
@ -162,7 +151,7 @@ module.exports = {
*/ */
loadVideoElement: function(videoFile) { loadVideoElement: function(videoFile) {
return Promise.try(() => { return Promise.try(() => {
return awaitFileReader(videoFile); return fileToDataUrl(videoFile);
}).then((url) => { }).then((url) => {
const video = Object.assign(document.createElement("video"), { const video = Object.assign(document.createElement("video"), {
src: url src: url

@ -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…
Cancel
Save