aico-image-editor
Version:
Combine multiple image into and create single combined image
137 lines (117 loc) • 4.71 kB
JavaScript
//import Alpine from "alpinejs";
Alpine.data('dragdrop', () => ({
dropping: false,
filesUploaded: false,
dragOverHandler(event) {
event.preventDefault();
this.dropping = true;
},
dragLeaveHandler() {
this.dropping = false
},
sizeValidated: true,
extensionsValidated: true,
extensions: [],
alertFileValidationFail(files,fileType, extensions, el) {
// alert only single time for any validation fail case
const sizeValidated = files.every(file => this.validateFileSize(file));
const extensionsValidated = files.every(file => this.validateFileExtensions(file, extensions));
this.sizeValidated = sizeValidated;
this.extensionsValidated = extensionsValidated;
this.extensions = extensions;
// if(!sizeValidated) {
// alert('File size should be less than 5MB');
// }
// if(!extensionsValidated) {
// alert('only ' + extensions + ' files are allowed');
// }
//filter out the files which follows both validation
const validatedFiles = files.filter(file => {
return this.validateFileSize(file) && this.validateFileExtensions(file, extensions)
})
if(validatedFiles.length) {
this.dispatchFileEvents(validatedFiles, fileType, el);
}
},
fileUploaded(event,fileType,extensions, el) {
//if(! event.target.files.length) return;
this.alertFileValidationFail([...event.target.files], fileType, extensions, el)
this.filesUploaded = true;
},
bytesToMegaBytes(bytes) {
return (bytes / (1024*1024)).toFixed(2);
},
maxAllowedFileSize: 15,
validateFileSize(file) {
let fileSizeInMb = this.bytesToMegaBytes(file.size);
return !(fileSizeInMb > this.maxAllowedFileSize)
},
validateFileExtensions(file,extensions) {
let fileExtension = file.name.split('.').pop();
return extensions.indexOf(fileExtension) >= 0;
},
getDataUrlFromFile(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
reader.readAsDataURL(file);
});
},
async dispatchFileEvents(files,fileType, el) {
const dataUrl = await this.getDataUrlFromFile(files[0]);
if(fileType === 'shapes' || fileType === 'backgrounds' || fileType === 'mainPictures') {
this.$store.cropperStore.prepareCropperImage({
originalImageFile: files[0],
fileName: files[0].name,
url: dataUrl,
cropperData: null,
fileType: fileType,
el: el
});
} else {
window.dispatchEvent(new CustomEvent(fileType + '-uploaded', {
detail: {
files: files
}
}));
}
// if(fileType === 'shape') {
// this.$store.shapeCropperModalStore.displaySelectedImage({
// originalShapeFile: files[0],
// fileName: files[0].name,
// url: dataUrl,
// cropperData: null
// });
// } else if(fileType === 'background') {
// this.$store.cropperStore.displaySelectedBackground({
// originalImageFile: files[0],
// fileName: files[0].name,
// url: dataUrl,
// cropperData: null
// });
// } else if (fileType === 'mainPicture') {
// this.$store.pictureCropperModalStore.displaySelectedPicture({
// originalImageFile: files[0],
// fileName: files[0].name,
// url: dataUrl,
// cropperData: null
// });
// } else {
// window.dispatchEvent(new CustomEvent(fileType + '-uploaded', {
// detail: {
// files: files
// }
// }));
// }
},
dropHandler(event,fileType,extensions, el) {
if(event.dataTransfer.items) {
const filesFromItems = [...event.dataTransfer.items].filter(item => item.kind === 'file').map(item => item.getAsFile());
this.alertFileValidationFail(filesFromItems, fileType, extensions, el);
} else {
this.alertFileValidationFail([...event.dataTransfer.files], fileType, extensions, el);
}
this.dropping = false;
}
}))