import { useTranslation } from "react-i18next"; import { Card, CardContent } from "@/components/ui/card"; import { ServerCard } from "@/components/ServerCard"; import { CreateServerDialog } from "@/components/CreateServerDialog"; import { Loading, ErrorState, EmptyState } from "@/components/States"; import { api } from "@/lib/api"; import { useAsync, useConfig } from "@/lib/hooks"; // ServerAdmin is the Admin-Side create surface. CreateServerDialog lives here (it // calls the admin-tier POST /servers, spec §15) rather than on User-Side, where it // previously rendered for everyone and relied on a 403 — moving it removes that // UX/tier mismatch. // // The list below currently uses the app-tier GET /me/servers, i.e. the servers // THIS admin owns or may manage. A fleet-wide GET /admin/servers (every server, // not just mine) is a separate Oracle-verifiable backend slice that powers the // SysAdmin-Side FleetTable; it is intentionally not faked in here. export function ServerAdmin() { const cfg = useConfig(); const { data, error, loading, reload } = useAsync(() => api.myServers(), []); const { t } = useTranslation("admin"); const { t: ts } = useTranslation("servers"); const servers = data ?? []; return (

{t("servers")}

{t("server_admin_subtitle")}

{cfg && }
{loading && !data ? ( ) : error ? ( ) : !cfg ? ( ) : servers.length === 0 ? ( ) : (
{servers.map((s) => ( ))}
)} {ts("server_admin_footer")}
); }