import { useFetcher } from "react-router"; import Button from "~/components/button"; import Link from "~/components/link"; import Notice from "~/components/notice"; import StatusCircle from "~/components/status-circle"; import Text from "~/components/text"; import Title from "~/components/title"; import { formatTimeDelta } from "~/utils/time"; import type { Route } from "./+types/agent"; export async function loader({ request, context }: Route.LoaderArgs) { const principal = await context.auth.require(request); if (!context.agents) { return { enabled: false as const }; } const sync = context.agents.lastSync(); return { enabled: true as const, syncedAt: sync.syncedAt?.toISOString() ?? null, nodeCount: sync.nodeCount, error: sync.error, }; } export async function action({ request, context }: Route.ActionArgs) { await context.auth.require(request); if (!context.agents) { return { success: false, error: "Agent is not enabled" }; } await context.agents.triggerSync(); const sync = context.agents.lastSync(); return { success: !sync.error, error: sync.error }; } export default function Page({ loaderData }: Route.ComponentProps) { const fetcher = useFetcher(); const isSyncing = fetcher.state !== "idle"; if (!loaderData.enabled) { return (
Headplane Agent The Headplane Agent is not enabled. To learn how to set up the agent, visit the{" "} documentation
); } const hasError = Boolean(loaderData.error); return (
Headplane Agent The Headplane Agent syncs node information like OS version and connectivity details from your Tailnet.
{hasError ? "Error" : "Healthy"}
Last synced: {loaderData.syncedAt ? ( {formatTimeDelta(new Date(loaderData.syncedAt))} ) : ( "Never" )} Nodes synced: {loaderData.nodeCount}
{loaderData.error ? ( {loaderData.error} ) : undefined}
); }