import React from 'react'; import { Project } from '../types/project'; import { formatDistanceToNow } from 'date-fns'; import { zhCN } from 'date-fns/locale'; import { Folder, MoreVertical, Edit3, Trash2, ExternalLink, Calendar, MapPin } from 'lucide-react'; interface ProjectCardProps { project: Project; onOpen: (project: Project) => void; onEdit: (project: Project) => void; onDelete: (id: string) => void; } /** * 项目卡片组件 * 遵循简洁大方的设计风格 */ export const ProjectCard: React.FC = ({ project, onOpen, onEdit, onDelete }) => { const [showMenu, setShowMenu] = React.useState(false); const menuRef = React.useRef(null); // 点击外部关闭菜单 React.useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(event.target as Node)) { setShowMenu(false); } }; if (showMenu) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [showMenu]); // 格式化时间 const formatTime = (dateString: string) => { try { const date = new Date(dateString); return formatDistanceToNow(date, { addSuffix: true, locale: zhCN }); } catch { return '未知时间'; } }; // 获取项目目录名 const getDirectoryName = (path: string) => { const parts = path.split(/[/\\]/); return parts[parts.length - 1] || path; }; return (
{showMenu && (
)}
onOpen(project)}>

{project.name}

{project.description && (

{project.description}

)}
{getDirectoryName(project.path)}
{formatTime(project.updated_at)}
); };