import type { IssueWorkProduct } from "@paperclipai/shared";
import { Badge } from "@/components/ui/badge";
import { pullRequestHref, pullRequestIdentity, pullRequestLabel, pullRequestNeedsReview, pullRequestState } from "@/lib/issue-pull-requests";
import type { ExternalObjectPillData } from "./ExternalObjectPill";
import { ExternalObjectStatusIcon } from "./ExternalObjectStatusIcon";
import { externalObjectDisplayStatusLabel, externalObjectLivenessLabel } from "@/lib/external-objects";
/** Saved PRs remain inspectable even when the provider lookup is unavailable. */
export function IssuePullRequestLinks({ products, externalObjects = [] }: {
products: IssueWorkProduct[];
externalObjects?: ExternalObjectPillData[];
}) {
return (
{products.map((product) => {
const href = pullRequestHref(product);
const label = pullRequestLabel(product);
const state = pullRequestState(product);
const identity = pullRequestIdentity(href);
const provider = identity ? externalObjects.find((entry) => pullRequestIdentity(entry.url) === identity) : undefined;
const providerStatus = provider ? externalObjectDisplayStatusLabel(provider) : null;
const providerTerminal = provider?.liveness === "fresh"
&& (provider.statusIconKey === "git-merge" || ["merged", "closed"].includes(providerStatus?.toLowerCase() ?? ""));
return (
-
{href ? (
{label}
) : {label} ยท No PR link provided}
{provider ? (
{providerStatus}{!["fresh", "unknown"].includes(provider.liveness) ? ` (${externalObjectLivenessLabel(provider.liveness)})` : ""}
) : null}
{pullRequestNeedsReview(product) && !providerTerminal ? (
Review requested
) : ["merged", "closed", "archived", "draft", "changes_requested"].includes(state)
&& providerStatus?.toLowerCase() !== state ? (
{provider ? "Saved: " : ""}{state.replaceAll("_", " ")}
) : null}
);
})}
);
}