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>
);
}