'use client' import { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import { useToast } from '@/components/ui/Toast' import { Card, CardContent } from '@/components/ui/Card' import { Button } from '@/components/ui/Button' import { Input } from '@/components/ui/Input' import { ArrowLeft, Upload, Calendar, FileText, CheckCircle, X, Users, Search, Building2, Check, Loader2 } from 'lucide-react' import { api } from '@/lib/api' import { USE_MOCK } from '@/contexts/AuthContext' import { useOSSUpload } from '@/hooks/useOSSUpload' import type { AgencyDetail } from '@/types/organization' // ==================== Mock 数据 ==================== const mockAgencies: AgencyDetail[] = [ { id: 'AG789012', name: '星耀传媒', force_pass_enabled: true }, { id: 'AG456789', name: '创意无限', force_pass_enabled: false }, { id: 'AG123456', name: '美妆达人MCN', force_pass_enabled: false }, { id: 'AG111111', name: '蓝海科技', force_pass_enabled: true }, { id: 'AG222222', name: '云创网络', force_pass_enabled: false }, { id: 'AG333333', name: '天府传媒', force_pass_enabled: true }, ] export default function CreateProjectPage() { const router = useRouter() const toast = useToast() const { upload, isUploading, progress: uploadProgress } = useOSSUpload('general') const [projectName, setProjectName] = useState('') const [description, setDescription] = useState('') const [deadline, setDeadline] = useState('') const [briefFile, setBriefFile] = useState(null) const [briefFileUrl, setBriefFileUrl] = useState(null) const [selectedAgencies, setSelectedAgencies] = useState([]) const [isSubmitting, setIsSubmitting] = useState(false) const [agencySearch, setAgencySearch] = useState('') const [agencies, setAgencies] = useState([]) const [loadingAgencies, setLoadingAgencies] = useState(true) useEffect(() => { const loadAgencies = async () => { if (USE_MOCK) { setAgencies(mockAgencies) setLoadingAgencies(false) return } try { const data = await api.listBrandAgencies() setAgencies(data.items) } catch (err) { console.error('Failed to load agencies:', err) toast.error('加载代理商列表失败') } finally { setLoadingAgencies(false) } } loadAgencies() }, [toast]) const filteredAgencies = agencies.filter(agency => agencySearch === '' || agency.name.toLowerCase().includes(agencySearch.toLowerCase()) || agency.id.toLowerCase().includes(agencySearch.toLowerCase()) ) const handleFileChange = async (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (!file) return setBriefFile(file) if (!USE_MOCK) { try { const result = await upload(file) setBriefFileUrl(result.url) } catch (err) { toast.error('文件上传失败') setBriefFile(null) } } else { setBriefFileUrl('mock://brief-file.pdf') } } const toggleAgency = (agencyId: string) => { setSelectedAgencies(prev => prev.includes(agencyId) ? prev.filter(id => id !== agencyId) : [...prev, agencyId] ) } const handleSubmit = async () => { if (!projectName.trim() || !deadline || selectedAgencies.length === 0) { toast.error('请填写完整信息') return } setIsSubmitting(true) try { if (USE_MOCK) { await new Promise(resolve => setTimeout(resolve, 1000)) } else { const project = await api.createProject({ name: projectName.trim(), description: description.trim() || undefined, deadline, agency_ids: selectedAgencies, }) // If brief file was uploaded, create brief if (briefFileUrl && briefFile) { await api.createBrief(project.id, { file_url: briefFileUrl, file_name: briefFile.name, }) } } toast.success('项目创建成功!') router.push('/brand') } catch (err) { console.error('Failed to create project:', err) toast.error('创建失败,请重试') } finally { setIsSubmitting(false) } } const isValid = projectName.trim() && deadline && selectedAgencies.length > 0 return (

创建项目

{/* 项目名称 */}
setProjectName(e.target.value)} placeholder="例如:XX品牌618推广" className="w-full px-4 py-3 border border-border-subtle rounded-lg bg-bg-elevated text-text-primary focus:outline-none focus:ring-2 focus:ring-accent-indigo" />
{/* 项目描述 */}