From e581d5212f340262b28d69ac0162d87c6f31e6ce Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Thu, 5 Feb 2026 14:03:37 +0100 Subject: [PATCH] refactor: optimize audit log filtering in OrganizationSettings by using refs to stabilize state updates and improve performance --- components/settings/OrganizationSettings.tsx | 54 ++++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/components/settings/OrganizationSettings.tsx b/components/settings/OrganizationSettings.tsx index 38e971c..29c4d19 100644 --- a/components/settings/OrganizationSettings.tsx +++ b/components/settings/OrganizationSettings.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState, useEffect, useCallback } from 'react' +import { useState, useEffect, useCallback, useRef } from 'react' import { useRouter, useSearchParams } from 'next/navigation' import { useAuth } from '@/lib/auth/context' import { @@ -90,6 +90,24 @@ export default function OrganizationSettings() { const [auditStartDate, setAuditStartDate] = useState('') const [auditEndDate, setAuditEndDate] = useState('') + // Refs for filters to keep loadAudit stable and avoid rapid re-renders + const filtersRef = useRef({ + action: auditActionFilter, + logId: auditLogIdFilter, + startDate: auditStartDate, + endDate: auditEndDate + }) + + // Update refs when state changes + useEffect(() => { + filtersRef.current = { + action: auditActionFilter, + logId: auditLogIdFilter, + startDate: auditStartDate, + endDate: auditEndDate + } + }, [auditActionFilter, auditLogIdFilter, auditStartDate, auditEndDate]) + const getOrgIdFromToken = () => { return user?.org_id || null } @@ -174,10 +192,10 @@ export default function OrganizationSettings() { limit: auditPageSize, offset: auditPage * auditPageSize, } - if (auditActionFilter) params.action = auditActionFilter - if (auditLogIdFilter) params.log_id = auditLogIdFilter - if (auditStartDate) params.start_date = auditStartDate - if (auditEndDate) params.end_date = auditEndDate + if (filtersRef.current.action) params.action = filtersRef.current.action + if (filtersRef.current.logId) params.log_id = filtersRef.current.logId + if (filtersRef.current.startDate) params.start_date = filtersRef.current.startDate + if (filtersRef.current.endDate) params.end_date = filtersRef.current.endDate const { entries, total } = await getAuditLog(params) setAuditEntries(Array.isArray(entries) ? entries : []) setAuditTotal(typeof total === 'number' ? total : 0) @@ -187,7 +205,18 @@ export default function OrganizationSettings() { } finally { setIsLoadingAudit(false) } - }, [currentOrgId, auditPage, auditActionFilter, auditLogIdFilter, auditStartDate, auditEndDate]) + }, [currentOrgId, auditPage]) + + // Debounced filter change handler + useEffect(() => { + if (activeTab !== 'audit') return + + const timer = setTimeout(() => { + setAuditPage(0) // Reset page on filter change + loadAudit() + }, 500) + return () => clearTimeout(timer) + }, [auditActionFilter, auditLogIdFilter, auditStartDate, auditEndDate, loadAudit]) useEffect(() => { if (activeTab === 'audit' && currentOrgId) { @@ -306,6 +335,11 @@ export default function OrganizationSettings() { // We can find the current user's membership entry which has org name. const currentOrgName = members.find(m => m.user_id === user?.id)?.organization_name || 'Organization' + const handleTabChange = (tab: 'general' | 'members' | 'billing' | 'audit') => { + setActiveTab(tab) + router.push(`?tab=${tab}`) + } + return (
@@ -319,7 +353,7 @@ export default function OrganizationSettings() { {/* Sidebar Navigation */}