import { useState, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { useQueryClient } from '@tanstack/react-query'; import { apiFetch } from '../lib/api'; import Modal from '../components/Modal'; type ImportResult = { project: { id: string; name: string }; stats: { modules: number; endpoints: number }; }; export default function ImportDialog({ onClose }: { onClose: () => void }) { const [mode, setMode] = useState<'url' | 'file'>('url'); const [url, setUrl] = useState(''); const [fileContent, setFileContent] = useState(''); const [fileName, setFileName] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [result, setResult] = useState(null); const [dragging, setDragging] = useState(false); const fileInputRef = useRef(null); const navigate = useNavigate(); const queryClient = useQueryClient(); const handleFile = (file: File) => { setFileName(file.name); const reader = new FileReader(); reader.onload = () => setFileContent(reader.result as string); reader.readAsText(file); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setDragging(false); const file = e.dataTransfer.files[0]; if (file) handleFile(file); }; const handleImport = async () => { setLoading(true); setError(''); try { let body: Record; if (mode === 'url') { body = { specUrl: url }; } else { try { body = { spec: JSON.parse(fileContent) }; } catch { body = { spec: fileContent }; } } const data = await apiFetch('/projects', { method: 'POST', body: JSON.stringify(body), }); setResult(data); queryClient.invalidateQueries({ queryKey: ['projects'] }); } catch (err) { setError(err instanceof Error ? err.message : 'Import failed'); } finally { setLoading(false); } }; return ( {!result ? (

Import OpenAPI Document

Import a Swagger 2.0 or OpenAPI 3.x document to create a new project.

{/* Mode toggle */}
{mode === 'url' ? ( setUrl(e.target.value)} className="input-base" /> ) : (
{ e.preventDefault(); setDragging(true); }} onDragLeave={() => setDragging(false)} onDrop={handleDrop} onClick={() => fileInputRef.current?.click()} className={`border-2 border-dashed rounded-xl p-8 text-center cursor-pointer transition-all ${ dragging ? 'border-accent bg-accent-muted' : 'border-border-default hover:border-border-strong' }`} > e.target.files?.[0] && handleFile(e.target.files[0])} className="hidden" /> {fileName ? (

{fileName}

) : ( <>

Drop your OpenAPI file here

JSON or YAML

)}
)} {error && (
{error}
)}
) : (

Import Successful

{result.project.name}

{result.stats.modules}
Modules
{result.stats.endpoints}
Endpoints
)}
); }