import { useEffect, useState } from "react"; import { createVM, fetchTemplates, fetchSSHKeys, type Template, type SSHKey, } from "../api"; interface Props { token: string; projectID: string; tenantID: string; onCreated: () => void; } export function VMCreate({ token, projectID, tenantID, onCreated }: Props) { const [name, setName] = useState(""); const [templateID, setTemplateID] = useState(""); const [node, setNode] = useState(""); const [vcpu, setVCPU] = useState(2); const [ramMB, setRAMMB] = useState(2048); const [diskGB, setDiskGB] = useState(10); const [sshKeyID, setSSHKeyID] = useState(""); const [error, setError] = useState(""); const [busy, setBusy] = useState(false); const [open, setOpen] = useState(false); const [templates, setTemplates] = useState([]); const [sshKeys, setSSHKeys] = useState([]); useEffect(() => { if (!open) return; fetchTemplates(token) .then((res) => { setTemplates(res.data ?? []); if (res.data && res.data.length > 0 && !templateID) { setTemplateID(res.data[0].id); } }) .catch(() => {}); if (tenantID) { fetchSSHKeys(token, tenantID) .then((res) => setSSHKeys(res.data ?? [])) .catch(() => {}); } }, [open, token, tenantID]); useEffect(() => { if (templateID) { const tpl = templates.find((t) => t.id === templateID); if (tpl && !node) { setNode(tpl.proxmox_node); } } }, [templateID, templates]); async function handleCreate() { setError(""); if (!name.trim()) { setError("Name erforderlich"); return; } if (!templateID) { setError("Template erforderlich"); return; } if (!node.trim()) { setError("Node erforderlich"); return; } setBusy(true); try { await createVM(token, projectID, { name: name.trim(), template_id: templateID, node: node.trim(), vcpu, ram_mb: ramMB, disk_gb: diskGB, ssh_key_id: sshKeyID || undefined, }); setName(""); setOpen(false); onCreated(); } catch (err) { setError(err instanceof Error ? err.message : "Fehler"); } finally { setBusy(false); } } if (!open) { return ( ); } return (

Provisioning

VM erstellen

{error ?

{error}

: null}
); }