"use client"; import { useCallback, useEffect, useRef, useState } from "react"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent } from "@/components/ui/card"; import { DataTable } from "@/components/ui/DataTable"; import { SearchField } from "@/components/ui/SearchField"; import { PageHeader } from "@/components/ui/PageHeader"; type EventRow = { id: number; createdAt: string; user: string; summary: string; }; type Props = { events: EventRow[]; pagination: { total: number; page: number; perPage: number }; initialSearch: string; }; export default function AuditLogClient({ events, pagination, initialSearch }: Props) { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const [searchTerm, setSearchTerm] = useState(initialSearch); useEffect(() => { setSearchTerm(initialSearch); }, [initialSearch]); const debounceRef = useRef | null>(null); const updateSearch = useCallback( (value: string) => { if (debounceRef.current) clearTimeout(debounceRef.current); debounceRef.current = setTimeout(() => { const params = new URLSearchParams(searchParams.toString()); if (value.trim()) { params.set("search", value.trim()); } else { params.delete("search"); } params.delete("page"); // reset to page 1 on new search router.push(`${pathname}?${params.toString()}`); }, 400); }, [router, pathname, searchParams] ); useEffect(() => { return () => { if (debounceRef.current) clearTimeout(debounceRef.current); }; }, []); const columns = [ { id: "created_at", label: "Time", width: 180, render: (r: EventRow) => ( {new Date(r.createdAt).toLocaleString()} ), }, { id: "user", label: "User", width: 160, render: (r: EventRow) => ( {r.user} ), }, { id: "summary", label: "Event", render: (r: EventRow) => (

{r.summary}

), }, ]; const mobileCard = (r: EventRow) => (
{r.user} {new Date(r.createdAt).toLocaleString()}

{r.summary}

); return (
{ setSearchTerm(e.target.value); updateSearch(e.target.value); }} placeholder="Search audit log..." />
); }