51 lines · 1.8 KB
import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { requireSignedIn } from "~/lib/route-guards";
import { createOrganization } from "~/fns/account";
import { useAction } from "~/hooks/use-action";
import { Button } from "~/ui/Button";
import { TextField } from "~/ui/Field";
import { ErrorBanner } from "~/ui/Callout";
import { PageContainer } from "~/ui/PageContainer";
import { Panel } from "~/ui/Panel";
import { Heading } from "~/ui/Heading";

export const Route = createFileRoute("/orgs/new")({
  beforeLoad: ({ context, location }) => {
    requireSignedIn({ context, location });
  },
  component: NewOrgPage,
});

function NewOrgPage() {
  const navigate = useNavigate();
  const action = useAction(createOrganization);

  async function submit(event: React.SubmitEvent<HTMLFormElement>) {
    event.preventDefault();
    const form = new FormData(event.currentTarget);
    const displayName = String(form.get("displayName") ?? "").trim();
    const result = await action.run({
      data: { name: String(form.get("name") ?? ""), displayName: displayName || null },
    });
    if (result) await navigate({ to: "/$owner", params: { owner: result.name } });
  }

  return (
    <PageContainer className="max-w-xl">
      <Heading size="xl" className="mb-6">
        New organization
      </Heading>
      <Panel>
        <form onSubmit={submit} className="space-y-4 p-5">
          <ErrorBanner message={action.error} />