swarm / companies/starter/work/project/src/components/AuditLogViewer.tsx

raw file 2050 bytes
import React, { useState, useEffect, useCallback } from 'react';
import { AuditLogEntry, AuditLogFilter, AuditLogPage } from '../types/audit';
import { fetchAuditLogs } from '../api/audit';
import Pagination from './Pagination';
import EmptyState from './EmptyState';
import LoadingSpinner from './LoadingSpinner';
import FilterBar from './FilterBar';

interface AuditLogViewerProps {
  initialFilters?: AuditLogFilter;
}

const PAGE_SIZE = 25;

export default function AuditLogViewer({ initialFilters }: AuditLogViewerProps) {
  const [filters, setFilters] = useState<AuditLogFilter>(
    initialFilters ?? { user: '', action: '', dateFrom: '', dateTo: '' }
  );
  const [page, setPage] = useState(1);
  const [data, setData] = useState<AuditLogPage | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  const loadPage = useCallback(async () => {
    setLoading(true);
    setError(null);
    try {
      const result = await fetchAuditLogs({
        user: filters.user || undefined,
        action: filters.action || undefined,
        dateFrom: filters.dateFrom || undefined,
        dateTo: filters.dateTo || undefined,
        page,
        pageSize: PAGE_SIZE,
      });
      setData(result);
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Failed to load audit logs');
      setData(null);
    } finally {
      setLoading(false);
    }
  }, [filters, page]);

  useEffect(() => {
    loadPage();
  }, [loadPage]);

  const handleFilterChange = (updated: AuditLogFilter) => {
    setFilters(updated);
    setPage(1);
  };

  const handlePageChange = (newPage: number) => {
    setPage(newPage);
  };

  if (loading) {
    return (
      <div className="audit-log-viewer" role="status" aria-live="polite">
        <FilterBar filters={filters} onChange={handleFilterChange} disabled={true} />
        <LoadingSpinner label="Loading audit log…" />
      </div>
    );
  }

  if (error) {
    return (
      <div className="audit-log-viewer" role="