55 lines · 1.9 KB
import { createFileRoute } from "@tanstack/react-router";
import { getBlob } from "~/fns/browse";
import { resolveEditTarget } from "~/fns/editor";
import { FileEditor } from "~/components/FileEditor";
import { NotFound } from "~/components/NotFound";
import { WorkspaceEditor } from "~/components/editor/WorkspaceEditor";
import { requireSignedIn } from "~/lib/route-guards";

export const Route = createFileRoute("/$owner/$repo/edit/$")({
  beforeLoad: requireSignedIn,
  validateSearch: (search: Record<string, unknown>): { path?: string; container?: number } => ({
    ...(typeof search.path === "string" && search.path ? { path: search.path } : {}),
    ...(search.container === 1 || search.container === "1" ? { container: 1 } : {}),
  }),
  loader: async ({ params }) => {
    const input = { owner: params.owner, repo: params.repo, splat: params._splat ?? "" };
    const target = await resolveEditTarget({ data: input });
    if (target.kind === "workspace") return target;
    return { kind: "file" as const, blob: await getBlob({ data: input }) };
  },
  component: EditPage,
});

function EditPage() {
  const data = Route.useLoaderData();
  const { owner, repo } = Route.useParams();
  const { path, container } = Route.useSearch();
  if (data.kind === "workspace") {
    return (
      <WorkspaceEditor
        owner={owner}
        repo={repo}
        gitRef={data.ref}
        editorOrigin={data.editorOrigin}
        openPath={path ?? null}
        startContainer={container === 1}
      />
    );
  }
  const { blob } = data;