diff --git a/packages/frontend/src/pages/Dashboard.tsx b/packages/frontend/src/pages/Dashboard.tsx index dd0ae88..e336b24 100644 --- a/packages/frontend/src/pages/Dashboard.tsx +++ b/packages/frontend/src/pages/Dashboard.tsx @@ -1,13 +1,237 @@ -export function Dashboard() { +import { useState, useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import { api } from "../services/api"; + +function StatusBadge({ status }: { status: string }) { + const color = + status === "running" + ? "#4ade80" + : status === "stopped" + ? "#f87171" + : "#fbbf24"; + return ( -
- NWN Development Environment -
+ + + {status} + + ); +} + +function ServerCard() { + const [status, setStatus] = useState<{ nwserver: string; mariadb: string }>({ + nwserver: "unknown", + mariadb: "unknown", + }); + const [loading, setLoading] = useState(false); + + const poll = () => { + api.server + .status() + .then(setStatus) + .catch(() => setStatus({ nwserver: "error", mariadb: "error" })); + }; + + useEffect(() => { + poll(); + const id = setInterval(poll, 10000); + return () => clearInterval(id); + }, []); + + const toggle = async () => { + setLoading(true); + try { + if (status.nwserver === "running") { + await api.server.stop(); + } else { + await api.server.start(); + } + poll(); + } catch { + // ignore + } finally { + setLoading(false); + } + }; + + return ( ++ NWN Development Environment +
+