import { Link } from "react-router";
import type { ProjectCard } from "../../data";
import { Badge } from "../components/badge";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "../components/table";
import { age } from "../format";
import { Empty, Pending, Scroller } from "../frame";
import { useLoaded } from "../lib/api";
import { cn } from "../lib/cn";
export const STATUS_FILTERS = [
{ value: "ranked", label: "active + paused" },
{ value: "active", label: "active" },
{ value: "paused", label: "paused" },
{ value: "all", label: "all" },
] as const;
export type StatusFilter = (typeof STATUS_FILTERS)[number]["value"];
export function isStatusFilter(value: string | null): value is StatusFilter {
return STATUS_FILTERS.some((f) => f.value === value);
}
const RANKED = new Set(["active", "paused"]);
const COLUMNS = [
{ label: "Project", numeric: false },
{ label: "Status", numeric: false },
{ label: "Serves", numeric: false },
{ label: "Open ISCs", numeric: true },
{ label: "Sessions / 30d", numeric: true },
{ label: "Agents", numeric: false },
{ label: "Here", numeric: false },
{ label: "Touched", numeric: true },
] as const;
function keep(card: ProjectCard, filter: StatusFilter): boolean {
if (filter === "all") return true;
if (filter === "ranked") return RANKED.has(card.status);
return card.status === filter;
}
function Row({ card }: { card: ProjectCard }) {
return (
{card.slug}
{card.next[0] && (
{card.next[0]}
)}
{card.status}
{card.serves ?? "unranked"}
{card.servesBy && (
ยท {card.servesBy}
)}
{card.openIscs}
{card.sessions30d}
{Object.entries(card.runtimes).map(([runtime, n]) => (
{runtime} {n}
))}
{card.path ?? "not checked out here"}
{age(card.ageDays)}
);
}
export function Projects({ filter }: { filter: StatusFilter }) {
const board = useLoaded("/api/board");
if (board.state !== "ready") return ;
const rows = board.data.filter((card) => keep(card, filter));
return (
{rows.length === 0 ? (
No project matches this filter.
) : (
{COLUMNS.map((column) => (
{column.label}
))}
{rows.map((card) => (
))}
)}
);
}