126 lines · 4.9 KB
import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { requireSignedIn } from "~/lib/route-guards";
import { useState } from "react";
import { z } from "zod";
import { createRepo, transferableOwners } from "~/fns/repos";
import { useAction } from "~/hooks/use-action";
import { Button } from "~/ui/Button";
import { CheckboxField, SelectField, TextField } from "~/ui/Field";
import { ErrorBanner } from "~/ui/Callout";
import { PageContainer } from "~/ui/PageContainer";
import { Panel } from "~/ui/Panel";
import { Heading } from "~/ui/Heading";

const VISIBILITY = [
  { value: "public", label: "Public — anyone can see and clone" },
  { value: "private", label: "Private — only you and collaborators" },
] as const;

const MODES = [
  { id: "empty", label: "Start fresh" },
  { id: "import", label: "Import from a URL" },
] as const;

const searchSchema = z.object({ import: z.string().optional(), name: z.string().optional() });

export const Route = createFileRoute("/new")({
  validateSearch: searchSchema,
  beforeLoad: ({ context, location }) => {
    requireSignedIn({ context, location });
  },
  loader: () => transferableOwners(),
  component: NewRepoPage,
});

function NewRepoPage() {
  const owners = Route.useLoaderData();
  const search = Route.useSearch();
  const navigate = useNavigate();
  const action = useAction(createRepo, { invalidate: false });
  const [mode, setMode] = useState<(typeof MODES)[number]["id"]>(search.import ? "import" : "empty");