87 lines · 2.8 KB
import { createFileRoute, Link } from "@tanstack/react-router";
import { z } from "zod";
import { getCommits } from "~/fns/browse";
import { getPathHistory } from "~/fns/code";
import { CommitList } from "~/components/CommitList";
import { RefSwitcher } from "~/components/RefSwitcher";
import { EmptyState } from "~/ui/EmptyState";
import { Panel } from "~/ui/Panel";
import { buttonClass } from "~/ui/Button";

export const Route = createFileRoute("/$owner/$repo/commits/$")({
  validateSearch: z.object({ page: z.number().int().min(1).optional() }),
  loaderDeps: ({ search }) => ({ page: search.page ?? 1 }),
  loader: async ({ params, deps }) => {
    const repoParams = { owner: params.owner, repo: params.repo };
    const scoped = await getPathHistory({ data: { ...repoParams, splat: params._splat ?? "", page: deps.page } });
    if (scoped.history && scoped.ref) {
      return {
        ref: scoped.ref,
        path: scoped.path,
        commits: scoped.history.commits,
        statuses: {},
        hasMore: scoped.history.hasMore,
        branches: scoped.branches,
      };
    }
    const ref = scoped.ref ?? (params._splat || undefined);
    return { path: "", ...(await getCommits({ data: { ...repoParams, ref, page: deps.page } })) };
  },
  component: CommitsPage,
});

function CommitsPage() {
  const data = Route.useLoaderData();
  const { owner, repo, _splat } = Route.useParams();
  const { page = 1 } = Route.useSearch();
  return (
    <div className="space-y-4">
      <div className="flex items-center gap-3">
        <RefSwitcher