import { useEffect, useMemo, useState } from 'react'; import { useTranslation } from '../../contexts/LanguageContext'; import { useSidebar } from '../../contexts/SidebarContext'; import TabsScroller from '../../components/TabsScroller'; import { auditAPI } from '../../api/client'; import type { AuditLogItem } from '../../api/client'; import '../../styles/AdminAudit.css'; export default function AuditLogs() { const { t } = useTranslation(); const { toggleMobileMenu } = useSidebar(); const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [page, setPage] = useState(1); const pageSize = 50; const [username, setUsername] = useState(''); const [action, setAction] = useState(''); const [resourceType, setResourceType] = useState(''); const [status, setStatus] = useState(''); const params = useMemo(() => { const p: Record = { page, page_size: pageSize }; if (username.trim()) p.username = username.trim(); if (action.trim()) p.action = action.trim(); if (resourceType.trim()) p.resource_type = resourceType.trim(); if (status.trim()) p.status = status.trim(); return p; }, [page, pageSize, username, action, resourceType, status]); const load = async () => { setLoading(true); setError(''); try { const data = await auditAPI.list(params); setItems(data.items || []); } catch (err: any) { setError(err?.response?.data?.detail || t.common.error); } finally { setLoading(false); } }; useEffect(() => { load(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [params]); const resetFilters = () => { setUsername(''); setAction(''); setResourceType(''); setStatus(''); setPage(1); }; return (
{t.auditPage.title}
{ setUsername(e.target.value); setPage(1); }} /> { setAction(e.target.value); setPage(1); }} /> { setResourceType(e.target.value); setPage(1); }} />
{error &&
{error}
} {loading ? (
{t.common.loading}
) : items.length === 0 ? (
{t.auditPage.empty}
) : (
{items.map((log) => ( ))}
{t.auditPage.time} {t.auditPage.user} {t.auditPage.action} {t.auditPage.resource} {t.auditPage.status} {t.auditPage.ip}
{new Date(log.created_at).toLocaleString()} {log.username || '—'} {log.action} {log.resource_type || '—'}{log.resource_id ? `:${log.resource_id}` : ''} {log.status} {log.ip_address || '—'}
)}
{t.auditPage.page} {page}
); }