import { useState, useEffect, useCallback } from 'react'; import { adminData } from '@/lib/adminApi'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { PaginationControls } from '@/components/ui/pagination'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { format } from 'date-fns'; interface AuditLog { id: string; admin_user_id: string; admin_username: string | null; admin_role: string; action: string; table_name: string; old_values: Record | null; new_values: Record | null; changed_fields: string[] | null; created_at: string; } const actionColors: Record = { INSERT: 'bg-green-500', UPDATE: 'bg-blue-500', DELETE: 'bg-red-500', }; export function AuditLogsPage() { const [logs, setLogs] = useState([]); const [loading, setLoading] = useState(true); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(50); const [totalCount, setTotalCount] = useState(0); const fetchLogs = useCallback(async () => { setLoading(true); try { const from = (page - 1) * pageSize; const to = from + pageSize - 1; const { data, error, count } = await adminData .from('audit_logs') .select('*', { count: 'exact' }) .order('created_at', { ascending: false }) .range(from, to); if (error) throw error; setLogs(data || []); setTotalCount(count || 0); } catch (error) { console.error('Failed to load audit logs:', error); } finally { setLoading(false); } }, [page, pageSize]); useEffect(() => { fetchLogs(); }, [fetchLogs]); useEffect(() => { const totalPages = Math.max(1, Math.ceil(totalCount / pageSize)); if (page > totalPages) { setPage(totalPages); } }, [page, pageSize, totalCount]); if (loading) { return (
); } return (
{/* Header */}

Audit Logs

Track all administrative actions and data changes

{/* Logs Table */}
Time Admin Action Table Changes {logs.length === 0 ? ( No audit logs found ) : ( logs.map((log) => { const actionBadge = ( {log.action} ); const changesContent = log.action === 'DELETE' && log.old_values ? ( Deleted: {JSON.stringify(log.old_values).substring(0, 100)}... ) : log.action === 'INSERT' && log.new_values ? ( Created: {JSON.stringify(log.new_values).substring(0, 100)}... ) : log.action === 'UPDATE' && log.changed_fields ? ( Changed: {log.changed_fields.join(', ')} ) : log.action === 'UPDATE' ? ( Updated record ) : null; return ( {format(new Date(log.created_at), 'MMM d, h:mm a')}
{log.admin_username || 'Unknown'} {log.admin_role?.replace('_', ' ')}
{actionBadge} {log.table_name}
{changesContent &&
{changesContent}
}
{log.admin_username || 'Unknown'}
{log.admin_role?.replace('_', ' ')}
{actionBadge} {log.table_name} {changesContent}
); }) )}
{logs.length > 0 && ( { setPage(1); setPageSize(size); }} /> )}
); }