/** * BoostMedia AI Content Generator Admin - RecentActivity Component * * @package BoostMedia_AI * @license GPL-2.0-or-later */ import { RefreshCw, Sparkles, FileCheck, AlertCircle, Search } from 'lucide-react' import { Card, CardHeader, CardTitle, CardContent, Badge, EmptyState } from '../common' import { useLogs } from '../../hooks' import { t, tf } from '../../lib/i18n' import type { LogActionType, LogStatus } from '../../types' import type { ReactNode } from 'react' const actionIcons: Record = { scan: , analyze: , generate: , publish: , } const actionKeys: Record = { scan: 'Scanning', analyze: 'Analysis', generate: 'Content Creation', publish: 'Publishing', } const statusVariants: Record = { success: 'success', error: 'error', warning: 'warning', } const statusKeys: Record = { success: 'Succeeded', error: 'Failed', warning: 'Warning', } function formatTimeAgo(dateString: string): string { const date = new Date(dateString) const now = new Date() const diffMs = now.getTime() - date.getTime() const diffMins = Math.floor(diffMs / 60000) const diffHours = Math.floor(diffMs / 3600000) const diffDays = Math.floor(diffMs / 86400000) if (diffMins < 1) return t('just now') if (diffMins < 60) return tf('%d minutes ago', diffMins) if (diffHours < 24) return tf('%d hours ago', diffHours) return tf('%d days ago', diffDays) } export function RecentActivity() { const { logs, loading, error } = useLogs({ limit: 5 }) if (loading) { return ( {t('Recent Activity')}
{[1, 2, 3].map((i) => (
))}
) } return ( {t('Recent Activity')} {error ? (
{t('Failed to load recent activity')}
) : logs.length === 0 ? ( ) : (
{logs.map((log) => (
{/* Icon */}
{log.status === 'error' ? ( ) : ( actionIcons[log.action_type] || actionIcons.scan )}
{/* Content */}
{t(actionKeys[log.action_type] || 'Activity')} {log.post_type && ( {log.post_type} )} {t(statusKeys[log.status] || 'Activity')}
{/* Details */}
{formatTimeAgo(log.created_at)} {log.duration_ms > 0 && ( )} {log.duration_ms > 0 && ( {(log.duration_ms / 1000).toFixed(1)} {t('seconds')} )} {log.tokens_used > 0 && ( <> {log.tokens_used.toLocaleString()} tokens )}
{/* Error Message */} {log.error_message && (

{log.error_message}

)}
))}
)}
) }