"use client"; import { useQuery } from "@tanstack/react-query"; import { Header } from "@/components/header"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; import { Activity, FolderKanban, PlayCircle, Clock, CheckCircle2, } from "lucide-react"; import { DaemonStatus } from "@/lib/types"; export default function DashboardPage() { const { data: daemonStatus, isLoading: isDaemonLoading } = useQuery({ queryKey: ["daemon-status"], queryFn: async (): Promise => { const res = await fetch("/ui/api/scrapyd/daemon"); if (!res.ok) throw new Error("Failed to fetch daemon status"); return res.json(); }, }); const { data: projects, isLoading: isProjectsLoading } = useQuery({ queryKey: ["projects"], queryFn: async () => { const res = await fetch("/ui/api/scrapyd/projects"); if (!res.ok) throw new Error("Failed to fetch projects"); return res.json(); }, }); const stats = [ { title: "Running Jobs", value: daemonStatus?.running ?? 0, icon: PlayCircle, color: "text-green-500", bgColor: "bg-green-500/10", }, { title: "Pending Jobs", value: daemonStatus?.pending ?? 0, icon: Clock, color: "text-yellow-500", bgColor: "bg-yellow-500/10", }, { title: "Finished Jobs", value: daemonStatus?.finished ?? 0, icon: CheckCircle2, color: "text-blue-500", bgColor: "bg-blue-500/10", }, { title: "Total Projects", value: projects?.projects?.length ?? 0, icon: FolderKanban, color: "text-purple-500", bgColor: "bg-purple-500/10", }, ]; return (
{/* Stats Grid */}
{stats.map((stat, index) => ( {stat.title}
{isDaemonLoading || isProjectsLoading ? ( ) : (
{stat.value}
)}
))}
{/* System Status Card */}
System Status {isDaemonLoading ? ( ) : ( daemonStatus?.status )}
{isDaemonLoading ? (
) : (
Node Name: {daemonStatus?.node_name}
Total Jobs: {(daemonStatus?.running ?? 0) + (daemonStatus?.pending ?? 0) + (daemonStatus?.finished ?? 0)}
)}
{/* Projects Overview */} Projects Overview {isProjectsLoading ? (
{[1, 2, 3].map((i) => ( ))}
) : projects?.projects?.length > 0 ? (
{projects.projects.map((project: string) => (
{project}
Active
))}
) : (

No projects found. Upload a project to get started.

)}
); }