"use client"; import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { useParams, useRouter } from "next/navigation"; import Link from "next/link"; import { api, ServerStatus } from "@/lib/api"; import { Badge, Button, Card, CardHeader, CardTitle } from "@/components/ui"; import { Table, Thead, Tbody, Tr, Th, Td } from "@/components/ui"; function statusVariant(status: ServerStatus) { switch (status) { case "active": return "success"; case "pending": return "warning"; case "offline": return "danger"; } } function formatDate(dateStr: string) { return new Date(dateStr).toLocaleString(); } export default function ServerDetailPage() { const params = useParams(); const router = useRouter(); const queryClient = useQueryClient(); const serverId = params.id as string; const [confirmDelete, setConfirmDelete] = useState(false); const { data: server, isLoading, error } = useQuery({ queryKey: ["servers", serverId], queryFn: () => api.getServer(serverId), refetchInterval: 30_000, }); const { mutate: generateKey, isPending: isGenerating } = useMutation({ mutationFn: () => api.generateKeyForServer(serverId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["servers", serverId] }); queryClient.invalidateQueries({ queryKey: ["keys"] }); }, }); const { mutate: deleteServer, isPending: isDeleting } = useMutation({ mutationFn: () => api.deleteServer(serverId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["servers"] }); router.push("/servers"); }, }); if (isLoading) { return (
); } if (error || !server) { return (
Server not found or failed to load.
); } return (
← Servers

{server.hostname}

{server.status}

{server.ip_address}

{!confirmDelete ? ( ) : (
Are you sure?
)}
Details
Server ID
{server.server_id}
OS
{server.os_info}
Last Seen
{server.last_seen ? formatDate(server.last_seen) : "Never"}
Registered
{formatDate(server.created_at)}

Installed Keys {server.keys?.filter(k => !k.revoked_at).length ?? 0} active

{!server.keys || server.keys.length === 0 ? (

No keys assigned to this server.

) : ( {server.keys.map((assignment) => ( ))}
Label Fingerprint Source Status Assigned
{assignment.key.label} {assignment.key.fingerprint} {assignment.key.source} {assignment.revoked_at ? "revoked" : "active"} {formatDate(assignment.assigned_at)}
)}
); }