rms-vue3uppy-cloudinary
Version:
A VueJs(Vue3) based uploader which upload files to cloudinary using uppy
118 lines (117 loc) • 4.49 kB
JavaScript
import { onMounted as d, onBeforeUnmount as p, openBlock as u, createElementBlock as m, normalizeClass as y, renderSlot as f, createTextVNode as g, toDisplayString as c } from "vue";
import b from "@uppy/core";
import F from "@uppy/dashboard";
import S from "@uppy/xhr-upload";
const B = {
__name: "UppyCloudinaryUploader",
props: {
uppyInstanceId: { type: String, default: "uppy" },
// Uppy Instance ID
cloudName: { type: String, required: !0 },
// Cloudinary Cloud Name
preset: { type: String, required: !0 },
// Upload Preset
tags: { type: Array, default: () => [] },
// File Tags
btnTriggerClass: { type: String, default: "uppy-trigger" },
// Button Trigger Class
buttonText: { type: String, default: "Upload Files" },
// Button Text
buttonClass: { type: String, default: "btn" },
// Custom Button Class
maxFileSizeImg: { type: Number, default: 4 * 1024 * 1024 },
// Max File Size (4MB default)
maxFileSizeVideo: { type: Number, default: 50 * 1024 * 1024 },
// Max File Size (50MB default)
maxNumberOfFiles: { type: Number, default: 20 },
// Max number of files
minNumberOfFiles: { type: Number, default: 1 },
// Min number of files
allowedFileTypes: { type: Array, default: () => ["image/png", "image/jpeg", "video/*"] },
// Allowed File Types
closeModalOnClickOutside: { type: Boolean, default: !0 },
// Close Modal on Click Outside
closeAfterFinish: { type: Boolean, default: !0 },
// Close Modal After Upload
note: { type: String, default: "" },
// Note to Users
autoProceed: { type: Boolean, default: !1 },
// Auto Upload or Not
theme: { type: String, default: "light" },
// Dashboard Theme
debug: { type: Boolean, default: !1 },
// Debug Mode
inline: { type: Boolean, default: !1 },
// Inline Mode
showProgressDetails: { type: Boolean, default: !1 },
// Show Progress Details
proudlyDisplayPoweredByUppy: { type: Boolean, default: !1 },
// Show Powered By Uppy
allowedMetaFieldsArr: { type: Array, default: () => ["file", "name", "upload_preset", "tags"] }
// Allowed File Types
},
emits: ["uploaded"],
setup(o, { emit: i }) {
const e = o, r = i;
let l = null;
return d(() => {
l = new b({
id: e.uppyInstanceId,
autoProceed: e.autoProceed,
debug: e.debug,
meta: {
upload_preset: e.preset,
tags: e.tags
},
onBeforeFileAdded: (t, n) => {
const a = e.maxFileSizeImg, s = e.maxFileSizeVideo;
return t.type.startsWith("image/") && t.size > a ? (l.info(`Image "${t.name}" is too large (max ${a / (1024 * 1024)}MB)`, "error", 5e3), !1) : t.type.startsWith("video/") && t.size > s ? (l.info(`Video "${t.name}" is too large (max ${s / (1024 * 1024)}MB)`, "error", 5e3), !1) : !0;
},
restrictions: {
maxFileSize: e.maxFileSizeVideo,
// Set to max video size for overall(global) file size restriction
maxNumberOfFiles: e.maxNumberOfFiles,
minNumberOfFiles: e.minNumberOfFiles,
allowedFileTypes: e.allowedFileTypes
}
}), l.use(F, {
inline: e.inline,
trigger: `.${e.btnTriggerClass}`,
showProgressDetails: e.showProgressDetails,
proudlyDisplayPoweredByUppy: e.proudlyDisplayPoweredByUppy,
closeModalOnClickOutside: e.closeModalOnClickOutside,
closeAfterFinish: e.closeAfterFinish,
note: e.note,
theme: e.theme
}), l.use(S, {
endpoint: `https://api.cloudinary.com/v1_1/${e.cloudName}/auto/upload`,
fieldName: "file",
formData: !0,
allowedMetaFields: ["upload_preset", "tags"]
}), l.on("file-added", (t) => {
console.log("FILE ADDED ON DASHBOARD", t), l.setFileMeta(t.id, {
file: t.data,
upload_preset: e.preset,
tags: e.tags
});
}), l.on("complete", (t) => {
console.log("Upload Complete: ", t.successful), r("uploaded", t);
});
}), p(() => {
l.value && (console.log("Destroying Uppy Instance"), l.close(), l = null);
}), (t, n) => (u(), m("button", {
class: y(`${o.btnTriggerClass} ${o.buttonClass}`)
}, [
f(t.$slots, "btn-icon"),
g(" " + c(o.buttonText), 1)
], 2));
}
}, N = {
install(o) {
o.component("UppyCloudinaryUploader", B);
}
};
export {
B as UppyCloudinaryUploader,
N as default
};