85 lines · 2.6 KB
import { Link } from "@tanstack/react-router";
import { Badge } from "~/ui/Badge";
import { EmptyState } from "~/ui/EmptyState";
import { LabelChip } from "~/ui/LabelChip";
import { RelativeTime } from "~/ui/RelativeTime";
import { cn } from "~/utils/cn";

type Item = {
  number: number;
  title: string;
  state: "open" | "closed";
  author: { name: string };
  commentsCount: number;
  createdAt: number;
  labels: Array<{ id: string; name: string; color: string }>;
  draft: boolean;
  merged: boolean;
};

function StateIcon({ item, kind }: { item: Item; kind: "issue" | "pull" }) {
  const tone = item.merged
    ? "text-merged-400"
    : item.state === "open"
      ? item.draft
        ? "text-kumo-subtle"
        : "text-kumo-success"
      : kind === "pull"
        ? "text-kumo-danger"
        : "text-kumo-subtle";
  const glyph = kind === "pull" ? (item.merged ? "⇢" : "⇄") : item.state === "open" ? "◉" : "✓";
  return (
    <span aria-hidden className={cn("w-4 text-center font-mono", tone)}>
      {glyph}
    </span>
  );
}

export function IssueList({
  owner,
  repo,