import type { GetServerSidePropsContext } from "next"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { useState } from "react"; import AdminAppsList from "@calcom/features/apps/AdminAppsList"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { getDeploymentKey } from "@calcom/features/ee/deployment/lib/getDeploymentKey"; import { APP_NAME } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import prisma from "@calcom/prisma"; import { UserPermissionRole } from "@calcom/prisma/enums"; import type { inferSSRProps } from "@calcom/types/inferSSRProps"; import { Meta, WizardForm } from "@calcom/ui"; import PageWrapper from "@components/PageWrapper"; import { AdminUserContainer as AdminUser } from "@components/setup/AdminUser"; import ChooseLicense from "@components/setup/ChooseLicense"; import EnterpriseLicense from "@components/setup/EnterpriseLicense"; import { ssrInit } from "@server/lib/ssr"; function useSetStep() { const router = useRouter(); const searchParams = useSearchParams(); const pathname = usePathname(); const setStep = (newStep = 1) => { const _searchParams = new URLSearchParams(searchParams ?? undefined); _searchParams.set("step", newStep.toString()); router.replace(`${pathname}?${_searchParams.toString()}`); }; return setStep; } export function Setup(props: inferSSRProps) { const { t } = useLocale(); const router = useRouter(); const [value, setValue] = useState(props.isFreeLicense ? "FREE" : "EE"); const isFreeLicense = value === "FREE"; const [isEnabledEE, setIsEnabledEE] = useState(!props.isFreeLicense); const setStep = useSetStep(); const steps: React.ComponentProps["steps"] = [ { title: t("administrator_user"), description: t("lets_create_first_administrator_user"), content: (setIsLoading) => ( { setIsLoading(true); }} onSuccess={() => { setStep(2); }} onError={() => { setIsLoading(false); }} userCount={props.userCount} /> ), }, { title: t("choose_a_license"), description: t("choose_license_description"), content: (setIsLoading) => { return ( { setIsLoading(true); setStep(3); }} /> ); }, }, ]; if (!isFreeLicense) { steps.push({ title: t("step_enterprise_license"), description: t("step_enterprise_license_description"), content: (setIsLoading) => { const currentStep = 3; return ( { setIsLoading(true); }} onSuccess={() => { setStep(currentStep + 1); }} onSuccessValidate={() => { setIsEnabledEE(true); }} /> ); }, isEnabled: isEnabledEE, }); } steps.push({ title: t("enable_apps"), description: t("enable_apps_description", { appName: APP_NAME }), contentClassname: "!pb-0 mb-[-1px]", content: (setIsLoading) => { const currentStep = isFreeLicense ? 3 : 4; return ( { setIsLoading(true); router.replace("/"); }} /> ); }, }); return ( <>
t("current_step_of_total", { currentStep, maxSteps })} />
); } Setup.isThemeSupported = false; Setup.PageWrapper = PageWrapper; export default Setup; export const getServerSideProps = async (context: GetServerSidePropsContext) => { const { req, res } = context; const ssr = await ssrInit(context); const userCount = await prisma.user.count(); const session = await getServerSession({ req, res }); if (session?.user.role && session?.user.role !== UserPermissionRole.ADMIN) { return { redirect: { destination: `/404`, permanent: false, }, }; } const deploymentKey = await prisma.deployment.findUnique({ where: { id: 1 }, select: { licenseKey: true }, }); // Check existant CALCOM_LICENSE_KEY env var and acccount for it if (!!process.env.CALCOM_LICENSE_KEY && !deploymentKey?.licenseKey) { await prisma.deployment.upsert({ where: { id: 1 }, update: { licenseKey: process.env.CALCOM_LICENSE_KEY, agreedLicenseAt: new Date(), }, create: { licenseKey: process.env.CALCOM_LICENSE_KEY, agreedLicenseAt: new Date(), }, }); } const isFreeLicense = (await getDeploymentKey(prisma)) === ""; return { props: { trpcState: ssr.dehydrate(), isFreeLicense, userCount, }, }; };