"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { useSession } from "next-auth/react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { AlertCard } from "@/components/business/alert-card"; import { fetchWithAuth } from "@/lib/api/client"; import { Check } from "lucide-react"; interface ProjectResponse { id: string; brand_name: string; brand_url: string; description?: string; status: string; current_stage: string; stages: string[]; } type StepStatus = "waiting" | "active" | "completed"; interface ProgressStep { id: string; label: string; status: StepStatus; } export default function NewProjectPage() { const router = useRouter(); const { data: session } = useSession(); const [brandName, setBrandName] = useState(""); const [brandUrl, setBrandUrl] = useState(""); const [description, setDescription] = useState(""); const [touched, setTouched] = useState({ brandName: false, brandUrl: false }); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const [steps, setSteps] = useState([ { id: "create", label: "正在创建项目...", status: "waiting" }, { id: "init", label: "正在初始化分析阶段...", status: "waiting" }, { id: "agent", label: "正在配置AI Agent...", status: "waiting" }, { id: "ready", label: "准备就绪!正在跳转...", status: "waiting" }, ]); const brandNameError = touched.brandName && !brandName.trim(); const brandUrlError = touched.brandUrl && !brandUrl.trim(); const canSubmit = brandName.trim().length > 0 && brandUrl.trim().length > 0 && !submitting; async function handleSubmit() { if (!canSubmit) return; setSubmitting(true); setError(null); const token = session?.accessToken as string | undefined; try { const data = await fetchWithAuth( "/api/v1/lifecycle/projects/quick-start", { method: "POST", body: JSON.stringify({ brand_name: brandName.trim(), brand_url: brandUrl.trim(), description: description.trim() || undefined, }), }, token ) as { project: ProjectResponse; message: string }; void data; animateSteps(); } catch (err) { setSubmitting(false); setError( err instanceof Error ? err.message : "网络错误,请检查连接后重试" ); } } function animateSteps() { const stepOrder = ["create", "init", "agent", "ready"] as const; setSteps((prev) => prev.map((step, i) => i === 0 ? { ...step, status: "active" as StepStatus } : step ) ); stepOrder.forEach((stepId, index) => { setTimeout(() => { setSteps((prev) => prev.map((step, i) => { if (step.id === stepId) return { ...step, status: "completed" }; if (i === index + 1) return { ...step, status: "active" }; return step; }) ); if (index === stepOrder.length - 1) { setTimeout(() => { router.push("/dashboard/lifecycle"); }, 800); } }, (index + 1) * 800); }); } function handleRetry() { setError(null); void handleSubmit(); } if (submitting) { return (

正在为您准备

AI正在自动初始化您的项目

{steps.map((step) => (
{step.status === "completed" ? ( ) : ( )}
{step.label}
))}
); } return (
{/* Header */}

开始优化您的AI可见性

输入品牌信息,AI将自动分析并制定优化方案

{/* Error Alert */} {error && ( 重试 ), }, ]} maxVisible={1} /> )} {/* Form Card */}
setBrandName(e.target.value)} onBlur={() => setTouched((prev) => ({ ...prev, brandName: true })) } className={ brandNameError ? "border-destructive focus-visible:ring-destructive" : "" } /> {brandNameError && (

请输入品牌名称

)}
setBrandUrl(e.target.value)} onBlur={() => setTouched((prev) => ({ ...prev, brandUrl: true })) } className={ brandUrlError ? "border-destructive focus-visible:ring-destructive" : "" } /> {brandUrlError && (

请输入品牌网址

)}