/** * Logs Table Component * Displays logs in a table format similar to tasks */ import React, { useEffect } from 'react'; import { useContentPlan } from '../context/ContentPlanContext'; import { Log } from '../types'; const LogsTable: React.FC = () => { const { logs, logsLoading, logsError, fetchLogs, getString } = useContentPlan(); useEffect(() => { // Fetch logs on mount fetchLogs({ limit: 100 }); }, []); // Empty dependency array - only fetch on mount const getLevelBadgeClasses = (level: Log['level']): string => { switch (level) { case 'error': return 'text-red-600 bg-red-50'; case 'warning': return 'text-yellow-600 bg-yellow-50'; case 'info': return 'text-blue-600 bg-blue-50'; case 'debug': return 'text-gray-600 bg-gray-50'; default: return 'text-gray-600 bg-gray-50'; } }; const formatDate = (dateString: string): string => { try { const date = new Date(dateString); return date.toLocaleString(); } catch { return dateString; } }; const formatContext = (context: string | null | undefined): string => { if (!context) return ''; try { const parsed = JSON.parse(context); return JSON.stringify(parsed, null, 2); } catch { return context; } }; if (logsLoading && logs.length === 0) { return (
{getString('log', 'loading', 'Loading logs...')}
{getString('log', 'error_loading', 'Error loading logs:')}{' '} {logsError}
{getString('log', 'no_logs', 'No logs found')}
| {getString('log', 'date', 'Date')} | {getString('log', 'level', 'Level')} | {getString('log', 'event', 'Event')} | {getString('log', 'message', 'Message')} | {getString('log', 'tokens_spent', 'Tokens Spent')} | {getString('log', 'task_id', 'Task ID')} |
|---|---|---|---|---|---|
| {formatDate(log.created_at)} | {log.level.toUpperCase()} | {log.event || '-'} |
{log.message || '-'}
{log.context && (
{getString( 'log', 'show_context', 'Show context' )}
{formatContext(log.context)}
|
{log.tokens_spent !== null && log.tokens_spent !== undefined ? log.tokens_spent : '-'} | {log.task_id || '-'} |