'use client' import { useState, useEffect } from 'react' import { useRouter, useParams, useSearchParams } from 'next/navigation' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card' import { Button } from '@/components/ui/Button' import { SuccessTag, WarningTag, ErrorTag, PendingTag } from '@/components/ui/Tag' import { ReviewSteps, getReviewSteps } from '@/components/ui/ReviewSteps' import { ArrowLeft, Upload, Video, CheckCircle, XCircle, AlertTriangle, Clock, Loader2, RefreshCw, Play, Radio, Shield } from 'lucide-react' // 模拟任务数据 const mockTask = { id: 'task-001', projectName: 'XX品牌618推广', brandName: 'XX护肤品牌', deadline: '2026-06-18', videoStatus: 'pending_upload', // pending_upload | ai_reviewing | ai_result | agent_reviewing | agent_rejected | brand_reviewing | brand_passed | brand_rejected videoFile: null as string | null, aiResult: null as null | { score: number hardViolations: Array<{ type: string; content: string; timestamp: number; suggestion: string }> sentimentWarnings: Array<{ type: string; content: string; timestamp: number }> sellingPointsCovered: Array<{ point: string; covered: boolean; timestamp?: number }> }, agencyReview: null as null | { result: 'approved' | 'rejected' comment: string reviewer: string time: string }, brandReview: null as null | { result: 'approved' | 'rejected' comment: string reviewer: string time: string }, } // 根据状态获取模拟数据 function getTaskByStatus(status: string) { const task = { ...mockTask, videoStatus: status } if (status === 'ai_result' || status === 'agent_reviewing' || status === 'agent_rejected' || status === 'brand_reviewing' || status === 'brand_passed' || status === 'brand_rejected') { task.videoFile = '夏日护肤推广.mp4' task.aiResult = { score: 85, hardViolations: [ { type: '违禁词', content: '效果最好', timestamp: 15.5, suggestion: '建议替换为"效果显著"' }, ], sentimentWarnings: [ { type: '表情预警', content: '表情过于夸张', timestamp: 42.0 }, ], sellingPointsCovered: [ { point: 'SPF50+ PA++++', covered: true, timestamp: 25.0 }, { point: '轻薄质地', covered: true, timestamp: 38.0 }, { point: '不油腻', covered: true, timestamp: 52.0 }, ], } } if (status === 'agent_rejected') { task.agencyReview = { result: 'rejected', comment: '视频中有竞品Logo露出,请重新拍摄。', reviewer: '张经理', time: '2026-02-06 16:30', } } if (status === 'brand_reviewing' || status === 'brand_passed' || status === 'brand_rejected') { task.agencyReview = { result: 'approved', comment: '视频质量良好,建议通过。', reviewer: '张经理', time: '2026-02-06 16:30', } } if (status === 'brand_passed') { task.brandReview = { result: 'approved', comment: '视频通过终审,可以发布。', reviewer: '品牌方审核员', time: '2026-02-06 19:00', } } if (status === 'brand_rejected') { task.brandReview = { result: 'rejected', comment: '产品特写时间不足,请补拍。', reviewer: '品牌方审核员', time: '2026-02-06 19:00', } } return task } function formatTimestamp(seconds: number): string { const mins = Math.floor(seconds / 60) const secs = Math.floor(seconds % 60) return `${mins}:${secs.toString().padStart(2, '0')}` } function UploadSection({ onUpload }: { onUpload: () => void }) { const [file, setFile] = useState(null) const [uploadProgress, setUploadProgress] = useState(0) const [isUploading, setIsUploading] = useState(false) const handleFileChange = (e: React.ChangeEvent) => { const selectedFile = e.target.files?.[0] if (selectedFile) { setFile(selectedFile) } } const handleUpload = () => { setIsUploading(true) const timer = setInterval(() => { setUploadProgress(prev => { if (prev >= 100) { clearInterval(timer) setTimeout(onUpload, 500) return 100 } return prev + 10 }) }, 200) } return ( 上传视频
{file ? (
{isUploading && (

上传中 {uploadProgress}%

)}
) : ( )}
) } function AIReviewingSection() { const [progress, setProgress] = useState(0) const [currentStep, setCurrentStep] = useState('正在解析视频...') useEffect(() => { const steps = [ '正在解析视频...', '正在提取音频转文字...', '正在分析画面内容...', '正在检测违禁内容...', '正在分析卖点覆盖...', '正在生成审核报告...', ] let stepIndex = 0 const timer = setInterval(() => { setProgress(prev => { if (prev >= 100) { clearInterval(timer) return 100 } return prev + 5 }) }, 300) const stepTimer = setInterval(() => { stepIndex = (stepIndex + 1) % steps.length setCurrentStep(steps[stepIndex]) }, 1500) return () => { clearInterval(timer) clearInterval(stepTimer) } }, []) return (

AI 正在审核您的视频

请稍候,视频审核可能需要 3-5 分钟

{progress}%

{currentStep}

) } function AIResultSection({ task }: { task: ReturnType }) { if (!task.aiResult) return null return (
{/* AI 评分 */}
AI 综合评分 = 85 ? 'text-accent-green' : task.aiResult.score >= 70 ? 'text-yellow-400' : 'text-accent-coral'}`}> {task.aiResult.score}
{/* 硬性合规 */} {task.aiResult.hardViolations.length > 0 && ( 硬性合规 ({task.aiResult.hardViolations.length}) {task.aiResult.hardViolations.map((v, idx) => (
{v.type} {formatTimestamp(v.timestamp)}

「{v.content}」

{v.suggestion}

))}
)} {/* 舆情雷达 */} {task.aiResult.sentimentWarnings.length > 0 && ( 舆情雷达(仅提示) {task.aiResult.sentimentWarnings.map((w, idx) => (
{w.type} {formatTimestamp(w.timestamp)}

{w.content}

))}
)} {/* 卖点覆盖 */} 卖点覆盖 {task.aiResult.sellingPointsCovered.map((sp, idx) => (
{sp.covered ? ( ) : ( )} {sp.point}
{sp.covered && sp.timestamp && ( {formatTimestamp(sp.timestamp)} )}
))}
) } function ReviewFeedbackSection({ review, type }: { review: NonNullable; type: 'agency' | 'brand' }) { const isApproved = review.result === 'approved' const title = type === 'agency' ? '代理商审核意见' : '品牌方终审意见' return ( {isApproved ? ( ) : ( )} {title}
{review.reviewer} {isApproved ? 通过 : 驳回}

{review.comment}

{review.time}

) } function WaitingSection({ message }: { message: string }) { return (

{message}

请耐心等待,审核结果将通过消息通知您

) } function SuccessSection() { return (

🎉 视频审核通过!

恭喜您,视频已通过所有审核,可以发布了

) } export default function CreatorVideoPage() { const router = useRouter() const params = useParams() const searchParams = useSearchParams() const status = searchParams.get('status') || 'pending_upload' const [task, setTask] = useState(getTaskByStatus(status)) // 模拟状态切换 const simulateUpload = () => { setTask(getTaskByStatus('ai_reviewing')) setTimeout(() => { setTask(getTaskByStatus('ai_result')) }, 5000) } const handleResubmit = () => { setTask(getTaskByStatus('pending_upload')) } const getStatusDisplay = () => { switch (task.videoStatus) { case 'pending_upload': return '待上传视频' case 'ai_reviewing': return 'AI 审核中' case 'ai_result': return 'AI 审核完成' case 'agent_reviewing': return '代理商审核中' case 'agent_rejected': return '代理商驳回' case 'brand_reviewing': return '品牌方终审中' case 'brand_passed': return '审核通过' case 'brand_rejected': return '品牌方驳回' default: return '未知状态' } } return (
{/* 顶部导航 */}

{task.projectName}

视频阶段 · {getStatusDisplay()}

{/* 审核流程进度条 */} {/* 根据状态显示不同内容 */} {task.videoStatus === 'pending_upload' && ( )} {task.videoStatus === 'ai_reviewing' && ( )} {task.videoStatus === 'ai_result' && ( <> )} {task.videoStatus === 'agent_reviewing' && ( <> )} {task.videoStatus === 'agent_rejected' && task.agencyReview && ( <>
)} {task.videoStatus === 'brand_reviewing' && task.agencyReview && ( <> )} {task.videoStatus === 'brand_passed' && task.agencyReview && task.brandReview && ( <> )} {task.videoStatus === 'brand_rejected' && task.agencyReview && task.brandReview && ( <>
)}
) }