class FileDragManager { overlay; dragCounter; updateFilename; constructor(cb = null) { this.dragCounter = 0; this.setCallback(cb); // Prevent default behavior for drag events ['dragenter', 'dragover', 'dragleave', 'drop'].forEach((eventName) => { document.body.addEventListener(eventName, preventDefaults, false); }); function preventDefaults(e) { e.preventDefault(); e.stopPropagation(); } this.dragenterListener = this.dragenterListener.bind(this); this.dragleaveListener = this.dragleaveListener.bind(this); this.dropListener = this.dropListener.bind(this); document.body.addEventListener('dragenter', this.dragenterListener); document.body.addEventListener('dragleave', this.dragleaveListener); // Add drop event listener document.body.addEventListener('drop', this.dropListener); } setActions({updateFilename}) { this.updateFilename = updateFilename; } setCallback(cb) { if (cb) { this.callback = cb; } else { this.callback = (files) => console.warn('FileDragManager not set'); } } dragenterListener() { this.dragCounter++; if (!this.overlay) { // Create and show the overlay this.overlay = document.createElement('div'); this.overlay.style.position = 'fixed'; this.overlay.style.top = 0; this.overlay.style.left = 0; this.overlay.style.width = '100%'; this.overlay.style.height = '100%'; this.overlay.style.background = 'rgba(0, 0, 0, 0.5)'; this.overlay.style.color = '#fff'; this.overlay.style.zIndex = '1000'; this.overlay.style.display = 'flex'; this.overlay.style.alignItems = 'center'; this.overlay.style.justifyContent = 'center'; this.overlay.style.pointerEvents = 'none'; this.overlay.innerHTML = '
Drop files anywhere to upload
'; document.getElementById('content-wrap').appendChild(this.overlay); } } dragleaveListener() { this.dragCounter--; if (this.dragCounter === 0) { // Hide and remove the overlay if (this.overlay) { this.overlay.remove(); this.overlay = null; } } } dropListener(e) { const dt = e.dataTransfer; const files = dt.files; this.callback(files) .catch((err) => { console.error(err); //maybe }) .finally(() => { // Hide and remove the overlay if (this.overlay) { this.overlay.remove(); this.overlay = null; } this.updateFilename(files ? files[0].name : ''); }); } async addImageFile(file, nextSiblingElement) { const div = document.createElement('div'); div.classList.add('page-container'); var img = document.createElement('img'); img.classList.add('page-image'); img.src = URL.createObjectURL(file); div.appendChild(img); this.pdfAdapters.forEach((adapter) => { adapter.adapt?.(div); }); if (nextSiblingElement) { this.pagesContainer.insertBefore(div, nextSiblingElement); } else { this.pagesContainer.appendChild(div); } } } export default FileDragManager;