'use client' import { useState } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card' import { Button } from '@/components/ui/Button' import { Modal } from '@/components/ui/Modal' import { SuccessTag, PendingTag, WarningTag } from '@/components/ui/Tag' import { Search, Plus, Users, TrendingUp, TrendingDown, Mail, Copy, CheckCircle, Clock, MoreVertical, FileText, Video, ChevronDown, ChevronRight, PlusCircle } from 'lucide-react' // 任务类型 interface CreatorTask { id: string name: string appealRemaining: number appealUsed: number status: 'in_progress' | 'completed' } // 达人类型 interface Creator { id: string name: string email: string avatar: null status: string projectCount: number scriptCount: { total: number; passed: number } videoCount: { total: number; passed: number } passRate: number trend: string joinedAt: string tasks: CreatorTask[] } // 模拟达人列表 const mockCreators: Creator[] = [ { id: 'creator-001', name: '小美护肤', email: 'xiaomei@example.com', avatar: null, status: 'active', projectCount: 5, scriptCount: { total: 12, passed: 10 }, videoCount: { total: 10, passed: 8 }, passRate: 85, trend: 'up', joinedAt: '2025-08-15', tasks: [ { id: 'task-001', name: '夏日护肤推广', appealRemaining: 1, appealUsed: 0, status: 'in_progress' }, { id: 'task-002', name: '防晒霜测评', appealRemaining: 0, appealUsed: 1, status: 'in_progress' }, ], }, { id: 'creator-002', name: '美妆Lisa', email: 'lisa@example.com', avatar: null, status: 'active', projectCount: 3, scriptCount: { total: 8, passed: 7 }, videoCount: { total: 6, passed: 5 }, passRate: 80, trend: 'stable', joinedAt: '2025-10-20', tasks: [ { id: 'task-003', name: '新品口红试色', appealRemaining: 2, appealUsed: 0, status: 'in_progress' }, ], }, { id: 'creator-003', name: '健身教练王', email: 'wang@example.com', avatar: null, status: 'active', projectCount: 2, scriptCount: { total: 5, passed: 5 }, videoCount: { total: 4, passed: 4 }, passRate: 100, trend: 'up', joinedAt: '2025-12-01', tasks: [ { id: 'task-004', name: '健身器材使用教程', appealRemaining: 1, appealUsed: 0, status: 'in_progress' }, ], }, { id: 'creator-004', name: '时尚达人', email: 'fashion@example.com', avatar: null, status: 'pending', projectCount: 0, scriptCount: { total: 0, passed: 0 }, videoCount: { total: 0, passed: 0 }, passRate: 0, trend: 'stable', joinedAt: '2026-02-05', tasks: [], }, ] function StatusTag({ status }: { status: string }) { if (status === 'active') return 已激活 if (status === 'pending') return 待接受 return 已暂停 } export default function AgencyCreatorsPage() { const [searchQuery, setSearchQuery] = useState('') const [showInviteModal, setShowInviteModal] = useState(false) const [inviteEmail, setInviteEmail] = useState('') const [inviteLink, setInviteLink] = useState('') const [expandedCreators, setExpandedCreators] = useState([]) const [creators, setCreators] = useState(mockCreators) const filteredCreators = creators.filter(creator => creator.name.toLowerCase().includes(searchQuery.toLowerCase()) || creator.email.toLowerCase().includes(searchQuery.toLowerCase()) ) // 切换展开状态 const toggleExpand = (creatorId: string) => { setExpandedCreators(prev => prev.includes(creatorId) ? prev.filter(id => id !== creatorId) : [...prev, creatorId] ) } // 增加申诉次数 const handleAddAppealQuota = (creatorId: string, taskId: string) => { setCreators(prev => prev.map(creator => { if (creator.id === creatorId) { return { ...creator, tasks: creator.tasks.map(task => { if (task.id === taskId) { return { ...task, appealRemaining: task.appealRemaining + 1 } } return task }), } } return creator })) } const handleInvite = () => { if (!inviteEmail.trim()) { alert('请输入达人邮箱') return } const link = `https://miaosi.app/invite/creator/${Date.now()}` setInviteLink(link) } const handleCopyLink = () => { navigator.clipboard.writeText(inviteLink) alert('链接已复制') } const handleSendInvite = () => { alert(`邀请已发送至 ${inviteEmail}`) setShowInviteModal(false) setInviteEmail('') setInviteLink('') } return (
{/* 页面标题 */}

达人管理

管理合作达人,查看达人绩效数据

{/* 统计卡片 */}

总达人数

{mockCreators.length}

已激活

{mockCreators.filter(c => c.status === 'active').length}

总脚本数

{mockCreators.reduce((sum, c) => sum + c.scriptCount.total, 0)}

总视频数

{mockCreators.reduce((sum, c) => sum + c.videoCount.total, 0)}

{/* 搜索 */}
setSearchQuery(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-border-subtle rounded-lg bg-bg-elevated text-text-primary focus:outline-none focus:ring-2 focus:ring-accent-indigo" />
{/* 达人列表 */} {filteredCreators.map((creator) => { const isExpanded = expandedCreators.includes(creator.id) const hasActiveTasks = creator.tasks.filter(t => t.status === 'in_progress').length > 0 return ( <> {/* 展开的任务申诉次数管理区域 */} {isExpanded && hasActiveTasks && ( )} ) })}
达人 状态 项目数 脚本 视频 通过率 加入时间 操作
{/* 展开按钮 */} {hasActiveTasks ? ( ) : (
)}
{creator.name[0]}
{creator.name}
{creator.email}
{creator.projectCount} {creator.scriptCount.passed} /{creator.scriptCount.total} {creator.videoCount.passed} /{creator.videoCount.total} {creator.status === 'active' && creator.passRate > 0 ? (
= 90 ? 'text-accent-green' : creator.passRate >= 80 ? 'text-accent-indigo' : 'text-orange-400'}`}> {creator.passRate}% {creator.trend === 'up' && } {creator.trend === 'down' && }
) : ( - )}
{creator.joinedAt}
任务申诉次数管理
{creator.tasks.filter(t => t.status === 'in_progress').map(task => (
{task.name}
剩余: {task.appealRemaining} | 已用: {task.appealUsed}
))}
{/* 邀请达人弹窗 */} { setShowInviteModal(false); setInviteEmail(''); setInviteLink(''); }} title="邀请达人">

输入达人邮箱,系统将发送邀请链接。

setInviteEmail(e.target.value)} placeholder="creator@example.com" className="flex-1 px-4 py-2 border border-border-subtle rounded-lg bg-bg-elevated text-text-primary focus:outline-none focus:ring-2 focus:ring-accent-indigo" />
{inviteLink && (
邀请链接

{inviteLink}

)}
) }