import React, { useState, useEffect } from 'react'; import { FolderPlus, FilePenLine, Trash2, X, AlertTriangle } from 'lucide-react'; // --- Create Folder Modal --- interface CreateFolderModalProps { isOpen: boolean; onClose: () => void; onConfirm: (name: string) => void; } export const CreateFolderModal: React.FC = ({ isOpen, onClose, onConfirm }) => { const [folderName, setFolderName] = useState(''); const [error, setError] = useState(''); useEffect(() => { if (isOpen) { setFolderName(''); setError(''); // Auto focus hack setTimeout(() => document.getElementById('new-folder-input')?.focus(), 50); const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); } }, [isOpen, onClose]); const handleConfirm = () => { if (!folderName.trim()) { setError('폴더 이름을 입력해주세요.'); return; } onConfirm(folderName); }; if (!isOpen) return null; return (

디렉토리 생성

{ setFolderName(e.target.value); setError(''); }} onKeyDown={(e) => e.key === 'Enter' && handleConfirm()} className={`w-full bg-white border rounded px-3 py-2 text-sm text-slate-800 focus:outline-none ${error ? 'border-red-500 focus:border-red-500' : 'border-slate-300 focus:border-blue-500'}`} /> {error &&

{error}

}
); }; // --- Rename Modal --- interface RenameModalProps { isOpen: boolean; currentName: string; onClose: () => void; onConfirm: (newName: string) => void; } export const RenameModal: React.FC = ({ isOpen, currentName, onClose, onConfirm }) => { const [newName, setNewName] = useState(''); const [error, setError] = useState(''); useEffect(() => { if (isOpen) { setNewName(currentName); setError(''); setTimeout(() => document.getElementById('rename-input')?.focus(), 50); const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); } }, [isOpen, currentName, onClose]); const handleConfirm = () => { if (!newName.trim()) { setError('새 이름을 입력해주세요.'); return; } if (newName.trim() === currentName) { setError('변경된 내용이 없습니다.'); return; } onConfirm(newName); }; if (!isOpen) return null; return (

이름 변경/이동

{currentName}
{ setNewName(e.target.value); setError(''); }} onKeyDown={(e) => e.key === 'Enter' && handleConfirm()} className={`w-full bg-white border rounded px-3 py-2 text-sm text-slate-800 focus:outline-none ${error ? 'border-red-500 focus:border-red-500' : 'border-slate-300 focus:border-blue-500'}`} /> {error &&

{error}

}
); }; // --- Delete Modal --- interface DeleteModalProps { isOpen: boolean; fileCount: number; fileNames: string[]; onClose: () => void; onConfirm: () => void; } export const DeleteModal: React.FC = ({ isOpen, fileCount, fileNames, onClose, onConfirm }) => { useEffect(() => { if (isOpen) { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); } }, [isOpen, onClose]); if (!isOpen) return null; return (

파일 삭제

정말로 다음 {fileCount}개 항목을 삭제하시겠습니까?

    {fileNames.map((name, i) => (
  • {name}
  • ))}

이 작업은 되돌릴 수 없습니다.

); };