166 lines · 6.2 KB
import { createFileRoute, Link } from "@tanstack/react-router";
import { z } from "zod";
import { getSecretAlerts, resolveSecretAlert } from "~/fns/security";
import { useAction } from "~/hooks/use-action";
import { buttonClass } from "~/ui/Button";
import { InlineSelect } from "~/ui/Field";
import { ErrorBanner } from "~/ui/Callout";
import { Badge } from "~/ui/Badge";
import { EmptyState } from "~/ui/EmptyState";
import { Panel } from "~/ui/Panel";
import { RelativeTime } from "~/ui/RelativeTime";
import { cn } from "~/utils/cn";
import { Callout } from "~/ui/Callout";

export const Route = createFileRoute("/$owner/$repo/security/secret-scanning/")({
  validateSearch: z.object({
    state: z.enum(["open", "resolved"]).optional(),
    page: z.number().int().min(1).optional(),
  }),
  loaderDeps: ({ search }) => ({ state: search.state ?? "open", page: search.page ?? 1 }),
  loader: ({ params, deps }) =>
    getSecretAlerts({ data: { owner: params.owner, repo: params.repo, state: deps.state, page: deps.page } }),
  component: SecretScanningPage,
});

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

function resolutionOf(value: string) {
  return RESOLUTIONS.find((option) => option.value === value)?.value ?? null;
}

function SecretScanningPage() {
  const data = Route.useLoaderData();
  const params = Route.useParams();
  const search = Route.useSearch();