'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import { MessageCircle, Clock, CheckCircle, XCircle, ChevronRight, AlertTriangle, Filter, Search } from 'lucide-react' import { ResponsiveLayout } from '@/components/layout/ResponsiveLayout' import { cn } from '@/lib/utils' // 申诉状态类型 type AppealStatus = 'pending' | 'processing' | 'approved' | 'rejected' // 申诉数据类型 type Appeal = { id: string taskId: string taskTitle: string type: 'ai' | 'agency' | 'brand' reason: string content: string status: AppealStatus createdAt: string updatedAt?: string result?: string } // 模拟申诉数据 const mockAppeals: Appeal[] = [ { id: 'appeal-001', taskId: 'task-003', taskTitle: 'ZZ饮品夏日', type: 'ai', reason: '误判', content: '视频中出现的是我们自家品牌的历史产品,并非竞品。已附上品牌授权证明。', status: 'approved', createdAt: '2026-02-01 10:30', updatedAt: '2026-02-02 15:20', result: '经核实,该产品确为品牌方授权产品,申诉通过。AI已学习此案例。', }, { id: 'appeal-002', taskId: 'task-010', taskTitle: 'GG智能手表', type: 'agency', reason: '审核标准不清晰', content: '代理商反馈品牌调性不符,但Brief中并未明确说明科技专业形象的具体要求。请明确审核标准。', status: 'processing', createdAt: '2026-02-04 09:15', }, { id: 'appeal-003', taskId: 'task-011', taskTitle: 'HH美妆代言', type: 'brand', reason: '创意理解差异', content: '品牌方认为创意不够新颖,但该创意形式在同类型产品推广中效果显著,已附上数据支持。', status: 'pending', createdAt: '2026-02-05 14:00', }, { id: 'appeal-004', taskId: 'task-013', taskTitle: 'JJ旅行vlog', type: 'agency', reason: '版权问题异议', content: '使用的背景音乐来自无版权音乐库 Epidemic Sound,已购买商用授权。附上授权证明截图。', status: 'rejected', createdAt: '2026-01-28 11:30', updatedAt: '2026-01-30 16:45', result: '经核实,该音乐虽有授权,但授权范围不包含商业广告用途。建议更换音乐后重新提交。', }, ] // 状态配置 const statusConfig: Record = { pending: { label: '待处理', color: 'text-amber-500', bgColor: 'bg-amber-500/15', icon: Clock }, processing: { label: '处理中', color: 'text-accent-indigo', bgColor: 'bg-accent-indigo/15', icon: MessageCircle }, approved: { label: '已通过', color: 'text-accent-green', bgColor: 'bg-accent-green/15', icon: CheckCircle }, rejected: { label: '已驳回', color: 'text-accent-coral', bgColor: 'bg-accent-coral/15', icon: XCircle }, } // 类型配置 const typeConfig: Record = { ai: { label: 'AI审核', color: 'text-accent-indigo' }, agency: { label: '代理商审核', color: 'text-purple-400' }, brand: { label: '品牌方审核', color: 'text-accent-blue' }, } // 申诉卡片组件 function AppealCard({ appeal, onClick }: { appeal: Appeal; onClick: () => void }) { const status = statusConfig[appeal.status] const type = typeConfig[appeal.type] const StatusIcon = status.icon return (
{/* 头部 */}
{appeal.taskTitle} 申诉编号: {appeal.id}
{status.label}
{/* 内容 */}
申诉对象: {type.label}
申诉原因: {appeal.reason}

{appeal.content}

{/* 底部时间 */}
提交时间: {appeal.createdAt} {appeal.updatedAt && ( 更新时间: {appeal.updatedAt} )}
) } // 申诉次数入口卡片 function AppealQuotaEntryCard({ onClick }: { onClick: () => void }) { return (
申诉次数管理 查看各任务的申诉次数,向代理商申请增加
) } export default function CreatorAppealsPage() { const router = useRouter() const [filter, setFilter] = useState('all') const [searchQuery, setSearchQuery] = useState('') const [appeals] = useState(mockAppeals) // 搜索和筛选 const filteredAppeals = appeals.filter(appeal => { const matchesSearch = searchQuery === '' || appeal.taskTitle.toLowerCase().includes(searchQuery.toLowerCase()) || appeal.id.toLowerCase().includes(searchQuery.toLowerCase()) || appeal.reason.toLowerCase().includes(searchQuery.toLowerCase()) const matchesFilter = filter === 'all' || appeal.status === filter return matchesSearch && matchesFilter }) const handleAppealClick = (appealId: string) => { router.push(`/creator/appeals/${appealId}`) } // 跳转到申诉次数管理页面 const handleGoToQuotaPage = () => { router.push('/creator/appeal-quota') } return (
{/* 顶部栏 */}

申诉中心

管理您的申诉记录和申诉额度

setSearchQuery(e.target.value)} className="bg-transparent text-sm text-text-primary placeholder-text-tertiary focus:outline-none w-32" />
{/* 申诉次数管理入口 */} {/* 申诉列表 */}

申诉记录 ({filteredAppeals.length})

{filteredAppeals.length > 0 ? ( filteredAppeals.map((appeal) => ( handleAppealClick(appeal.id)} /> )) ) : (

{searchQuery || filter !== 'all' ? '没有找到匹配的申诉记录' : '暂无申诉记录'}

{(searchQuery || filter !== 'all') && ( )}
)}
) }