import { useState } from 'react' import { useQuery } from '@tanstack/react-query' import { apiFetch } from '@/lib/http' import { AuditLogEntry } from '@/types/settings' import { LoadingSkeleton } from '../common/LoadingSkeleton' const ACTION_ICONS: Record = { grant_channel: '✅', revoke_channel: '❌', change_role: '👤', invite_user: '📨', deactivate_user: '🚫', query_executed: '🔍', document_accessed: '📄', bulk_user_import: '📥', } const ACTION_COLORS: Record = { grant_channel: 'text-green-600 dark:text-green-400', revoke_channel: 'text-red-600 dark:text-red-400', change_role: 'text-blue-600 dark:text-blue-400', invite_user: 'text-purple-600 dark:text-purple-400', deactivate_user: 'text-red-600 dark:text-red-400', query_executed: 'text-stone-600 dark:text-stone-400', document_accessed: 'text-stone-600 dark:text-stone-400', bulk_user_import: 'text-green-600 dark:text-green-400', } export function AdminAuditLog() { const [filterAction, setFilterAction] = useState('all') const [filterType, setFilterType] = useState('all') // Fetch audit log const { data: auditEntries, isLoading, refetch } = useQuery({ queryKey: ['audit-log', filterAction, filterType], queryFn: async () => { // TODO: GET /api/audit-log?action=X&target_type=Y return [] as AuditLogEntry[] }, }) const allActions = [ 'grant_channel', 'revoke_channel', 'change_role', 'invite_user', 'deactivate_user', 'query_executed', 'document_accessed', 'bulk_user_import', ] const allTargetTypes = ['user', 'channel', 'team', 'query', 'document'] const handleExportCSV = () => { // TODO: GET /api/audit-log/export?format=csv console.log('Export audit log as CSV') } return (
{/* Filters & Export */}
{/* Audit Log Entries */}

Recent Activity

{isLoading ? ( ) : auditEntries && auditEntries.length > 0 ? (
{auditEntries.map((entry) => (
{ACTION_ICONS[entry.action] || '•'}

{entry.action.replace(/_/g, ' ')}

{entry.actor_name && `by ${entry.actor_name}`} {entry.actor_name && entry.target_name && ' • '} {entry.target_name && `on ${entry.target_name}`}

{new Date(entry.created_at).toLocaleDateString()} {new Date(entry.created_at).toLocaleTimeString()}
{/* Metadata if available */} {Object.keys(entry.metadata).length > 0 && (
Details
                        {JSON.stringify(entry.metadata, null, 2)}
                      
)}
))}
) : (

No audit log entries yet

Actions will appear here as users and admins interact with the system

)}
{/* Legend */}

What's tracked?

  • User actions: invite, deactivate, role changes
  • Channel access: grants and revokes
  • Bulk operations: CSV imports, bulk role updates
  • Query activity: who searched what, when
  • Document access: restricted document views (compliance)
) }