import React, { useCallback, useState } from 'react'; import { Upload as UploadIcon, FileText, Image as ImageIcon, Folder } from 'lucide-react'; import { useLanguage } from '../contexts/LanguageContext'; import { GROUP_ALLOWED_EXTENSIONS, IMAGE_MIME_TYPES } from '../constants/fileSupport'; interface NotebookDragDropUploadProps { onFilesSelected: (files: FileList) => void; isAdmin: boolean; globalMode?: boolean; } export const NotebookDragDropUpload: React.FC = ({ onFilesSelected, isAdmin, globalMode = false }) => { const { t } = useLanguage(); const [isDragging, setIsDragging] = useState(false); const handleDragEnter = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); if (e.dataTransfer.items && e.dataTransfer.items.length > 0) { setIsDragging(true); } }, []); const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); // マウスが実際にドラッグ領域を離れた場合のみfalseに設定 setTimeout(() => setIsDragging(false), 100); }, []); const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); e.dataTransfer.dropEffect = 'copy'; }, []); const handleDrop = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { onFilesSelected(e.dataTransfer.files); e.dataTransfer.clearData(); } }, [onFilesSelected]); const handleFileInput = (e: React.ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { onFilesSelected(e.target.files); // Reset the input so the same file can be selected again e.target.value = ''; } }; if (!isAdmin) { return null; } // モードに応じてCSSクラスを決定 const containerClass = globalMode ? `fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 transition-opacity duration-300 ${isDragging ? 'opacity-100' : 'opacity-0 pointer-events-none'}` : `border-2 border-dashed rounded-xl p-8 text-center transition-all duration-200 cursor-pointer ${isDragging ? 'border-blue-500 bg-blue-50 scale-[1.02] shadow-lg' : 'border-slate-300 bg-slate-50 hover:border-blue-400 hover:bg-blue-25' }`; const contentClass = globalMode ? "w-3/4 max-w-2xl" : ""; return (
document.getElementById('notebook-file-upload-input')?.click()} >

{t('dragDropUploadTitle')}

{t('dragDropUploadDesc')}

{t('supportedFormats')}
{GROUP_ALLOWED_EXTENSIONS.slice(0, 10).join(', ').toUpperCase()}...
`.${ext}`).join(',') + ',' + IMAGE_MIME_TYPES.join(',')} />
); };