import { useQuery, useQueryClient } from '@tanstack/react-query' import { api } from '@/lib/api' import { Layers, CheckCircle, AlertTriangle, XCircle, RefreshCw } from 'lucide-react' function StackStatus({ status }: { status: string }) { const cfg: Record = { healthy: { icon: CheckCircle, color: 'text-green-400', bg: 'bg-green-500/10' }, degraded: { icon: AlertTriangle, color: 'text-amber-400', bg: 'bg-amber-500/10' }, stopped: { icon: XCircle, color: 'text-red-400', bg: 'bg-red-500/10' }, unknown: { icon: Layers, color: 'text-zinc-400', bg: 'bg-zinc-500/10' }, } const { icon: Icon, color, bg } = cfg[status] ?? cfg.unknown return ( {status} ) } export default function Services() { const qc = useQueryClient() const { data, isLoading } = useQuery({ queryKey: ['services'], queryFn: () => api.get('/services').then(r => r.data), refetchInterval: 15000, }) const stacks = data?.services ?? [] return (

{stacks.length} stack{stacks.length !== 1 ? 's' : ''}

{isLoading && (
Loading...
)} {!isLoading && stacks.length === 0 && (

No services found.

)} {stacks.map((stack: any) => (
{stack.name} {stack.type}
{stack.running}/{stack.total} running
{['Service', 'Container', 'Image', 'State'].map(h => ( ))} {stack.services.map((svc: any) => ( ))}
{h}
{svc.name} {svc.container} {svc.image} {svc.state}
))}
) }