244 lines · 8.7 KB
import { createFileRoute } from "@tanstack/react-router";
import { useState } from "react";
import {
  changeAdvisoryState,
  commentOnAdvisory,
  editAdvisory,
  getAdvisory,
  updateAdvisoryCollaborator,
} from "~/fns/advisories";
import { useAction } from "~/hooks/use-action";
import { AdvisoryForm } from "~/components/security/AdvisoryForm";
import type { AdvisoryValues } from "~/components/security/AdvisoryForm";
import { SeverityBadge } from "~/components/security/SeverityBadge";
import { MarkdownEditor } from "~/components/MarkdownEditor";
import { Button } from "~/ui/Button";
import { TextField } from "~/ui/Field";
import { ErrorBanner } from "~/ui/Callout";
import { Avatar } from "~/ui/Avatar";
import { Badge } from "~/ui/Badge";
import { Markdown } from "~/ui/Markdown";
import { Panel } from "~/ui/Panel";
import { RelativeTime } from "~/ui/RelativeTime";
import { Heading } from "~/ui/Heading";

export const Route = createFileRoute("/$owner/$repo/security/advisories/$ghsaId")({
  loader: ({ params }) => getAdvisory({ data: { owner: params.owner, repo: params.repo, ghsaId: params.ghsaId } }),
  component: AdvisoryPage,
});

type Advisory = Awaited<ReturnType<typeof getAdvisory>>;

const NEXT_STATES = {
  triage: [
    { state: "draft", label: "Accept as draft" },
    { state: "closed", label: "Close report" },
  ],
  draft: [
    { state: "published", label: "Publish advisory" },
    { state: "closed", label: "Close" },
  ],