'use client'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Skeleton } from '@/components/ui/skeleton'; import { ScrollArea } from '@/components/ui/scroll-area'; import { UserPlus, FolderPlus, CheckSquare, Zap, Settings, AlertCircle, } from 'lucide-react'; interface ActivityItem { id: string; type: 'user_created' | 'project_created' | 'task_completed' | 'generation_started' | 'system' | 'error'; title: string; description?: string; timestamp: string; user?: { id: string; username: string; }; } interface RecentActivityProps { activities?: ActivityItem[]; isLoading: boolean; } const activityIcons = { user_created: { icon: UserPlus, color: 'text-blue-500', bgColor: 'bg-blue-500/10' }, project_created: { icon: FolderPlus, color: 'text-emerald-500', bgColor: 'bg-emerald-500/10' }, task_completed: { icon: CheckSquare, color: 'text-amber-500', bgColor: 'bg-amber-500/10' }, generation_started: { icon: Zap, color: 'text-purple-500', bgColor: 'bg-purple-500/10' }, system: { icon: Settings, color: 'text-gray-500', bgColor: 'bg-gray-500/10' }, error: { icon: AlertCircle, color: 'text-red-500', bgColor: 'bg-red-500/10' }, }; function formatRelativeTime(timestamp: string): string { const date = new Date(timestamp); const now = new Date(); const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000); if (diffInSeconds < 60) { return '刚刚'; } else if (diffInSeconds < 3600) { const minutes = Math.floor(diffInSeconds / 60); return `${minutes} 分钟前`; } else if (diffInSeconds < 86400) { const hours = Math.floor(diffInSeconds / 3600); return `${hours} 小时前`; } else if (diffInSeconds < 604800) { const days = Math.floor(diffInSeconds / 86400); return `${days} 天前`; } else { return date.toLocaleDateString('zh-CN', { month: 'short', day: 'numeric', }); } } export function RecentActivity({ activities, isLoading }: RecentActivityProps) { return ( 最近活动 {isLoading ? (
{Array.from({ length: 5 }).map((_, i) => (
))}
) : activities && activities.length > 0 ? (
{activities.map((activity) => { const { icon: Icon, color, bgColor } = activityIcons[activity.type]; return (

{activity.title}

{activity.description && (

{activity.description}

)}
{formatRelativeTime(activity.timestamp)} {activity.user && ( <> · {activity.user.username} )}
); })}
) : (

暂无活动记录

)}
); }