import React, { useState, useEffect } from 'react';
import { AuditLogEntry, AuditLogFilters } from '../types/audit';
interface AuditLogTableProps {
initialFilters: AuditLogFilters;
}
const PAGE_SIZE = 50;
export function AuditLogTable({ initialFilters }: AuditLogTableProps) {
const [filters, setFilters] = useState<AuditLogFilters>(initialFilters);
const [page, setPage] = useState(1);
const [entries, setEntries] = useState<AuditLogEntry[]>([]);
const [totalPages, setTotalPages] = useState(1);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
let cancelled = false;
setLoading(true);
setError(null);
const params = new URLSearchParams();
params.set('page', String(page));
params.set('pageSize', String(PAGE_SIZE));
if (filters.actor) params.set('actor', filters.actor);
if (filters.action) params.set('action', filters.action);
if (filters.fromDate) params.set('fromDate', filters.fromDate);
if (filters.toDate) params.set('toDate', filters.toDate);
fetch(`/api/audit-logs?${params.toString()}`)
.then((res) => {
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
return res.json();
})
.then((data) => {
if (cancelled) return;
setEntries(data.entries);
setTotalPages(data.totalPages);
setLoading(false);
})
.catch((err) => {
if (cancelled) return;
setError(err.message);
setLoading(false);
});
return () => {
cancelled = true;
};
}, [page, filters]);
const handleFilterChange = (field: keyof AuditLogFilters, value: string) => {
setFilters((prev) => ({ ...prev, [field]: value }));
setPage(1);
};
const handlePageChange = (newPage: number) => {
if (newPage < 1 || newPage > totalPages) return;
setPage(newPage);
};
if (error) {
return (
<div className="audit-log