75 lines · 2.6 KB
import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { z } from "zod";
import { searchCode } from "~/fns/code";
import { CodeSearchResults } from "~/components/CodeSearchResults";
import { CodeSearchPager } from "~/components/CodeSearchPager";
import { CodeSearchForm } from "~/components/CodeSearchForm";
import { CODE_MAX_PAGES, CODE_PAGE_SIZE } from "~/lib/code-search";
import { Panel } from "~/ui/Panel";

export const Route = createFileRoute("/$owner/$repo/search")({
  validateSearch: z.object({
    q: z.string().optional(),
    page: z.coerce.number().int().min(1).max(CODE_MAX_PAGES).optional().catch(undefined),
  }),
  loaderDeps: ({ search }) => ({ q: search.q?.trim() ?? "", page: search.page ?? 1 }),
  loader: async ({ params, deps }) => ({
    q: deps.q,
    ...(await searchCode({ data: { q: deps.q, owner: params.owner, repo: params.repo, page: deps.page } })),
  }),
  component: RepoSearchPage,
});

function IndexStatusNote({ data }: { data: ReturnType<typeof Route.useLoaderData> }) {
  const status = data.status;
  if (!status) {
    return (
      <span className="text-xs text-kumo-subtle">
        {data.indexing ? "Indexing the default branch, results will appear shortly" : "Not indexed yet"}
      </span>
    );
  }
  return (
    <span className="text-xs text-kumo-subtle">
      {status.fileCount.toLocaleString()} files indexed at{" "}
      <span className="font-mono">{status.commitSha.slice(0, 7)}</span>
      {status.truncated && " (partial)"}
      {data.indexing && ", updating…"}
    </span>
  );
}