"use client" import { useState, useCallback } from "react" import { Sidebar } from "@/components/sidebar" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Progress } from "@/components/ui/progress" import { Badge } from "@/components/ui/badge" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Upload, FileText, Video, LinkIcon, X, CheckCircle, AlertCircle, Play, ExternalLink } from "lucide-react" import { useToast } from "@/hooks/use-toast" import { useDropzone } from "react-dropzone" interface UploadedFile { id: string name: string size: number type: string status: "uploading" | "completed" | "error" progress: number url?: string } export default function UploadPage() { const [files, setFiles] = useState([]) const [websiteUrl, setWebsiteUrl] = useState("") const [projectTitle, setProjectTitle] = useState("") const [projectDescription, setProjectDescription] = useState("") const [isAnalyzing, setIsAnalyzing] = useState(false) const { toast } = useToast() const onDrop = useCallback((acceptedFiles: File[]) => { const newFiles: UploadedFile[] = acceptedFiles.map((file) => ({ id: Date.now().toString() + Math.random().toString(36).substr(2, 9), name: file.name, size: file.size, type: file.type, status: "uploading", progress: 0, })) setFiles((prev) => [...prev, ...newFiles]) // 模擬上傳進度 newFiles.forEach((file) => { simulateUpload(file.id) }) }, []) const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { "application/vnd.ms-powerpoint": [".ppt"], "application/vnd.openxmlformats-officedocument.presentationml.presentation": [".pptx"], "video/*": [".mp4", ".avi", ".mov", ".wmv", ".flv", ".webm"], "application/pdf": [".pdf"], }, maxSize: 100 * 1024 * 1024, // 100MB }) const simulateUpload = (fileId: string) => { const interval = setInterval(() => { setFiles((prev) => prev.map((file) => { if (file.id === fileId) { const newProgress = Math.min(file.progress + Math.random() * 30, 100) const status = newProgress === 100 ? "completed" : "uploading" return { ...file, progress: newProgress, status } } return file }), ) }, 500) setTimeout(() => { clearInterval(interval) setFiles((prev) => prev.map((file) => (file.id === fileId ? { ...file, progress: 100, status: "completed" } : file)), ) }, 3000) } const removeFile = (fileId: string) => { setFiles((prev) => prev.filter((file) => file.id !== fileId)) } const formatFileSize = (bytes: number) => { if (bytes === 0) return "0 Bytes" const k = 1024 const sizes = ["Bytes", "KB", "MB", "GB"] const i = Math.floor(Math.log(bytes) / Math.log(k)) return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i] } const getFileIcon = (type: string) => { if (type.includes("presentation") || type.includes("powerpoint")) { return } if (type.includes("video")) { return