import { TopicList } from "~/components/TopicList";
import { DropdownMenu } from "@cloudflare/kumo/components/dropdown";
import { Popover } from "@cloudflare/kumo/components/popover";
import { createFileRoute, Link, Outlet, redirect, useMatchRoute, useNavigate } from "@tanstack/react-router";
import { useEffect, useState } from "react";
import { setRepoVisibility } from "~/lib/analytics";
import { forkRepo, getRepoHeader, toggleStar, transferableOwners } from "~/fns/repos";
import { WatchMenu } from "~/components/WatchMenu";
import { useAction } from "~/hooks/use-action";
import { useOptimisticMutation } from "~/hooks/use-optimistic-mutation";
import { useViewer } from "~/hooks/use-viewer";
import { Badge } from "~/ui/Badge";
import { Button } from "~/ui/Button";
import { inputClass } from "~/ui/Field";
import { cn } from "~/utils/cn";
import { RepoProvisioning } from "~/components/RepoProvisioning";
import { usePollWhile } from "~/hooks/use-poll-while";
import { useEditorHotkey } from "~/hooks/use-editor-hotkey";
import { TextLink } from "~/ui/TextLink";
import { CountBadge } from "~/ui/CountBadge";
import { RouteTabs } from "~/ui/Nav";
import { SignInLink } from "~/components/SignInPrompt";
import { ReportLink } from "~/components/ReportLink";
import { seo } from "~/utils/seo";
export const Route = createFileRoute("/$owner/$repo")({
loader: async ({ params, location }) => {
const header = await getRepoHeader({ data: { owner: params.owner, repo: params.repo } });
const canonical = `/${header.repo.owner}/${header.repo.name}`;
if (canonical.toLowerCase() !== `/${params.owner}/${params.repo}`.toLowerCase()) {
const rest = location.pathname.split("/").slice(3).join("/");
throw redirect({ href: `${canonical}${rest ? `/${rest}` : ""}${location.searchStr}` });
}
// Before the navigation resolves, so the pageview (sent on resolve) already knows whether the path is public.
if (typeof window !== "undefined") {
setRepoVisibility(header.repo.owner, header.repo.name, header.repo.visibility !== "public");
}
return header;
},
head: ({ params, loaderData, match }) => {