From d8655df83883d6014c6f9aa943e4ad48528491ff Mon Sep 17 00:00:00 2001 From: iliya Date: Sun, 1 Mar 2026 09:21:17 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20resolve=20lint=20errors=20=E2=80=94=20se?= =?UTF-8?q?tState-during-render=20instead=20of=20useEffect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../team/dialogs/TaskCommentsSection.tsx | 10 +++++--- .../team/editor/QuickOpenDialog.tsx | 25 +++++++++++++------ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/renderer/components/team/dialogs/TaskCommentsSection.tsx b/src/renderer/components/team/dialogs/TaskCommentsSection.tsx index 426ec636..4cb94fad 100644 --- a/src/renderer/components/team/dialogs/TaskCommentsSection.tsx +++ b/src/renderer/components/team/dialogs/TaskCommentsSection.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { MarkdownViewer } from '@renderer/components/chat/viewers/MarkdownViewer'; import { ReplyQuoteBlock } from '@renderer/components/team/activity/ReplyQuoteBlock'; @@ -54,11 +54,15 @@ export const TaskCommentsSection = ({ const [expandedCommentIds, setExpandedCommentIds] = useState>(new Set()); const [visibleCount, setVisibleCount] = useState(INITIAL_VISIBLE_COMMENTS); - useEffect(() => { + // Reset state when task changes (React-approved setState-during-render pattern) + const resetKey = teamIdKey(teamName, taskId); + const [prevResetKey, setPrevResetKey] = useState(resetKey); + if (prevResetKey !== resetKey) { + setPrevResetKey(resetKey); setVisibleCount(INITIAL_VISIBLE_COMMENTS); setExpandedCommentIds(new Set()); setReplyTo(null); - }, [teamIdKey(teamName, taskId)]); + } const toggleCommentExpanded = useCallback((commentId: string) => { setExpandedCommentIds((prev) => { diff --git a/src/renderer/components/team/editor/QuickOpenDialog.tsx b/src/renderer/components/team/editor/QuickOpenDialog.tsx index 3e8d2c37..84345468 100644 --- a/src/renderer/components/team/editor/QuickOpenDialog.tsx +++ b/src/renderer/components/team/editor/QuickOpenDialog.tsx @@ -37,22 +37,31 @@ export const QuickOpenDialog = ({ const [allFiles, setAllFiles] = useState([]); const [loading, setLoading] = useState(true); - // Load all project files on mount via backend API + // Reset state when projectPath changes (React-approved setState-during-render pattern) + const [prevProjectPath, setPrevProjectPath] = useState(projectPath); + if (prevProjectPath !== projectPath) { + setPrevProjectPath(projectPath); + setLoading(true); + setAllFiles([]); + } + + // Load all project files via backend API useEffect(() => { let cancelled = false; - setLoading(true); - window.electronAPI.editor - .listFiles() - .then((files) => { + const fetchFiles = async (): Promise => { + try { + const files = await window.electronAPI.editor.listFiles(); if (!cancelled) { setAllFiles(files); setLoading(false); } - }) - .catch(() => { + } catch { if (!cancelled) setLoading(false); - }); + } + }; + + void fetchFiles(); return () => { cancelled = true;