import type { GroupedInstance } from "../types";
interface Props {
groups: GroupedInstance[];
totalGroups: number;
onSelect: (instanceId: string) => void;
filterResolved: "all" | "resolved" | "unresolved";
onFilterChange: (f: "all" | "resolved" | "unresolved") => void;
searchQuery: string;
onSearchChange: (q: string) => void;
loading: boolean;
}
export function InstanceList({
groups,
totalGroups,
onSelect,
filterResolved,
onFilterChange,
searchQuery,
onSearchChange,
loading,
}: Props) {
return (
{/* Toolbar */}
onSearchChange(e.target.value)}
placeholder="Search instances..."
className="flex-1 max-w-sm bg-gray-800 border border-gray-700 rounded px-3 py-1.5 text-sm text-gray-200 placeholder-gray-500 focus:outline-none focus:border-blue-500"
/>
{(["all", "resolved", "unresolved"] as const).map((f) => (
))}
{groups.length === totalGroups
? `${groups.length} instances`
: `${groups.length} / ${totalGroups} instances`}
{loading && (
Loading...
)}
{/* Instance grid */}
{groups.map((g) => (
onSelect(g.instance_id)} />
))}
{groups.length === 0 && !loading && (
No instances match your filters
)}
);
}
function InstanceCard({
group,
onClick,
}: {
group: GroupedInstance;
onClick: () => void;
}) {
const anyResolved = group.datasets.some((d) => d.summary.resolved);
const allResolved = group.datasets.every((d) => d.summary.resolved);
// Parse instance_id: "repo__issue-number"
const parts = group.instance_id.split("__");
const repo = parts[0] || "";
const issue = parts.slice(1).join("__") || "";
return (
);
}