104 lines
3.6 KiB
JavaScript
104 lines
3.6 KiB
JavaScript
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
|
|
|
|
Diaspora.PostPhotoUploader = class {
|
|
/**
|
|
* Initializes a new instance of PostPhotoUploader
|
|
* This class handles uploading photos and provides client side scaling
|
|
*/
|
|
constructor(el, aspectIds) {
|
|
this.element = el;
|
|
this.sizeLimit = 4194304;
|
|
this.aspectIds = aspectIds;
|
|
|
|
this.onProgress = null;
|
|
this.onUploadStarted = null;
|
|
this.onUploadCompleted = null;
|
|
|
|
/**
|
|
* Shows a message using flash messages or alert for mobile.
|
|
* @param {string} type - The type of the message, e.g. "error" or "success".
|
|
* @param text - The text to display.
|
|
*/
|
|
this.showMessage = (type, text) => (app.flashMessages ? app.flashMessages[type](text) : alert(text));
|
|
|
|
/**
|
|
* Returns true if the given parameter is a function
|
|
* @param {param} - The object to check
|
|
* @returns {boolean}
|
|
*/
|
|
this.func = param => (typeof param === "function");
|
|
|
|
this.initFineUploader();
|
|
}
|
|
|
|
/**
|
|
* Initializes the fine uploader component
|
|
*/
|
|
initFineUploader() {
|
|
this.fineUploader = new qq.FineUploaderBasic({
|
|
element: this.element,
|
|
button: this.element,
|
|
text: {
|
|
fileInputTitle: Diaspora.I18n.t("photo_uploader.upload_photos")
|
|
},
|
|
request: {
|
|
endpoint: Routes.photos(),
|
|
params: {
|
|
/* eslint-disable camelcase */
|
|
authenticity_token: $("meta[name='csrf-token']").attr("content"),
|
|
photo: {
|
|
pending: true,
|
|
aspect_ids: this.aspectIds
|
|
}
|
|
/* eslint-enable camelcase */
|
|
}
|
|
},
|
|
validation: {
|
|
acceptFiles: "image/png, image/jpeg, image/gif",
|
|
allowedExtensions: ["jpg", "jpeg", "png", "gif"],
|
|
sizeLimit: (window.Promise && qq.supportedFeatures.scaling ? null : this.sizeLimit)
|
|
},
|
|
messages: {
|
|
typeError: Diaspora.I18n.t("photo_uploader.invalid_ext"),
|
|
sizeError: Diaspora.I18n.t("photo_uploader.size_error"),
|
|
emptyError: Diaspora.I18n.t("photo_uploader.empty")
|
|
},
|
|
callbacks: {
|
|
onSubmit: (id, name) => this.onPictureSelected(id, name),
|
|
onUpload: (id, name) => (this.func(this.onUploadStarted) && this.onUploadStarted(id, name)),
|
|
onProgress: (id, fileName, loaded, total) =>
|
|
(this.func(this.onProgress) && this.onProgress(id, fileName, Math.round(loaded / total * 100))),
|
|
onComplete: (id, name, json) => (this.func(this.onUploadCompleted) && this.onUploadCompleted(id, name, json)),
|
|
onError: (id, name, errorReason) => this.showMessage("error", errorReason)
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Called when a picture from user's device has been selected.
|
|
* Scales the images using Pica if the image exceeds the file size limit
|
|
* @param {number} id - The current file's id.
|
|
* @param {string} name - The current file's name.
|
|
*/
|
|
onPictureSelected(id, name) {
|
|
// scale image because it's bigger than the size limit and the browser supports it
|
|
if (this.fineUploader.getSize(id) > this.sizeLimit && window.Promise && qq.supportedFeatures.scaling) {
|
|
this.fineUploader.scaleImage(id, {
|
|
maxSize: 3072,
|
|
customResizer: !qq.ios() && (i => window.pica().resize(i.sourceCanvas, i.targetCanvas))
|
|
}).then(scaledImage => {
|
|
this.fineUploader.addFiles({
|
|
blob: scaledImage,
|
|
name: name
|
|
});
|
|
});
|
|
|
|
// since we are adding the smaller scaled image afterwards, we return false
|
|
return false;
|
|
}
|
|
|
|
// return true to upload the image without scaling
|
|
return true;
|
|
}
|
|
};
|
|
// @license-end
|