"use client"; import { useState, useEffect } from "react"; import { useSession } from "next-auth/react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Loader2, Users, Plus, X, Check, ArrowRight, ArrowLeft, Lightbulb, } from "lucide-react"; import { api } from "@/lib/api"; import type { CompetitorRecommendation } from "@/types/onboarding"; interface Step2CompetitorsProps { brandName: string; initialCompetitors?: string[]; onNext: (competitors: string[]) => void; onBack: () => void; onSkip: () => void; } export function Step2Competitors({ brandName, initialCompetitors = [], onNext, onBack, onSkip, }: Step2CompetitorsProps) { const { data: session } = useSession(); const [recommendations, setRecommendations] = useState< CompetitorRecommendation[] >([]); const [selectedCompetitors, setSelectedCompetitors] = useState(initialCompetitors); const [customCompetitor, setCustomCompetitor] = useState(""); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const fetchRecommendations = async () => { if (!session?.accessToken) return; try { setLoading(true); setError(null); const data = (await api.onboarding.getCompetitorRecommendations( session.accessToken, brandName, )) as CompetitorRecommendation[]; setRecommendations(data || []); } catch (err) { console.error("获取竞品推荐失败:", err); setError("获取竞品推荐失败,请重试"); } finally { setLoading(false); } }; useEffect(() => { fetchRecommendations(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [session?.accessToken, brandName]); const toggleCompetitor = (competitorName: string) => { setSelectedCompetitors((prev) => prev.includes(competitorName) ? prev.filter((c) => c !== competitorName) : [...prev, competitorName], ); }; const handleAddCustomCompetitor = () => { const trimmed = customCompetitor.trim(); if (trimmed && !selectedCompetitors.includes(trimmed)) { setSelectedCompetitors((prev) => [...prev, trimmed]); setCustomCompetitor(""); } }; const handleRemoveCompetitor = (competitorName: string) => { setSelectedCompetitors((prev) => prev.filter((c) => c !== competitorName)); }; const handleNext = () => { onNext(selectedCompetitors); }; return (

确认竞品

我们为您推荐了与 “{brandName}” 相关的竞品, 您可以选择添加或跳过

系统推荐竞品 {loading ? (
加载中...
) : error ? (

{error}

) : recommendations.length > 0 ? (
{recommendations.map((comp) => { const isSelected = selectedCompetitors.includes(comp.name); return ( ); })}
) : (

暂未找到推荐竞品,您可以手动添加

)} {/* 已选择的竞品 */} {selectedCompetitors.length > 0 && (
{selectedCompetitors.map((comp) => ( {comp} ))}
)} {/* 手动添加竞品 */}
setCustomCompetitor(e.target.value)} placeholder="输入竞品名称" onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); handleAddCustomCompetitor(); } }} className="flex-1" />

您可以随时在品牌详情页添加或修改竞品

); }