"use client"; import { useState, useEffect, type ReactNode } from "react"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import { JM } from "./modal-theme"; import { DEFAULT_DESIGN_KIT_ID } from "@/lib/design-kits/types"; import { kitsOrderedForCategory, type ProductCategoryId, } from "@/lib/design-kits/product-categories"; import { SetupHeader, FieldLabel, TextInput, TextArea, AudienceSelector, ProductCategorySelector, DesignKitSplitSelector, SeedDocumentUpload, PrimaryButton, SecondaryButton, StepDots, type SetupProps, type Audience, type SeedDocumentPayload, } from "./setup-shared"; type BuildSetupProps = SetupProps & { /** Lets the modal shell widen on step 1 (design kit + preview). */ onWizardStepChange?: (step: number) => void; }; const DEFAULT_PRODUCT_CATEGORY: ProductCategoryId = "saas-tool"; /** * "Build your own idea" — three-step setup. * Step 0: project name + product shape + audience. * Step 1: design system starter kit (split list + preview). * Step 2: describe the idea (free text). Becomes the seed message * for the first AI conversation in the project. */ export function BuildSetup({ workspace, onClose, onBack, onWizardStepChange }: BuildSetupProps) { const router = useRouter(); const [step, setStep] = useState(0); const [name, setName] = useState(""); const [audience, setAudience] = useState("customers"); const [productCategory, setProductCategory] = useState(DEFAULT_PRODUCT_CATEGORY); const [designKitId, setDesignKitId] = useState(DEFAULT_DESIGN_KIT_ID); const [idea, setIdea] = useState(""); const [seedDocument, setSeedDocument] = useState(null); const [loading, setLoading] = useState(false); useEffect(() => { const allowed = kitsOrderedForCategory(productCategory); const allowedSet = new Set(allowed); setDesignKitId((prev) => (allowedSet.has(prev) ? prev : allowed[0] ?? prev)); }, [productCategory]); useEffect(() => { onWizardStepChange?.(step); }, [step, onWizardStepChange]); const totalSteps = 3; const canContinue0 = name.trim().length > 0; const canCreate = idea.trim().length > 4 || (seedDocument !== null && idea.trim().length > 0); const handleBack = () => { if (step === 0) onBack(); else setStep(step - 1); }; const handleCreate = async () => { if (!canCreate) return; setLoading(true); try { const res = await fetch("/api/projects/create", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ projectName: name.trim(), projectType: "web-app", slug: name.toLowerCase().replace(/[^a-z0-9]+/g, "-"), vision: idea.trim(), product: { name: name.trim() }, audience, designKitId, creationMode: "build", sourceData: { idea: idea.trim(), audience, designKitId, productCategory, }, ...(seedDocument ? { seedDocument } : {}), }), }); if (!res.ok) { const err = await res.json(); toast.error(err.error || "Failed to create project"); return; } const data = await res.json(); onClose(); router.push(`/${workspace}/project/${data.projectId}/product`); } catch { toast.error("Something went wrong"); } finally { setLoading(false); } }; return (
{step === 0 && ( <> Project name { if (e.key === "Enter" && canContinue0) setStep(1); }} autoFocus /> setStep(1)} disabled={!canContinue0}> Next → } /> )} {step === 1 && ( <> setStep(0)}>← Back} primary={ setStep(2)}> Next → } /> )} {step === 2 && ( <> What do you want to build?