/** * Recycle Bin Page * Cyberpunk Terminal Aesthetic */ import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog"; import { Search, GitBranch, Calendar, Users, ExternalLink, Trash2, RotateCcw, AlertTriangle, Inbox, } from "lucide-react"; import { api } from "@/shared/config/database"; import type { Project } from "@/shared/types"; import { toast } from "sonner"; import { isRepositoryProject, getSourceTypeBadge } from "@/shared/utils/projectUtils"; export default function RecycleBin() { const [deletedProjects, setDeletedProjects] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); const [showRestoreDialog, setShowRestoreDialog] = useState(false); const [showPermanentDeleteDialog, setShowPermanentDeleteDialog] = useState(false); const [selectedProject, setSelectedProject] = useState(null); useEffect(() => { loadDeletedProjects(); }, []); const loadDeletedProjects = async () => { try { setLoading(true); const data = await api.getDeletedProjects(); setDeletedProjects(data); } catch (error) { console.error('Failed to load deleted projects:', error); toast.error("加载已删除项目失败"); } finally { setLoading(false); } }; const handleRestoreClick = (project: Project) => { setSelectedProject(project); setShowRestoreDialog(true); }; const handlePermanentDeleteClick = (project: Project) => { setSelectedProject(project); setShowPermanentDeleteDialog(true); }; const handleConfirmRestore = async () => { if (!selectedProject) return; try { await api.restoreProject(selectedProject.id); toast.success(`项目 "${selectedProject.name}" 已恢复`); setShowRestoreDialog(false); setSelectedProject(null); loadDeletedProjects(); } catch (error) { console.error('Failed to restore project:', error); toast.error("恢复项目失败"); } }; const handleConfirmPermanentDelete = async () => { if (!selectedProject) return; try { await api.permanentlyDeleteProject(selectedProject.id); toast.success(`项目 "${selectedProject.name}" 已永久删除`); setShowPermanentDeleteDialog(false); setSelectedProject(null); loadDeletedProjects(); } catch (error) { console.error('Failed to permanently delete project:', error); toast.error("永久删除项目失败"); } }; const filteredProjects = deletedProjects.filter(project => project.name.toLowerCase().includes(searchTerm.toLowerCase()) || project.description?.toLowerCase().includes(searchTerm.toLowerCase()) ); const getRepositoryIcon = (type?: string) => { switch (type) { case 'github': return '🐙'; case 'gitlab': return '🦊'; case 'gitea': return '🍵'; default: return '📁'; } }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('zh-CN'); }; if (loading) { return (

加载中...

); } return (
{/* Grid background */}
{/* Search Bar */}

回收站

{deletedProjects.length} 个项目
setSearchTerm(e.target.value)} className="!pl-10 cyber-input h-10" />
{/* Projects Grid */}
{filteredProjects.length > 0 ? ( filteredProjects.map((project) => (
{/* Project Header */}
{getRepositoryIcon(project.repository_type)}

{project.name}

{project.description && (

{project.description}

)}
已删除 {getSourceTypeBadge(project.source_type)}
{/* Project Info */}
{isRepositoryProject(project) && project.repository_url && ( )}
删除于 {formatDate(project.updated_at)}
{project.owner?.full_name || '未知'}
{/* Programming Languages */} {project.programming_languages && (
{JSON.parse(project.programming_languages).slice(0, 4).map((lang: string) => ( {lang} ))} {JSON.parse(project.programming_languages).length > 4 && ( +{JSON.parse(project.programming_languages).length - 4} )}
)} {/* Action Buttons */}
)) ) : (

{searchTerm ? '未找到匹配的项目' : '回收站为空'}

{searchTerm ? '尝试调整搜索条件' : '回收站中没有已删除的项目'}

)}
{/* Restore Dialog */} 确认恢复项目 您确定要恢复项目 "{selectedProject?.name}" 吗?

恢复后,该项目将重新出现在项目列表中,您可以继续使用该项目的所有功能。
取消 确认恢复
{/* Permanent Delete Dialog */} 警告:永久删除项目 您确定要永久删除项目 "{selectedProject?.name}" 吗?

此操作不可撤销!

  • 项目数据将被永久删除
  • 相关的审计任务可能会受影响
  • 无法通过任何方式恢复
取消 确认永久删除
); }