import React, { useState } from 'react' import { uploadCaddyfilesMulti, CaddyFile } from '../api/import' type Props = { visible: boolean onClose: () => void onUploaded?: () => void } interface SiteEntry { filename: string; content: string; } export default function ImportSitesModal({ visible, onClose, onUploaded }: Props) { const [sites, setSites] = useState([{ filename: 'Caddyfile-1', content: '' }]) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) if (!visible) return null const setSiteContent = (index: number, value: string) => { const s = [...sites] s[index] = { ...s[index], content: value } setSites(s) } const setSiteFilename = (index: number, value: string) => { const s = [...sites] s[index] = { ...s[index], filename: value } setSites(s) } const handleFileInput = async (e: React.ChangeEvent) => { const files = e.target.files if (!files || files.length === 0) return const newSites: SiteEntry[] = [] for (let i = 0; i < files.length; i++) { try { const text = await files[i].text() newSites.push({ filename: files[i].name, content: text }) } catch { // ignore read errors for individual files newSites.push({ filename: files[i].name, content: '' }) } } if (newSites.length > 0) setSites(newSites) } const addSite = () => setSites(prev => [...prev, { filename: `Caddyfile-${prev.length + 1}`, content: '' }]) const removeSite = (index: number) => setSites(prev => prev.filter((_, i) => i !== index)) const handleSubmit = async () => { setError(null) setLoading(true) try { const cleaned: CaddyFile[] = sites.map((s, i) => ({ filename: s.filename || `Caddyfile-${i + 1}`, content: s.content || '', })) await uploadCaddyfilesMulti(cleaned) setLoading(false) if (onUploaded) onUploaded() onClose() } catch (err: unknown) { const msg = err instanceof Error ? err.message : String(err) setError(msg || 'Upload failed') setLoading(false) } } return (

Multi-site Import

Add each site's Caddyfile content separately, then parse them together.

{/* Hidden file input so E2E tests can programmatically upload multiple files */}
{sites.map((site, idx) => (
setSiteFilename(idx, e.target.value)} className="text-sm text-gray-300 bg-transparent border-b border-gray-700 focus:border-blue-500 focus:outline-none" placeholder={`Caddyfile-${idx + 1}`} />
{sites.length > 1 && ( )}