85 lines · 3.2 KB
import { createFileRoute } from "@tanstack/react-router";
import { dismissCodeAlert, getCodeAlert } from "~/fns/security";
import { useAction } from "~/hooks/use-action";
import { SeverityBadge } from "~/components/security/SeverityBadge";
import { Button } from "~/ui/Button";
import { ErrorBanner } from "~/ui/Callout";
import { Badge } from "~/ui/Badge";
import { Panel } from "~/ui/Panel";
import { RelativeTime } from "~/ui/RelativeTime";
import { TextLink } from "~/ui/TextLink";
import { Heading } from "~/ui/Heading";

export const Route = createFileRoute("/$owner/$repo/security/code-scanning/$number")({
  loader: ({ params }) =>
    getCodeAlert({ data: { owner: params.owner, repo: params.repo, number: Number(params.number) } }),
  component: CodeAlertPage,
});

const DISMISS = [
  { value: "false_positive", label: "False positive" },
  { value: "used_in_tests", label: "Used in tests" },
  { value: "wont_fix", label: "Won't fix" },
] as const;

function CodeAlertPage() {
  const alert = Route.useLoaderData();
  const params = Route.useParams();
  const dismiss = useAction(dismissCodeAlert);
  const number = Number(params.number);
  return (
    <>
      <div className="space-y-2">
        <div className="flex flex-wrap items-center gap-2">
          <Heading>{alert.ruleName ?? alert.ruleId}</Heading>
          <SeverityBadge severity={alert.securitySeverity ?? alert.severity} />
          <Badge tone={alert.state === "open" ? "warning" : "neutral"}>{alert.state}</Badge>
        </div>
        <p className="text-xs text-gray-500">
          #{alert.number} · {alert.tool} · <span className="font-mono">{alert.ruleId}</span> · {alert.ref} · first seen{" "}
          <RelativeTime timestamp={alert.createdAt} />