import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { invoke } from '@tauri-apps/api/core'; import { useProjectStore } from '../store/projectStore'; import { useUIStore } from '../store/uiStore'; import { ProjectCard } from './ProjectCard'; import { EmptyState } from './EmptyState'; import { LoadingSpinner } from './LoadingSpinner'; import { ErrorMessage } from './ErrorMessage'; import { DeleteConfirmDialog } from './DeleteConfirmDialog'; import { PageLoadingSkeleton } from './SkeletonLoader'; import { InteractiveButton } from './InteractiveButton'; import { Plus, Trash2 } from 'lucide-react'; /** * 项目列表组件 * 遵循 Tauri 开发规范的组件设计模式 */ export const ProjectList: React.FC = () => { const navigate = useNavigate(); const { projects, isLoading, error, loadProjects, deleteProject, setCurrentProject, clearError } = useProjectStore(); const { openCreateProjectModal, openEditProjectModal } = useUIStore(); const [isCleaningUp, setIsCleaningUp] = useState(false); const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [projectToDelete, setProjectToDelete] = useState(null); const [deleting, setDeleting] = useState(false); // 清理无效项目记录 const handleCleanupInvalidProjects = async () => { try { setIsCleaningUp(true); const result = await invoke('cleanup_invalid_projects'); alert(result); // 显示清理结果 // 重新加载项目列表 await loadProjects(); } catch (error) { console.error('清理失败:', error); alert('清理失败: ' + error); } finally { setIsCleaningUp(false); } }; // 组件挂载时加载项目 useEffect(() => { loadProjects(); }, [loadProjects]); // 处理项目打开 const handleProjectOpen = (project: any) => { setCurrentProject(project); // 导航到项目详情页面 navigate(`/project/${project.id}`); }; // 处理项目编辑 const handleProjectEdit = (project: any) => { openEditProjectModal(project); }; // 处理项目删除 const handleProjectDelete = (id: string) => { setProjectToDelete(id); setShowDeleteConfirm(true); }; // 确认删除项目 const confirmDeleteProject = async () => { if (!projectToDelete) return; try { setDeleting(true); await deleteProject(projectToDelete); setShowDeleteConfirm(false); setProjectToDelete(null); } catch (error) { console.error('删除项目失败:', error); } finally { setDeleting(false); } }; // 取消删除 const cancelDeleteProject = () => { setShowDeleteConfirm(false); setProjectToDelete(null); }; // 错误状态 if (error) { return (
{/* 页面头部 - 错误状态 */}

我的项目

加载项目时遇到问题

); } // 加载状态 - 使用美观的骨架屏 if (isLoading && projects.length === 0) { return (
); } return (
{/* 页面头部 - 增强设计 */}

我的项目

管理您的视频项目,开始创作之旅

} ripple={true} > {isCleaningUp ? '清理中...' : '清理'} } ripple={true} > 新建项目
{/* 项目统计信息 */} {projects.length > 0 && (
{projects.length}
总项目数
{projects.filter(p => new Date(p.updated_at) > new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)).length}
本周活跃
{projects.filter(p => new Date(p.created_at) > new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)).length}
本月新建
)} {/* 项目内容区域 */} {projects.length === 0 ? (
) : (
{/* 优化的项目网格 - 更好的响应式布局 */}
{projects.map((project, index) => (
))}
)} {/* 加载遮罩 - 改进设计 */} {isLoading && projects.length > 0 && (
)}
); };