"use client"; import { usePoll } from "@/lib/use-poll"; import type { OverviewStats } from "@/lib/types"; import { StatCard } from "@/components/stat-card"; import { ActivityFeed } from "@/components/activity-feed"; import { JellyfinCard } from "@/components/jellyfin-card"; import { OllamaCard } from "@/components/ollama-card"; import { CalendarCard } from "@/components/calendar-card"; import { HostRow } from "@/components/host-card"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; export default function DashboardPage() { const { data } = usePoll("/api/stats/overview", 60000); // Handle both API field name variants const endpoints = data?.containers?.endpoints || data?.containers?.by_endpoint || {}; const rawEmail = data?.emails_today ?? data?.email_today ?? 0; const emailCount = typeof rawEmail === "object" && rawEmail !== null ? (rawEmail as Record).total ?? 0 : rawEmail; const alertCount = data?.alerts ?? data?.unhealthy_count ?? 0; const running = data?.containers?.running ?? Object.values(endpoints).reduce((s, e) => s + (e.running || 0), 0); const hostsOnline = data?.hosts_online ?? Object.values(endpoints).filter(e => !e.error).length; const gpuPct = data?.gpu?.utilization_pct; const totalHosts = Object.keys(endpoints).length; return (
{/* Row 1: Stats */}
{/* Row 2: Calendar + Activity Feed */}
{/* Row 3: Jellyfin + GPU + Hosts */}
Hosts {data ? `(${hostsOnline}/${totalHosts} online)` : ""} {data ? (
{Object.entries(endpoints).map(([name, info]) => ( ))}
) : (

Loading...

)}
); }