"use client";
import {
BarChart,
Bar,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
ResponsiveContainer,
} from "recharts";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Skeleton } from "@/components/ui/skeleton";
import { Badge } from "@/components/ui/badge";
import {
ResponsiveTable,
ResponsiveTableCardList,
ResponsiveTableCard,
ResponsiveTableCardRow,
} from "@/components/ui/responsive-table";
import {
useCycleTime,
useBottlenecks,
useRework,
useTeamScorecard,
} from "@/hooks/use-observability";
import type { Scorecard } from "@/types";
const CELLS = ["backend", "frontend", "ux_ui"] as const;
function label(status: string): string {
return status
.split("_")
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
.join(" ");
}
function fmtDuration(seconds: number): string {
if (seconds >= 3600) return (seconds / 3600).toFixed(1) + "h";
if (seconds >= 60) return (seconds / 60).toFixed(0) + "m";
return seconds.toFixed(0) + "s";
}
function pct(rate: number): string {
return (rate * 100).toFixed(1) + "%";
}
// ─── Cycle time ───────────────────────────────────────────────────────────────
function CycleTimeCard() {
const { data, isLoading } = useCycleTime(30);
const chartData = (data ?? []).map((s) => ({
name: label(s.status),
Hours: Number((s.avg_seconds / 3600).toFixed(2)),
}));
return (
No completed transitions in the window yet.
No stage data yet.
{(data?.by_agent ?? []).slice(0, 8).map((a) => (
Agent
Rate
QA fails
PR fails
PM rejects
CEO rejects
))}
}
cards={
{a.agent_slug}
{pct(a.rate)}
{a.qa_fails}
{a.pr_fails}
{a.pm_rejects}
{a.ceo_rejects}