90 lines · 3.2 KB
import { Callout } from "~/ui/Callout";
import { createFileRoute, Link, Outlet, useMatchRoute } from "@tanstack/react-router";
import { getPull } from "~/fns/pulls";
import { getIssue } from "~/fns/issues";
import { listAssignable, listLabels } from "~/fns/labels";
import { IssueHeader } from "~/components/IssueHeader";
import { PullStack } from "~/components/PullStack";
import { RelativeTime } from "~/ui/RelativeTime";
import { CountBadge } from "~/ui/CountBadge";
import { Code } from "~/ui/Code";
import { RouteTabs } from "~/ui/Nav";

export const Route = createFileRoute("/$owner/$repo/pull/$number")({
  loader: async ({ params }) => {
    const ref = { owner: params.owner, repo: params.repo };
    const number = Number(params.number);
    const [pull, issue, labels, assignable] = await Promise.all([
      getPull({ data: { ...ref, number } }),
      getIssue({ data: { ...ref, number } }),
      listLabels({ data: ref }),
      listAssignable({ data: ref }),
    ]);
    return { ...pull, conversation: issue, allLabels: labels, assignable: assignable.map((row) => row.name) };
  },
  component: PullLayout,
});

function PullLayout() {
  const data = Route.useLoaderData();
  const params = Route.useParams();
  const { pull, conversation } = data;
  const { issue } = conversation;
  const matchRoute = useMatchRoute();
  const tabs = [
    {
      to: "/$owner/$repo/pull/$number",
      label: "Conversation",
      exact: true,
      count: conversation.timeline.filter((item) => item.type === "comment").length,
    },