"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, Server, Cpu, HardDrive, CheckCircle, Clock, PlayCircle, CheckCircle2, } from "lucide-react"; import { DaemonStatus, ListProjects } from "@/lib/types"; export default function SystemPage() { const { data: daemonStatus, isLoading: isDaemonLoading } = useQuery({ queryKey: ["daemon-status"], queryFn: async (): Promise => { const res = await fetch("/api/scrapyd/daemon"); if (!res.ok) throw new Error("Failed to fetch daemon status"); return res.json(); }, refetchInterval: 10000, // Refresh every 10 seconds }); const { data: projects, isLoading: isProjectsLoading } = useQuery({ queryKey: ["projects"], queryFn: async (): Promise => { const res = await fetch("/api/scrapyd/projects"); if (!res.ok) throw new Error("Failed to fetch projects"); return res.json(); }, }); const systemMetrics = [ { label: "Daemon Status", value: daemonStatus?.status || "unknown", icon: Activity, color: "text-green-500", bgColor: "bg-green-500/10", }, { label: "Running Jobs", value: daemonStatus?.running ?? 0, icon: PlayCircle, color: "text-blue-500", bgColor: "bg-blue-500/10", }, { label: "Pending Jobs", value: daemonStatus?.pending ?? 0, icon: Clock, color: "text-yellow-500", bgColor: "bg-yellow-500/10", }, { label: "Finished Jobs", value: daemonStatus?.finished ?? 0, icon: CheckCircle2, color: "text-purple-500", bgColor: "bg-purple-500/10", }, ]; return (
{/* Status Overview */}
Daemon Information {isDaemonLoading ? ( ) : ( {daemonStatus?.status === "ok" ? ( ) : ( )} {daemonStatus?.status?.toUpperCase()} )}
{isDaemonLoading ? (
{[1, 2, 3].map((i) => ( ))}
) : (
Node Name
{daemonStatus?.node_name}
Total Projects
{isProjectsLoading ? ( ) : ( projects?.projects?.length ?? 0 )}
Total Jobs (All Time)
{(daemonStatus?.running ?? 0) + (daemonStatus?.pending ?? 0) + (daemonStatus?.finished ?? 0)}
)}
{/* System Metrics Grid */}
{systemMetrics.map((metric, index) => ( {metric.label}
{isDaemonLoading ? ( ) : (
{metric.value}
)}
))}
{/* Job Queue Status */} Job Queue Status {isDaemonLoading ? (
{[1, 2, 3].map((i) => ( ))}
) : (

Running Jobs

Currently executing

{daemonStatus?.running}

Pending Jobs

Waiting in queue

{daemonStatus?.pending}

Finished Jobs

Completed successfully

{daemonStatus?.finished}
)}
{/* Environment Info */} Environment Information
Scrapyd URL: {process.env.NEXT_PUBLIC_SCRAPYD_URL || "https://scrapy.pivoine.art"}
UI Version: 1.0.0
Refresh Interval: 10 seconds
); }