import React, { useEffect, useRef, useState } from 'react'; import { ImagePlus } from 'lucide-react'; import { useAddComposerFiles } from '../../contexts/ComposerContext'; const hasFiles = (event: DragEvent) => Array.from(event.dataTransfer?.types ?? []).includes('Files'); /** * App-wide drop target: dragging image files anywhere over the window shows an * overlay and attaches them to the composer on drop. */ const DropZoneOverlay: React.FC = () => { const addFiles = useAddComposerFiles(); const [active, setActive] = useState(false); const dragDepth = useRef(0); useEffect(() => { const onDragEnter = (event: DragEvent) => { if (!hasFiles(event)) return; event.preventDefault(); dragDepth.current += 1; setActive(true); }; const onDragOver = (event: DragEvent) => { if (hasFiles(event)) event.preventDefault(); }; const onDragLeave = (event: DragEvent) => { if (!hasFiles(event)) return; dragDepth.current = Math.max(0, dragDepth.current - 1); if (dragDepth.current === 0) setActive(false); }; const onDrop = (event: DragEvent) => { if (!hasFiles(event)) return; event.preventDefault(); dragDepth.current = 0; setActive(false); if (event.dataTransfer?.files?.length) addFiles(event.dataTransfer.files); }; window.addEventListener('dragenter', onDragEnter); window.addEventListener('dragover', onDragOver); window.addEventListener('dragleave', onDragLeave); window.addEventListener('drop', onDrop); return () => { window.removeEventListener('dragenter', onDragEnter); window.removeEventListener('dragover', onDragOver); window.removeEventListener('dragleave', onDragLeave); window.removeEventListener('drop', onDrop); }; }, [addFiles]); if (!active) return null; return (
Drop images to attach