import "@xterm/xterm/css/xterm.css"; import { useLocation, useNavigate } from "react-router-dom"; import { VmInstance, VmIpAssignment } from "../api"; import VpsInstanceRow from "../components/vps-instance"; import useLogin from "../hooks/login"; import { useEffect, useState } from "react"; import { AsyncButton } from "../components/button"; import { Icon } from "../components/icon"; import Modal from "../components/modal"; import SSHKeySelector from "../components/ssh-keys"; export default function VmPage() { const location = useLocation() as { state?: VmInstance }; const login = useLogin(); const navigate = useNavigate(); const [state, setState] = useState(location?.state); const [editKey, setEditKey] = useState(false); const [editReverse, setEditReverse] = useState(); const [error, setError] = useState(); const [key, setKey] = useState(state?.ssh_key?.id ?? -1); async function reloadVmState() { if (!state) return; const newState = await login?.api.getVm(state.id); setState(newState); } function ipRow(a: VmIpAssignment, reverse: boolean) { return (
IP: {a.ip.split("/")[0]}
{a.forward_dns && (
DNS: {a.forward_dns}
)} {reverse && (
PTR: {a.reverse_dns}
setEditReverse(a)} />
)}
); } function networkInfo() { if (!state) return; if ((state.ip_assignments?.length ?? 0) === 0) { return
No IP's assigned
; } return ( <> {state.ip_assignments?.map((i) => ipRow(i, true))} ); } useEffect(() => { const t = setInterval(() => reloadVmState(), 5000); return () => clearInterval(t); }, []); if (!state) { return

No VM selected

; } return (
Network:
{networkInfo()}
SSH Key:
{state.ssh_key?.name}
setEditKey(true)} />

navigate("/vm/console", { state })}> Console navigate("/vm/billing", { state })}> Billing navigate("/vm/graphs", { state })}> Graphs
{editKey && ( setEditKey(false)}>
After selecting a new key, please restart the VM. {error && {error}} { setError(undefined); if (!login?.api) return; try { await login.api.patchVm(state.id, { ssh_key_id: key, }); await reloadVmState(); setEditKey(false); } catch (e) { if (e instanceof Error) { setError(e.message); } } }} > Save
)} {editReverse && ( setEditReverse(undefined)}>
Reverse DNS:
setEditReverse({ ...editReverse, reverse_dns: e.target.value, }) } /> DNS updates can take up to 48hrs to propagate. {error && {error}} { setError(undefined); if (!login?.api) return; try { await login.api.patchVm(state.id, { reverse_dns: editReverse.reverse_dns, }); await reloadVmState(); setEditReverse(undefined); } catch (e) { if (e instanceof Error) { setError(e.message); } } }} > Save
)}
); }