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 : ""); }); }; } export default FileDragManager;