123 lines · 4.7 KB
import { Callout } from "~/ui/Callout";
import { ReportLink } from "~/components/ReportLink";
import { createFileRoute, redirect } from "@tanstack/react-router";
import { getIssue } from "~/fns/issues";
import { listAssignable, listLabels } from "~/fns/labels";
import { findIssueRedirect, getIssuePlanning } from "~/fns/planning";
import { useViewer } from "~/hooks/use-viewer";
import { IssueHeader } from "~/components/IssueHeader";
import { IssueSidebar } from "~/components/IssueSidebar";
import { Timeline } from "~/components/Timeline";
import { CommentComposer } from "~/components/CommentComposer";
import { IssuePlanningSidebar } from "~/components/IssuePlanningSidebar";
import { ReactionBar } from "~/components/ReactionBar";
import { Avatar } from "~/ui/Avatar";
import { Markdown } from "~/ui/Markdown";
import { RelativeTime } from "~/ui/RelativeTime";

export const Route = createFileRoute("/$owner/$repo/issues/$number")({
  loader: async ({ params }) => {
    const ref = { owner: params.owner, repo: params.repo };
    const number = Number(params.number);
    try {
      const [issue, labels, assignable, planning] = await Promise.all([
        getIssue({ data: { ...ref, number } }),
        listLabels({ data: ref }),
        listAssignable({ data: ref }),
        getIssuePlanning({ data: { ...ref, number } }),
      ]);
      return { ...issue, allLabels: labels, assignable: assignable.map((row) => row.name), planning };
    } catch (error) {
      const moved = await findIssueRedirect({ data: { ...ref, number } }).catch(() => null);
      if (moved)
        throw redirect({
          to: "/$owner/$repo/issues/$number",
          params: { owner: moved.owner, repo: moved.repo, number: String(moved.number) },
        });
      throw error;
    }
  },
  component: IssuePage,