From 2effa535175953c82ca3b61d1befca4d7cd82347 Mon Sep 17 00:00:00 2001 From: "Abe Diaz (@abe238)" Date: Wed, 31 Dec 2025 01:47:58 -0800 Subject: [PATCH] fix: prevent infinite re-render loop in task selection useEffect (#442) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: prevent infinite re-render loop in task selection useEffect The useEffect for syncing selectedTask was causing infinite re-renders because: 1. selectedTask object was in the dependency array 2. setSelectedTask(updatedTask) created new reference 3. New reference triggered effect again → infinite loop Fix: - Add reference equality check (updatedTask !== selectedTask) - Remove selectedTask from dependency array (keep only ID/specId) Fixes #441 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 Signed-off-by: Abe Diaz (@abe238) * chore: add ESLint disable comment for intentional dependency omission Address code review feedback from Gemini Code Assist: explicitly acknowledge the intentional omission of selectedTask object from the dependency array to satisfy react-hooks/exhaustive-deps rule. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 Signed-off-by: Abe Diaz (@abe238) --------- Signed-off-by: Abe Diaz (@abe238) Co-authored-by: Claude Opus 4.5 Co-authored-by: Alex <63423455+AlexMadera@users.noreply.github.com> --- apps/frontend/src/renderer/App.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/renderer/App.tsx b/apps/frontend/src/renderer/App.tsx index e70d4cb8..c9caa05e 100644 --- a/apps/frontend/src/renderer/App.tsx +++ b/apps/frontend/src/renderer/App.tsx @@ -392,11 +392,12 @@ export function App() { const updatedTask = tasks.find( (t) => t.id === selectedTask.id || t.specId === selectedTask.specId ); - if (updatedTask) { + if (updatedTask && updatedTask !== selectedTask) { setSelectedTask(updatedTask); } } - }, [tasks, selectedTask?.id, selectedTask?.specId, selectedTask]); + // eslint-disable-next-line react-hooks/exhaustive-deps -- Intentionally omit selectedTask object to prevent infinite re-render loop + }, [tasks, selectedTask?.id, selectedTask?.specId]); const handleTaskClick = (task: Task) => { setSelectedTask(task);