"use client"; import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { ChevronLeft, ChevronRight, RefreshCw } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/Card"; import { Table, TableHead, TableBody, TableRow, Th, Td, EmptyState } from "@/components/ui/Table"; import { Badge } from "@/components/ui/Badge"; import { Button } from "@/components/ui/Button"; import { formatDateTime } from "@/lib/utils"; import api from "@/lib/api"; import type { AuditLog, PaginatedResponse } from "@/types"; const ENTITY_TYPES = ["", "CLIENT", "INVOICE", "PAYMENT", "TICKET", "PLAN", "AREA", "USER", "SUBSCRIPTION", "LEAD", "REMITTANCE", "JOURNAL_ENTRY"]; const ACTION_TYPES = ["", "CREATE", "UPDATE", "DELETE", "LOGIN", "LOGOUT", "ACTIVATE", "DEACTIVATE", "VOID", "RESOLVE", "CLOSE"]; export default function AuditLogPage() { const [page, setPage] = useState(1); const [dateFrom, setDateFrom] = useState(""); const [dateTo, setDateTo] = useState(""); const [entityType, setEntityType] = useState(""); const [actionType, setActionType] = useState(""); const { data, isLoading, refetch } = useQuery>({ queryKey: ["audit-logs", page, dateFrom, dateTo, entityType, actionType], queryFn: async () => { const params = new URLSearchParams({ page: String(page), limit: "50" }); if (dateFrom) params.set("dateFrom", new Date(dateFrom).toISOString()); if (dateTo) { const end = new Date(dateTo); end.setHours(23, 59, 59, 999); params.set("dateTo", end.toISOString()); } if (entityType) params.set("entityType", entityType); if (actionType) params.set("action", actionType); const res = await api.get>(`/api/v1/audit-logs?${params}`); return res.data; }, }); const logs = data?.data ?? []; const meta = data?.meta; const clearFilters = () => { setDateFrom(""); setDateTo(""); setEntityType(""); setActionType(""); setPage(1); }; const hasFilters = dateFrom || dateTo || entityType || actionType; return (

Audit Log

Track all system activity

{/* Filters */}
{ setDateFrom(e.target.value); setPage(1); }} className="border rounded-lg px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-40" />
{ setDateTo(e.target.value); setPage(1); }} className="border rounded-lg px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-40" />
{hasFilters && ( )}
Activity Log {meta ? `(${meta.total} entries)` : ""} {isLoading ? ( Array.from({ length: 5 }).map((_, i) => ( {Array.from({ length: 5 }).map((_, j) => ( ))} )) ) : logs.length === 0 ? ( ) : ( logs.map((log) => ( )) )}
Timestamp User Action Entity Entity ID
{formatDateTime(log.createdAt)} {log.user ? `${log.user.firstName} ${log.user.lastName}` : log.userId?.slice(0, 8) ?? "System"} {log.action} {log.entityType ?? log.entity ?? "—"} {log.entityId?.slice(0, 12) ?? "—"}
{meta && meta.totalPages > 1 && (

Page {meta.page} of {meta.totalPages}

)}
); }