import React, { useState, useEffect } from 'react'; import { X, Server, FolderPlus, Trash2, Save, Power, Monitor, Settings2 } from 'lucide-react'; import { SiteConfig } from '../types'; interface SiteManagerModalProps { isOpen: boolean; onClose: () => void; onConnect: (site: SiteConfig) => void; onSaveSites: (sites: SiteConfig[]) => void; initialSites: SiteConfig[]; } const SiteManagerModal: React.FC = ({ isOpen, onClose, onConnect, onSaveSites, initialSites }) => { const [sites, setSites] = useState([]); const [selectedId, setSelectedId] = useState(null); const [formData, setFormData] = useState(null); const [isDirty, setIsDirty] = useState(false); const [activeTab, setActiveTab] = useState<'general' | 'transfer'>('general'); // Initialize useEffect(() => { if (isOpen) { setSites(initialSites); if (initialSites.length > 0 && !selectedId) { selectSite(initialSites[0]); } } }, [isOpen, initialSites]); const selectSite = (site: SiteConfig) => { setSelectedId(site.id); setFormData({ ...site }); setIsDirty(false); setActiveTab('general'); }; const handleNewSite = () => { const newSite: SiteConfig = { id: `site-${Date.now()}`, name: '새 사이트', protocol: 'ftp', host: '', port: '21', user: '', pass: '', passiveMode: true }; const newSites = [...sites, newSite]; setSites(newSites); selectSite(newSite); setIsDirty(true); }; const handleDelete = () => { if (!selectedId) return; if (!window.confirm('선택한 사이트를 삭제하시겠습니까?')) return; const newSites = sites.filter(s => s.id !== selectedId); setSites(newSites); onSaveSites(newSites); // Auto save on delete if (newSites.length > 0) { selectSite(newSites[0]); } else { setSelectedId(null); setFormData(null); } }; const handleSave = () => { if (!formData) return; const newSites = sites.map(s => s.id === formData.id ? formData : s); setSites(newSites); onSaveSites(newSites); setIsDirty(false); }; const handleConnectClick = () => { if (formData) { if (isDirty) { handleSave(); } onConnect(formData); } }; const updateForm = (field: keyof SiteConfig, value: any) => { if (!formData) return; const updated = { ...formData, [field]: value }; // Auto port update based on protocol if (field === 'protocol') { if (value === 'sftp') updated.port = '22'; if (value === 'ftp') updated.port = '21'; } setFormData(updated); if (field === 'name') { setSites(sites.map(s => s.id === updated.id ? updated : s)); } setIsDirty(true); }; if (!isOpen) return null; return (
{/* Header */}

사이트 관리자 (Site Manager)

{/* Left: Site List */}
{sites.map(site => (
selectSite(site)} className={`flex items-center gap-2 px-3 py-2 rounded cursor-pointer text-sm select-none transition-colors ${ selectedId === site.id ? 'bg-blue-100 text-blue-900 border border-blue-200' : 'text-slate-600 hover:bg-slate-200' }`} > {site.name}
))} {sites.length === 0 && (
등록된 사이트가 없습니다.
)}
{/* Right: Site Details Form */}
{formData ? ( <> {/* Tabs */}
{activeTab === 'general' ? (
updateForm('name', e.target.value)} className="col-span-3 bg-white border border-slate-300 rounded px-2 py-1.5 text-sm focus:border-blue-500 focus:outline-none text-slate-800" />

updateForm('host', e.target.value)} placeholder="ftp.example.com" className="flex-1 bg-white border border-slate-300 rounded px-2 py-1.5 text-sm focus:border-blue-500 focus:outline-none text-slate-800 placeholder:text-slate-400" />
포트: updateForm('port', e.target.value)} className="w-16 bg-white border border-slate-300 rounded px-2 py-1.5 text-sm text-center focus:border-blue-500 focus:outline-none text-slate-800" />
updateForm('user', e.target.value)} className="col-span-3 bg-white border border-slate-300 rounded px-2 py-1.5 text-sm focus:border-blue-500 focus:outline-none text-slate-800" />
updateForm('pass', e.target.value)} placeholder="저장하지 않으려면 비워두세요" className="col-span-3 bg-white border border-slate-300 rounded px-2 py-1.5 text-sm focus:border-blue-500 focus:outline-none text-slate-800 placeholder:text-slate-400" />
) : (

전송 모드

제한 설정

(데모 제한)
)}
) : (

왼쪽 목록에서 사이트를 선택하거나

'새 사이트'를 클릭하세요.

)}
{/* Footer Actions */}
); }; export default SiteManagerModal;