UNPKG

aico-image-editor

Version:

Combine multiple image into and create single combined image

137 lines (117 loc) 4.71 kB
//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; } }))