'use client' import { useState, useEffect } from 'react' import { Spinner } from '@ciphera-net/ui' import { useAuth } from '@/lib/auth/context' import { getAuditLog, type AuditLogEntry } from '@/lib/api/audit' import { formatDateTimeShort } from '@/lib/utils/formatDate' const ACTION_LABELS: Record = { site_created: 'Created site', site_updated: 'Updated site', site_deleted: 'Deleted site', site_restored: 'Restored site', goal_created: 'Created goal', goal_updated: 'Updated goal', goal_deleted: 'Deleted goal', funnel_created: 'Created funnel', funnel_updated: 'Updated funnel', funnel_deleted: 'Deleted funnel', gsc_connected: 'Connected Google Search Console', gsc_disconnected: 'Disconnected Google Search Console', bunny_connected: 'Connected BunnyCDN', bunny_disconnected: 'Disconnected BunnyCDN', member_invited: 'Invited member', member_removed: 'Removed member', member_role_changed: 'Changed member role', org_updated: 'Updated organization', plan_changed: 'Changed plan', subscription_cancelled: 'Cancelled subscription', subscription_resumed: 'Resumed subscription', } const PAGE_SIZE = 20 export default function WorkspaceAuditTab() { const { user } = useAuth() const [entries, setEntries] = useState([]) const [loading, setLoading] = useState(true) const [page, setPage] = useState(1) const [total, setTotal] = useState(0) const [actionFilter, setActionFilter] = useState('') const [startDate, setStartDate] = useState('') const [endDate, setEndDate] = useState('') useEffect(() => { if (!user?.org_id) return setLoading(true) getAuditLog({ limit: PAGE_SIZE, offset: (page - 1) * PAGE_SIZE, ...(actionFilter && { action: actionFilter }), ...(startDate && { start_date: startDate }), ...(endDate && { end_date: endDate }), }) .then(data => { setEntries(data.entries) setTotal(data.total) }) .catch(() => {}) .finally(() => setLoading(false)) }, [user?.org_id, page, actionFilter, startDate, endDate]) if (loading) return
return (

Audit Log

Track who made changes and when.

{ setActionFilter(e.target.value); setPage(1) }} placeholder="e.g. site_created" className="px-3 py-1.5 border border-neutral-700 rounded-lg bg-neutral-900 text-white text-sm w-40" />
{ setStartDate(e.target.value); setPage(1) }} className="px-3 py-1.5 border border-neutral-700 rounded-lg bg-neutral-900 text-white text-sm" />
{ setEndDate(e.target.value); setPage(1) }} className="px-3 py-1.5 border border-neutral-700 rounded-lg bg-neutral-900 text-white text-sm" />
{(actionFilter || startDate || endDate) && ( )}
{entries.length === 0 ? (

No activity recorded yet.

) : (
{entries.map(entry => (

{entry.actor_email || 'System'} {' '} {ACTION_LABELS[entry.action] || entry.action}

{entry.payload && Object.keys(entry.payload).length > 0 && (

{JSON.stringify(entry.payload)}

)}

{formatDateTimeShort(new Date(entry.occurred_at))}

))}
)}
{total > 0 ? `${(page - 1) * PAGE_SIZE + 1}–${Math.min(page * PAGE_SIZE, total)} of ${total}` : 'No entries'}
) }