diff --git a/apps/web/app/(use-page-wrapper)/settings/teams/new/invite/email/page.tsx b/apps/web/app/(use-page-wrapper)/settings/teams/new/invite/email/page.tsx
new file mode 100644
index 0000000000..c23bf65896
--- /dev/null
+++ b/apps/web/app/(use-page-wrapper)/settings/teams/new/invite/email/page.tsx
@@ -0,0 +1,34 @@
+import { _generateMetadata } from "app/_utils";
+import { cookies, headers } from "next/headers";
+import { redirect } from "next/navigation";
+
+import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
+import { APP_NAME } from "@calcom/lib/constants";
+
+import { buildLegacyRequest } from "@lib/buildLegacyCtx";
+
+import { TeamInviteEmailView } from "~/settings/teams/new/invite/email/team-invite-email-view";
+
+export const generateMetadata = async () => {
+ return await _generateMetadata(
+ (t) => `${APP_NAME} - ${t("invite")}`,
+ () => "",
+ true,
+ undefined,
+ "/settings/teams/new/invite/email"
+ );
+};
+
+const ServerPage = async () => {
+ const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
+
+ if (!session?.user?.id) {
+ return redirect("/auth/login");
+ }
+
+ const userEmail = session.user.email || "";
+
+ return
diff --git a/apps/web/modules/onboarding/hooks/useCreateTeam.ts b/apps/web/modules/onboarding/hooks/useCreateTeam.ts
index a65971c254..0debc8080e 100644
--- a/apps/web/modules/onboarding/hooks/useCreateTeam.ts
+++ b/apps/web/modules/onboarding/hooks/useCreateTeam.ts
@@ -9,7 +9,12 @@ import { trpc } from "@calcom/trpc/react";
import type { OnboardingState } from "../store/onboarding-store";
import { useOnboardingStore } from "../store/onboarding-store";
-export function useCreateTeam() {
+type UseCreateTeamOptions = {
+ redirectBasePath?: string;
+};
+
+export function useCreateTeam(options: UseCreateTeamOptions = {}) {
+ const { redirectBasePath = "/onboarding/teams" } = options;
const router = useRouter();
const [isSubmitting, setIsSubmitting] = useState(false);
const flags = useFlagMap();
@@ -28,7 +33,7 @@ export function useCreateTeam() {
// Validate team details - if empty, redirect back to team details step
if (!teamDetails.name || !teamDetails.name.trim() || !teamDetails.slug || !teamDetails.slug.trim()) {
- router.push("/onboarding/teams/details");
+ router.push(`${redirectBasePath}/details`);
setIsSubmitting(false);
return;
}
@@ -51,7 +56,7 @@ export function useCreateTeam() {
if (result.team) {
// Store the teamId and redirect to invite flow after team creation
setTeamId(result.team.id);
- router.push(`/onboarding/teams/invite?teamId=${result.team.id}`);
+ router.push(`${redirectBasePath}/invite/email?teamId=${result.team.id}`);
}
} catch (error) {
console.error("Failed to create team:", error);
diff --git a/apps/web/modules/settings/teams/new/create-new-team-view.tsx b/apps/web/modules/settings/teams/new/create-new-team-view.tsx
index 0b84fcf2a5..d320d521fe 100644
--- a/apps/web/modules/settings/teams/new/create-new-team-view.tsx
+++ b/apps/web/modules/settings/teams/new/create-new-team-view.tsx
@@ -1,58 +1,210 @@
"use client";
import { useRouter } from "next/navigation";
-import React from "react";
-import { z } from "zod";
+import posthog from "posthog-js";
+import React, { useEffect, useRef, useState, type FormEvent } from "react";
-import { HOSTED_CAL_FEATURES } from "@calcom/lib/constants";
-import { getSafeRedirectUrl } from "@calcom/lib/getSafeRedirectUrl";
-import { useParamsWithFallback } from "@calcom/lib/hooks/useParamsWithFallback";
-import type { RouterOutputs } from "@calcom/trpc/react";
-import { WizardLayout } from "@calcom/ui/components/layout";
-import { CreateANewTeamForm } from "@calcom/web/modules/ee/teams/components/CreateANewTeamForm";
+import { useLocale } from "@calcom/lib/hooks/useLocale";
+import slugify from "@calcom/lib/slugify";
+import { Avatar } from "@calcom/ui/components/avatar";
+import { Button } from "@calcom/ui/components/button";
+import { Label, TextField, TextArea } from "@calcom/ui/components/form";
+import { ImageUploader } from "@calcom/ui/components/image-uploader";
+import { showToast } from "@calcom/ui/components/toast";
-const querySchema = z.object({
- returnTo: z.string().optional(),
- slug: z.string().optional(),
-});
+import { OnboardingCard } from "~/onboarding/components/OnboardingCard";
+import { OnboardingLayout } from "~/onboarding/components/OnboardingLayout";
+import { OnboardingBrowserView } from "~/onboarding/components/onboarding-browser-view";
+import { useCreateTeam } from "~/onboarding/hooks/useCreateTeam";
+import { useOnboardingStore } from "~/onboarding/store/onboarding-store";
+import { ValidatedTeamSlug } from "~/onboarding/teams/details/validated-team-slug";
-const CreateNewTeamPage = () => {
- const params = useParamsWithFallback();
- const parsedQuery = querySchema.safeParse(params);
+type CreateNewTeamViewProps = {
+ userEmail: string;
+};
+
+export const CreateNewTeamView = ({ userEmail }: CreateNewTeamViewProps) => {
const router = useRouter();
+ const { t } = useLocale();
+ const store = useOnboardingStore();
+ const { teamDetails, teamBrand, setTeamDetails, setTeamBrand, resetOnboardingPreservingPlan } = store;
+ const { createTeam, isSubmitting } = useCreateTeam({ redirectBasePath: "/settings/teams/new" });
- const isTeamBillingEnabledClient = !!process.env.NEXT_PUBLIC_STRIPE_PUBLIC_KEY && HOSTED_CAL_FEATURES;
- const flag = isTeamBillingEnabledClient
- ? {
- submitLabel: "checkout",
- }
- : {
- submitLabel: "continue",
- };
+ const logoRef = useRef {t("onboarding_logo_size_hint")}