"use client"; import type { SessionContextValue } from "next-auth/react"; import { useSession, signIn } from "next-auth/react"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { uuid } from "short-uuid"; import { deriveOrgNameFromEmail } from "@calcom/ee/organizations/components/CreateANewOrganizationForm"; import { deriveSlugFromEmail } from "@calcom/ee/organizations/components/CreateANewOrganizationForm"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { useTelemetry } from "@calcom/lib/hooks/useTelemetry"; import slugify from "@calcom/lib/slugify"; import { telemetryEventTypes } from "@calcom/lib/telemetry"; import { UserPermissionRole } from "@calcom/prisma/enums"; import { CreationSource } from "@calcom/prisma/enums"; import { trpc } from "@calcom/trpc/react"; import type { Ensure } from "@calcom/types/utils"; import { Alert } from "@calcom/ui/components/alert"; import { Button } from "@calcom/ui/components/button"; import { TextField } from "@calcom/ui/components/form"; import { Form } from "@calcom/ui/components/form"; export const CreateANewPlatformForm = () => { const session = useSession(); if (!session.data) { return null; } return ; }; const CreateANewPlatformFormChild = ({ session }: { session: Ensure }) => { const { t } = useLocale(); const router = useRouter(); const telemetry = useTelemetry(); const [serverErrorMessage, setServerErrorMessage] = useState(null); const isAdmin = session.data.user.role === UserPermissionRole.ADMIN; const defaultOrgOwnerEmail = session.data.user.email ?? ""; const newOrganizationFormMethods = useForm<{ name: string; slug: string; orgOwnerEmail: string; isPlatform: boolean; }>({ defaultValues: { slug: !isAdmin ? deriveSlugFromEmail(defaultOrgOwnerEmail) : undefined, orgOwnerEmail: !isAdmin ? defaultOrgOwnerEmail : undefined, name: !isAdmin ? deriveOrgNameFromEmail(defaultOrgOwnerEmail) : undefined, isPlatform: true, }, }); const createOrganizationMutation = trpc.viewer.organizations.create.useMutation({ onSuccess: async (data) => { telemetry.event(telemetryEventTypes.org_created); // This is necessary so that server token has the updated upId await session.update({ upId: data.upId, }); if (isAdmin && data.userId !== session.data?.user.id) { // Impersonate the user chosen as the organization owner(if the admin user isn't the owner himself), so that admin can now configure the organisation on his behalf. // He won't need to have access to the org directly in this way. signIn("impersonation-auth", { username: data.email, callbackUrl: `/settings/platform`, }); } router.push("/settings/platform"); }, onError: (err) => { if (err.message === "organization_url_taken") { newOrganizationFormMethods.setError("slug", { type: "custom", message: t("url_taken") }); setServerErrorMessage(err.message); } else if (err.message === "domain_taken_team" || err.message === "domain_taken_project") { newOrganizationFormMethods.setError("slug", { type: "custom", message: t("problem_registering_domain"), }); setServerErrorMessage(err.message); } else { setServerErrorMessage(err.message); } }, }); return ( <>
{ if (!createOrganizationMutation.isPending) { setServerErrorMessage(null); createOrganizationMutation.mutate({ ...v, slug: `${v.name.toLocaleLowerCase()}-platform-${uuid().substring(0, 20)}`, creationSource: CreationSource.API_V2, }); } }}>
{serverErrorMessage && (
)} (
{ const email = e?.target.value; const slug = deriveSlugFromEmail(email); newOrganizationFormMethods.setValue("orgOwnerEmail", email.trim()); if (newOrganizationFormMethods.getValues("slug") === "") { newOrganizationFormMethods.setValue("slug", slug); } newOrganizationFormMethods.setValue("name", deriveOrgNameFromEmail(email)); }} autoComplete="off" />
)} />
( <> { newOrganizationFormMethods.setValue("name", e?.target.value.trim()); if (newOrganizationFormMethods.formState.touchedFields["slug"] === undefined) { newOrganizationFormMethods.setValue("slug", slugify(e?.target.value)); } }} autoComplete="off" /> )} />
); };