"use client" import type React from "react" import { useState, useEffect } from "react" import { Card } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Switch } from "@/components/ui/switch" import { QrCode, X, ChevronDown, Plus, Maximize2, Upload, Download } from "lucide-react" import { TooltipProvider } from "@/components/ui/tooltip" import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from "@/components/ui/table" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog" const scenarios = [ { id: "haibao", name: "海报", type: "material" }, { id: "order", name: "订单", type: "api" }, { id: "douyin", name: "抖音", type: "social" }, { id: "xiaohongshu", name: "小红书", type: "social" }, { id: "gongzhonghao", name: "公众号", type: "social" }, { id: "payment", name: "支付码", type: "material" }, { id: "weixinqun", name: "微信群", type: "social" }, { id: "api", name: "API", type: "api" }, ] interface Account { id: string nickname: string avatar: string } interface Material { id: string name: string type: "poster" | "payment" preview: string } interface BasicSettingsProps { formData: any onChange: (data: any) => void onNext?: () => void } const posterTemplates = [ { id: "poster-1", name: "点击领取", preview: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/%E7%82%B9%E5%87%BB%E9%A2%86%E5%8F%961-tipd1HI7da6qooY5NkhxQnXBnT5LGU.gif", }, { id: "poster-2", name: "点击合作", preview: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/%E7%82%B9%E5%87%BB%E5%90%88%E4%BD%9C-LPlMdgxtvhqCSr4IM1bZFEFDBF3ztI.gif", }, { id: "poster-3", name: "点击咨询", preview: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/%E7%82%B9%E5%87%BB%E5%92%A8%E8%AF%A2-FTiyAMAPop2g9LvjLOLDz0VwPg3KVu.gif", }, { id: "poster-4", name: "点击签到", preview: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/%E7%82%B9%E5%87%BB%E7%AD%BE%E5%88%B0-94TZIkjLldb4P2jTVlI6MkSDg0NbXi.gif", }, { id: "poster-5", name: "点击了解", preview: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/%E7%82%B9%E5%87%BB%E4%BA%86%E8%A7%A3-6GCl7mQVdO4WIiykJyweSubLsTwj71.gif", }, { id: "poster-6", name: "点击报名", preview: "https://hebbkx1anhila5yf.public.blob.vercel-storage.com/%E7%82%B9%E5%87%BB%E6%8A%A5%E5%90%8D-Mj0nnva0BiASeDAIhNNaRRAbjPgjEj.gif", }, ] const generateRandomAccounts = (count: number): Account[] => { return Array.from({ length: count }, (_, index) => ({ id: `account-${index + 1}`, nickname: `账号-${Math.random().toString(36).substring(2, 7)}`, avatar: `/placeholder.svg?height=40&width=40&text=${index + 1}`, })) } const generatePosterMaterials = (): Material[] => { return posterTemplates.map((template) => ({ id: template.id, name: template.name, type: "poster", preview: template.preview, })) } export function BasicSettings({ formData, onChange, onNext }: BasicSettingsProps) { const [isAccountDialogOpen, setIsAccountDialogOpen] = useState(false) const [isMaterialDialogOpen, setIsMaterialDialogOpen] = useState(false) const [isQRCodeOpen, setIsQRCodeOpen] = useState(false) const [isPreviewOpen, setIsPreviewOpen] = useState(false) const [previewImage, setPreviewImage] = useState("") const [accounts] = useState(generateRandomAccounts(50)) const [materials] = useState(generatePosterMaterials()) const [selectedAccounts, setSelectedAccounts] = useState( formData.accounts?.length > 0 ? formData.accounts : [], ) const [selectedMaterials, setSelectedMaterials] = useState( formData.materials?.length > 0 ? formData.materials : [], ) const [showAllScenarios, setShowAllScenarios] = useState(false) const [isImportDialogOpen, setIsImportDialogOpen] = useState(false) const [importedTags, setImportedTags] = useState< Array<{ phone: string wechat: string source?: string orderAmount?: number orderDate?: string }> >(formData.importedTags || []) useEffect(() => { if (!formData.planName) { if (formData.materials?.length > 0) { const today = new Date().toLocaleDateString("zh-CN").replace(/\//g, "") onChange({ ...formData, planName: `海报${today}` }) } else { onChange({ ...formData, planName: "场景" }) } } }, [formData, onChange]) const handleScenarioSelect = (scenarioId: string) => { onChange({ ...formData, scenario: scenarioId }) } const handleAccountSelect = (account: Account) => { const updatedAccounts = [...selectedAccounts, account] setSelectedAccounts(updatedAccounts) onChange({ ...formData, accounts: updatedAccounts }) } const handleMaterialSelect = (material: Material) => { const updatedMaterials = [material] setSelectedMaterials(updatedMaterials) onChange({ ...formData, materials: updatedMaterials }) setIsMaterialDialogOpen(false) // 更新计划名称 const today = new Date().toLocaleDateString("zh-CN").replace(/\//g, "") onChange({ ...formData, planName: `海报${today}`, materials: updatedMaterials }) } const handleRemoveAccount = (accountId: string) => { const updatedAccounts = selectedAccounts.filter((a) => a.id !== accountId) setSelectedAccounts(updatedAccounts) onChange({ ...formData, accounts: updatedAccounts }) } const handleRemoveMaterial = (materialId: string) => { const updatedMaterials = selectedMaterials.filter((m) => m.id !== materialId) setSelectedMaterials(updatedMaterials) onChange({ ...formData, materials: updatedMaterials }) } const handlePreviewImage = (imageUrl: string) => { setPreviewImage(imageUrl) setIsPreviewOpen(true) } const displayedScenarios = showAllScenarios ? scenarios : scenarios.slice(0, 3) const handleFileImport = (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (file) { const reader = new FileReader() reader.onload = (e) => { try { const content = e.target?.result as string const rows = content.split("\n").filter((row) => row.trim()) const tags = rows.slice(1).map((row) => { const [phone, wechat, source, orderAmount, orderDate] = row.split(",") return { phone: phone.trim(), wechat: wechat.trim(), source: source?.trim(), orderAmount: orderAmount ? Number(orderAmount) : undefined, orderDate: orderDate?.trim(), } }) setImportedTags(tags) onChange({ ...formData, importedTags: tags }) } catch (error) { console.error("导入失败:", error) } } reader.readAsText(file) } } const handleDownloadTemplate = () => { const template = "电话号码,微信号,来源,订单金额,下单日期\n13800138000,wxid_123,抖音,99.00,2024-03-03" const blob = new Blob([template], { type: "text/csv" }) const url = window.URL.createObjectURL(blob) const a = document.createElement("a") a.href = url a.download = "订单导入模板.csv" document.body.appendChild(a) a.click() document.body.removeChild(a) window.URL.revokeObjectURL(url) } return (
{displayedScenarios.map((scenario) => ( ))}
{!showAllScenarios && ( )}
onChange({ ...formData, planName: e.target.value })} placeholder="请输入计划名称" className="mt-2" />
{formData.scenario && ( <> {scenarios.find((s) => s.id === formData.scenario)?.type === "social" && (
{selectedAccounts.length > 0 && (
{selectedAccounts.map((account) => (
{account.nickname} {account.nickname}
))}
)}
)} {scenarios.find((s) => s.id === formData.scenario)?.type === "material" && (
{/* 海报展示区域 */}
{materials.map((material) => (
m.id === material.id) ? "ring-2 ring-blue-600" : "hover:ring-2 hover:ring-blue-600" }`} onClick={() => handleMaterialSelect(material)} > {material.name}
{material.name}
))}
{selectedMaterials.length > 0 && (
{selectedMaterials[0].name} handlePreviewImage(selectedMaterials[0].preview)} />
)}
)} {scenarios.find((s) => s.id === formData.scenario)?.id === "order" && (
{importedTags.length > 0 && (

已导入 {importedTags.length} 条数据

电话号码 微信号 来源 订单金额 {importedTags.slice(0, 5).map((tag, index) => ( {tag.phone} {tag.wechat} {tag.source} {tag.orderAmount} ))} {importedTags.length > 5 && ( 还有 {importedTags.length - 5} 条数据未显示 )}
)}
)} )}
onChange({ ...formData, enabled: checked })} />
{/* 账号选择对话框 */} 选择账号
{accounts.map((account) => (
handleAccountSelect(account)} > {account.nickname} {selectedAccounts.find((a) => a.id === account.id) && (
)}
))}
{/* 二维码对话框 */} 绑定账号
二维码

请用相应的APP扫码

{/* 图片预览对话框 */} 海报预览
预览
{/* 订单导入对话框 */} 导入订单标签
电话号码 微信号 来源 订单金额 下单日期 {importedTags.map((tag, index) => ( {tag.phone} {tag.wechat} {tag.source} {tag.orderAmount} {tag.orderDate} ))}
) }