"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Badge } from "@/components/ui/badge" import { Search, Tag, MapPin } from "lucide-react" import { Alert, AlertDescription } from "@/components/ui/alert" import { AlertCircle } from "lucide-react" import { DeviceSelector } from "@/app/components/DeviceSelector" interface TargetSelectionProps { formData: { targetType: string selectedDevices: string[] selectedTrafficPool: string tags: string[] regions: string[] keywords: string[] } updateFormData: ( data: Partial<{ targetType: string selectedDevices: string[] selectedTrafficPool: string tags: string[] regions: string[] keywords: string[] }>, ) => void onSubmit: () => void onBack: () => void } interface TrafficUser { id: string avatar: string nickname: string wechatId: string phone: string region: string tags: string[] addTime: string source: string } export function TargetSelection({ formData, updateFormData, onSubmit, onBack }: TargetSelectionProps) { const [isLoading, setIsLoading] = useState(false) const [trafficUsers, setTrafficUsers] = useState([]) const [searchQuery, setSearchQuery] = useState("") const [selectedTags, setSelectedTags] = useState([]) const [selectedRegions, setSelectedRegions] = useState([]) const [errors, setErrors] = useState<{ selection?: string }>({}) // 模拟加载流量池用户数据 useEffect(() => { const fetchTrafficUsers = async () => { setIsLoading(true) await new Promise((resolve) => setTimeout(resolve, 800)) const mockUsers: TrafficUser[] = [ { id: "user-1", avatar: "/placeholder.svg?height=40&width=40", nickname: "张小明", wechatId: "zhangxm123", phone: "138****1234", region: "北京", tags: ["新用户", "低活跃度"], addTime: "2023-10-15", source: "朋友圈", }, { id: "user-2", avatar: "/placeholder.svg?height=40&width=40", nickname: "李华", wechatId: "lihua456", phone: "139****5678", region: "上海", tags: ["高消费", "高活跃度"], addTime: "2023-09-20", source: "群聊", }, { id: "user-3", avatar: "/placeholder.svg?height=40&width=40", nickname: "王芳", wechatId: "wangfang789", phone: "137****9012", region: "广州", tags: ["潜在客户", "有购买意向"], addTime: "2023-11-05", source: "搜索", }, { id: "user-4", avatar: "/placeholder.svg?height=40&width=40", nickname: "赵明", wechatId: "zhaoming321", phone: "136****3456", region: "深圳", tags: ["网购达人", "中高消费"], addTime: "2023-10-28", source: "附近的人", }, { id: "user-5", avatar: "/placeholder.svg?height=40&width=40", nickname: "刘洋", wechatId: "liuyang654", phone: "135****7890", region: "杭州", tags: ["90后", "学生"], addTime: "2023-11-10", source: "名片", }, { id: "user-6", avatar: "/placeholder.svg?height=40&width=40", nickname: "陈静", wechatId: "chenjing987", phone: "134****1234", region: "成都", tags: ["00后", "学生"], addTime: "2023-11-15", source: "朋友推荐", }, { id: "user-7", avatar: "/placeholder.svg?height=40&width=40", nickname: "林小红", wechatId: "linxh123", phone: "133****5678", region: "南京", tags: ["潜在客户", "华东地区"], addTime: "2023-10-05", source: "扫码", }, { id: "user-8", avatar: "/placeholder.svg?height=40&width=40", nickname: "黄强", wechatId: "huangq456", phone: "132****9012", region: "武汉", tags: ["高消费", "有购买意向"], addTime: "2023-09-15", source: "朋友圈", }, ] setTrafficUsers(mockUsers) setIsLoading(false) } fetchTrafficUsers() }, []) const allTags = Array.from(new Set(trafficUsers.flatMap((user) => user.tags))) const allRegions = Array.from(new Set(trafficUsers.map((user) => user.region))) const filteredUsers = trafficUsers.filter((user) => { const matchesSearch = user.nickname.toLowerCase().includes(searchQuery.toLowerCase()) || user.wechatId.toLowerCase().includes(searchQuery.toLowerCase()) || user.region.toLowerCase().includes(searchQuery.toLowerCase()) || user.tags.some((tag) => tag.toLowerCase().includes(searchQuery.toLowerCase())) const matchesTags = selectedTags.length === 0 || selectedTags.some((tag) => user.tags.includes(tag)) const matchesRegions = selectedRegions.length === 0 || selectedRegions.includes(user.region) return matchesSearch && matchesTags && matchesRegions }) const handleDeviceSelect = (deviceIds: string[]) => { updateFormData({ selectedDevices: deviceIds }) } const handleUserSelect = (userId: string) => { updateFormData({ selectedTrafficPool: userId === formData.selectedTrafficPool ? "" : userId, }) } const handleTagSelect = (tag: string) => { setSelectedTags((prev) => (prev.includes(tag) ? prev.filter((t) => t !== tag) : [...prev, tag])) } const handleRegionSelect = (region: string) => { setSelectedRegions((prev) => (prev.includes(region) ? prev.filter((r) => r !== region) : [...prev, region])) } const validateForm = () => { const newErrors: { selection?: string } = {} if (formData.targetType === "device" && formData.selectedDevices.length === 0) { newErrors.selection = "请至少选择一个设备" } else if (formData.targetType === "trafficPool" && !formData.selectedTrafficPool) { newErrors.selection = "请选择一个流量池" } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleSubmit = () => { if (validateForm()) { onSubmit() } } return (

选择分析对象

选择要分析的设备或流量池

updateFormData({ targetType: value })} value={formData.targetType} > 设备列表 流量池 {errors.selection && formData.targetType === "device" && (

{errors.selection}

)}
setSearchQuery(e.target.value)} className="pl-9" />
{allTags.map((tag) => ( handleTagSelect(tag)} > {tag} ))}
{allRegions.map((region) => ( handleRegionSelect(region)} > {region} ))}
{isLoading ? (
) : (
{filteredUsers.map((user) => ( handleUserSelect(user.id)} > ))}
用户 微信号 地区 标签 来源 添加时间
{user.nickname}
{user.nickname}
{user.phone}
{user.wechatId} {user.region}
{user.tags.map((tag) => ( {tag} ))}
{user.source} {user.addTime}
)} {filteredUsers.length === 0 && !isLoading && (

没有找到符合条件的微信用户

)} {errors.selection && formData.targetType === "trafficPool" && (

{errors.selection}

)}
{formData.targetType === "device" && formData.selectedDevices.length > 0 && ( 已选择 {formData.selectedDevices.length} 个设备进行分析 )} {formData.targetType === "trafficPool" && formData.selectedTrafficPool && ( 已选择用户: {trafficUsers.find((u) => u.id === formData.selectedTrafficPool)?.nickname} )}
) }