fix(perf): remove projectTabs from useEffect deps to fix re-render loop (#362)

The projectTabs array was being included in the useEffect dependency
array, but since it's computed fresh on every render (via getProjectTabs()),
it always has a new reference. This caused the effect to fire on every
render cycle, creating an infinite re-render loop.

Fix: Use openProjectIds.includes() instead of projectTabs.some() since
openProjectIds is stable state and already tracks the same information.

Fixes performance regression in beta.10 where UI interactions took 5-6 seconds.

Co-authored-by: Andy <119136210+AndyMik90@users.noreply.github.com>
This commit is contained in:
Michael Ludlow
2025-12-27 16:59:57 -05:00
committed by GitHub
parent 20f20fa321
commit 753dc8bbe3
+4 -2
View File
@@ -157,7 +157,9 @@ export function App() {
}
console.log('[App] Tabs already persisted, checking active project');
// If there's an active project but no tabs open for it, open a tab
if (activeProjectId && !projectTabs.some(tab => tab.id === activeProjectId)) {
// Note: Use openProjectIds instead of projectTabs to avoid re-render loop
// (projectTabs creates a new array on every render)
if (activeProjectId && !openProjectIds.includes(activeProjectId)) {
console.log('[App] Active project has no tab, opening:', activeProjectId);
openProjectTab(activeProjectId);
}
@@ -170,7 +172,7 @@ export function App() {
console.log('[App] Tab state is valid, no action needed');
}
}
}, [projects, activeProjectId, selectedProjectId, openProjectIds, projectTabs, openProjectTab, setActiveProject]);
}, [projects, activeProjectId, selectedProjectId, openProjectIds, openProjectTab, setActiveProject]);
// Track if settings have been loaded at least once
const [settingsHaveLoaded, setSettingsHaveLoaded] = useState(false);