import { useState, useEffect } from 'react'; import { supabase } from '@/config'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; 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); useEffect(() => { const fetchLogs = async () => { setLoading(true); try { const { data, error } = await supabase .from('audit_logs') .select('*') .order('created_at', { ascending: false }) .limit(100); if (error) throw error; setLogs(data || []); } catch (error) { console.error('Failed to load audit logs:', error); } finally { setLoading(false); } }; fetchLogs(); }, []); 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) => ( {format(new Date(log.created_at), 'MMM d, h:mm a')}
{log.admin_username || 'Unknown'}
{log.admin_role?.replace('_', ' ')}
{log.action} {log.table_name} {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' && !log.changed_fields && ( Updated record )}
)) )}
); }