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) => ( ))}
)}
); }