quill
Version:
Your powerful, rich text editor
69 lines • 2.25 kB
JavaScript
import Delta from 'quill-delta';
import Emitter from '../core/emitter.js';
import Module from '../core/module.js';
class Uploader extends Module {
constructor(quill, options) {
super(quill, options);
quill.root.addEventListener('drop', e => {
e.preventDefault();
let native = null;
if (document.caretRangeFromPoint) {
native = document.caretRangeFromPoint(e.clientX, e.clientY);
// @ts-expect-error
} else if (document.caretPositionFromPoint) {
// @ts-expect-error
const position = document.caretPositionFromPoint(e.clientX, e.clientY);
native = document.createRange();
native.setStart(position.offsetNode, position.offset);
native.setEnd(position.offsetNode, position.offset);
}
const normalized = native && quill.selection.normalizeNative(native);
if (normalized) {
const range = quill.selection.normalizedToRange(normalized);
if (e.dataTransfer?.files) {
this.upload(range, e.dataTransfer.files);
}
}
});
}
upload(range, files) {
const uploads = [];
Array.from(files).forEach(file => {
if (file && this.options.mimetypes?.includes(file.type)) {
uploads.push(file);
}
});
if (uploads.length > 0) {
// @ts-expect-error Fix me later
this.options.handler.call(this, range, uploads);
}
}
}
Uploader.DEFAULTS = {
mimetypes: ['image/png', 'image/jpeg'],
handler(range, files) {
if (!this.quill.scroll.query('image')) {
return;
}
const promises = files.map(file => {
return new Promise(resolve => {
const reader = new FileReader();
reader.onload = () => {
resolve(reader.result);
};
reader.readAsDataURL(file);
});
});
Promise.all(promises).then(images => {
const update = images.reduce((delta, image) => {
return delta.insert({
image
});
}, new Delta().retain(range.index).delete(range.length));
this.quill.updateContents(update, Emitter.sources.USER);
this.quill.setSelection(range.index + images.length, Emitter.sources.SILENT);
});
}
};
export default Uploader;
//# sourceMappingURL=uploader.js.map