70 lines · 2.7 KB
import { Link } from "@tanstack/react-router";
import { setLinkedIssue } from "~/fns/pull-review";
import { useAction } from "~/hooks/use-action";
import { Badge } from "./ui/Primitives";
import { Button } from "./ui/Button";
import { inputClass } from "./ui/Field";
import { cn } from "~/utils/cn";

type Props = {
  owner: string;
  repo: string;
  number: number;
  issues: Array<{ number: number; title: string; state: "open" | "closed"; source: "manual" | "keyword" }>;
  canEdit: boolean;
};

/** "Development" sidebar: issues this pull request resolves, from closing keywords or manual links. */
export function LinkedIssues({ owner, repo, number, issues, canEdit }: Props) {
  const link = useAction(setLinkedIssue);
  return (
    <section className="space-y-2 border-b border-gray-800 pb-4">
      <h3 className="label-caps text-gray-500">Development</h3>
      {issues.length === 0 && <p className="text-gray-500">No linked issues</p>}
      {issues.map((issue) => (
        <div key={issue.number} className="flex items-center gap-2 text-gray-300">
          <Badge tone={issue.state === "open" ? "green" : "purple"}>{issue.state}</Badge>
          <Link
            to="/$owner/$repo/issues/$number"
            params={{ owner, repo, number: String(issue.number) }}
            className="min-w-0 flex-1 truncate hover:text-accent-400"
          >
            #{issue.number} {issue.title}
          </Link>
          {canEdit && issue.source === "manual" && (
            <button
              type="button"
              title="Unlink"
              className="text-xs text-gray-500 hover:text-red-400"
              onClick={() => link.run({ data: { owner, repo, number, issueNumber: issue.number, linked: false } })}
            >