"use client" import { useState } from "react" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Search, Plus, MoreHorizontal, Edit, Trash2, Eye, Star, Heart, TrendingUp, Bot, CheckCircle, Clock, MessageSquare, ExternalLink, AlertTriangle, X, Check, TrendingDown, Link, Zap, Brain, Mic, ImageIcon, FileText, BarChart3, Camera, Music, Video, Code, Database, Globe, Smartphone, Monitor, Headphones, Palette, Calculator, Shield, Settings, Lightbulb, } from "lucide-react" // Add available icons array after imports const availableIcons = [ { name: "Bot", icon: Bot, color: "from-blue-500 to-purple-500" }, { name: "Brain", icon: Brain, color: "from-purple-500 to-pink-500" }, { name: "Zap", icon: Zap, color: "from-yellow-500 to-orange-500" }, { name: "Mic", icon: Mic, color: "from-green-500 to-teal-500" }, { name: "ImageIcon", icon: ImageIcon, color: "from-pink-500 to-rose-500" }, { name: "FileText", icon: FileText, color: "from-blue-500 to-cyan-500" }, { name: "BarChart3", icon: BarChart3, color: "from-emerald-500 to-green-500" }, { name: "Camera", icon: Camera, color: "from-indigo-500 to-purple-500" }, { name: "Music", icon: Music, color: "from-violet-500 to-purple-500" }, { name: "Video", icon: Video, color: "from-red-500 to-pink-500" }, { name: "Code", icon: Code, color: "from-gray-500 to-slate-500" }, { name: "Database", icon: Database, color: "from-cyan-500 to-blue-500" }, { name: "Globe", icon: Globe, color: "from-blue-500 to-indigo-500" }, { name: "Smartphone", icon: Smartphone, color: "from-slate-500 to-gray-500" }, { name: "Monitor", icon: Monitor, color: "from-gray-600 to-slate-600" }, { name: "Headphones", icon: Headphones, color: "from-purple-500 to-violet-500" }, { name: "Palette", icon: Palette, color: "from-pink-500 to-purple-500" }, { name: "Calculator", icon: Calculator, color: "from-orange-500 to-red-500" }, { name: "Shield", icon: Shield, color: "from-green-500 to-emerald-500" }, { name: "Settings", icon: Settings, color: "from-gray-500 to-zinc-500" }, { name: "Lightbulb", icon: Lightbulb, color: "from-yellow-500 to-amber-500" }, ] // App data - empty for production const mockApps: any[] = [] export function AppManagement() { const [apps, setApps] = useState(mockApps) const [searchTerm, setSearchTerm] = useState("") const [selectedType, setSelectedType] = useState("all") const [selectedStatus, setSelectedStatus] = useState("all") const [selectedApp, setSelectedApp] = useState(null) const [showAppDetail, setShowAppDetail] = useState(false) const [showAddApp, setShowAddApp] = useState(false) const [showEditApp, setShowEditApp] = useState(false) const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) const [showApprovalDialog, setShowApprovalDialog] = useState(false) const [approvalAction, setApprovalAction] = useState<"approve" | "reject">("approve") const [approvalReason, setApprovalReason] = useState("") const [newApp, setNewApp] = useState({ name: "", type: "文字處理", department: "HQBU", creator: "", description: "", appUrl: "", icon: "Bot", iconColor: "from-blue-500 to-purple-500", }) const filteredApps = apps.filter((app) => { const matchesSearch = app.name.toLowerCase().includes(searchTerm.toLowerCase()) || app.creator.toLowerCase().includes(searchTerm.toLowerCase()) const matchesType = selectedType === "all" || app.type === selectedType const matchesStatus = selectedStatus === "all" || app.status === selectedStatus return matchesSearch && matchesType && matchesStatus }) const handleViewApp = (app: any) => { setSelectedApp(app) setShowAppDetail(true) } const handleEditApp = (app: any) => { setSelectedApp(app) setNewApp({ name: app.name, type: app.type, department: app.department, creator: app.creator, description: app.description, appUrl: app.appUrl, icon: app.icon || "Bot", iconColor: app.iconColor || "from-blue-500 to-purple-500", }) setShowEditApp(true) } const handleDeleteApp = (app: any) => { setSelectedApp(app) setShowDeleteConfirm(true) } const confirmDeleteApp = () => { if (selectedApp) { setApps(apps.filter((app) => app.id !== selectedApp.id)) setShowDeleteConfirm(false) setSelectedApp(null) } } const handleToggleAppStatus = (appId: string) => { setApps( apps.map((app) => app.id === appId ? { ...app, status: app.status === "published" ? "draft" : "published", } : app, ), ) } const handleApprovalAction = (app: any, action: "approve" | "reject") => { setSelectedApp(app) setApprovalAction(action) setApprovalReason("") setShowApprovalDialog(true) } const confirmApproval = () => { if (selectedApp) { setApps( apps.map((app) => app.id === selectedApp.id ? { ...app, status: approvalAction === "approve" ? "published" : "rejected", } : app, ), ) setShowApprovalDialog(false) setSelectedApp(null) setApprovalReason("") } } const handleAddApp = () => { const app = { id: Date.now().toString(), ...newApp, status: "pending", createdAt: new Date().toISOString().split("T")[0], views: 0, likes: 0, rating: 0, reviews: 0, } setApps([...apps, app]) setNewApp({ name: "", type: "文字處理", department: "HQBU", creator: "", description: "", appUrl: "", icon: "Bot", iconColor: "from-blue-500 to-purple-500", }) setShowAddApp(false) } const handleUpdateApp = () => { if (selectedApp) { setApps( apps.map((app) => app.id === selectedApp.id ? { ...app, ...newApp, } : app, ), ) setShowEditApp(false) setSelectedApp(null) } } const getStatusColor = (status: string) => { switch (status) { case "published": return "bg-green-100 text-green-800 border-green-200" case "pending": return "bg-yellow-100 text-yellow-800 border-yellow-200" case "draft": return "bg-gray-100 text-gray-800 border-gray-200" case "rejected": return "bg-red-100 text-red-800 border-red-200" default: return "bg-gray-100 text-gray-800 border-gray-200" } } const getTypeColor = (type: string) => { const colors = { 文字處理: "bg-blue-100 text-blue-800 border-blue-200", 圖像生成: "bg-purple-100 text-purple-800 border-purple-200", 語音辨識: "bg-green-100 text-green-800 border-green-200", 推薦系統: "bg-orange-100 text-orange-800 border-orange-200", } return colors[type as keyof typeof colors] || "bg-gray-100 text-gray-800 border-gray-200" } const getStatusText = (status: string) => { switch (status) { case "published": return "已發布" case "pending": return "待審核" case "draft": return "草稿" case "rejected": return "已拒絕" default: return status } } return (
{/* Header */}

應用管理

管理平台上的所有 AI 應用

{/* Stats Cards */}

總應用數

{apps.length}

已發布

{apps.filter((a) => a.status === "published").length}

待審核

{apps.filter((a) => a.status === "pending").length}

{/* Filters */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* Apps Table */} 應用列表 ({filteredApps.length}) 管理所有 AI 應用 應用名稱 類型 創建者 狀態 統計 評分 創建日期 操作 {filteredApps.map((app) => (
{(() => { const IconComponent = availableIcons.find((icon) => icon.name === app.icon)?.icon || Bot return })()}

{app.name}

{app.appUrl && ( )}
{app.type}

{app.creator}

{app.department}

{getStatusText(app.status)}
{app.views}
{app.likes}
{app.rating} ({app.reviews})
{app.createdAt} handleViewApp(app)}> 查看詳情 handleEditApp(app)}> 編輯應用 {app.appUrl && ( window.open(app.appUrl, "_blank")}> 開啟應用 )} {app.status === "pending" && ( <> handleApprovalAction(app, "approve")}> 批准發布 handleApprovalAction(app, "reject")}> 拒絕申請 )} {app.status !== "pending" && ( handleToggleAppStatus(app.id)}> {app.status === "published" ? ( <> 下架應用 ) : ( <> 發布應用 )} )} handleDeleteApp(app)}> 刪除應用
))}
{/* Add App Dialog */} 新增 AI 應用 創建一個新的 AI 應用
setNewApp({ ...newApp, name: e.target.value })} placeholder="輸入應用名稱" />
setNewApp({ ...newApp, creator: e.target.value })} placeholder="輸入創建者姓名" />
{availableIcons.map((iconOption) => { const IconComponent = iconOption.icon return ( ) })}

選擇一個代表您應用的圖示

setNewApp({ ...newApp, appUrl: e.target.value })} placeholder="https://your-app.example.com" className="pl-10" />

用戶點擊應用時將跳轉到此連結