From 750cae25b7263affdc81cd6f862e254c9ccf0bdc Mon Sep 17 00:00:00 2001 From: JoeMakuta Date: Mon, 30 Mar 2026 17:28:00 +0200 Subject: [PATCH 1/7] fix: update dependency array in useEffect to track specific searchSpace properties --- surfsense_web/components/settings/general-settings-manager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surfsense_web/components/settings/general-settings-manager.tsx b/surfsense_web/components/settings/general-settings-manager.tsx index ca90142b1..59bb28872 100644 --- a/surfsense_web/components/settings/general-settings-manager.tsx +++ b/surfsense_web/components/settings/general-settings-manager.tsx @@ -49,7 +49,7 @@ export function GeneralSettingsManager({ searchSpaceId }: GeneralSettingsManager setDescription(searchSpace.description || ""); setHasChanges(false); } - }, [searchSpace]); + }, [searchSpace?.name, searchSpace?.description]); // Track changes useEffect(() => { From 1080cf5ed4748cd372883a809074a7ed96a43fb4 Mon Sep 17 00:00:00 2001 From: JoeMakuta Date: Mon, 30 Mar 2026 17:28:31 +0200 Subject: [PATCH 2/7] fix: update dependency array in useEffect to track specific LLM preference properties --- surfsense_web/components/settings/llm-role-manager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surfsense_web/components/settings/llm-role-manager.tsx b/surfsense_web/components/settings/llm-role-manager.tsx index c2e27d6ac..a35441518 100644 --- a/surfsense_web/components/settings/llm-role-manager.tsx +++ b/surfsense_web/components/settings/llm-role-manager.tsx @@ -129,7 +129,7 @@ export function LLMRoleManager({ searchSpaceId }: LLMRoleManagerProps) { }; setAssignments(newAssignments); setHasChanges(false); - }, [preferences]); + }, [preferences?.agent_llm_id, preferences?.document_summary_llm_id, preferences?.image_generation_config_id]); const handleRoleAssignment = (prefKey: string, configId: string) => { const newAssignments = { From a942bf5a793082513c5581f3b6463d21bde5cbd1 Mon Sep 17 00:00:00 2001 From: JoeMakuta Date: Mon, 30 Mar 2026 17:28:54 +0200 Subject: [PATCH 3/7] fix: update dependency array in useEffect to track specific qna_custom_instructions property --- surfsense_web/components/settings/prompt-config-manager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surfsense_web/components/settings/prompt-config-manager.tsx b/surfsense_web/components/settings/prompt-config-manager.tsx index b3cd64a5b..8fcef5ea5 100644 --- a/surfsense_web/components/settings/prompt-config-manager.tsx +++ b/surfsense_web/components/settings/prompt-config-manager.tsx @@ -40,7 +40,7 @@ export function PromptConfigManager({ searchSpaceId }: PromptConfigManagerProps) setCustomInstructions(searchSpace.qna_custom_instructions || ""); setHasChanges(false); } - }, [searchSpace]); + }, [searchSpace?.qna_custom_instructions]); // Track changes useEffect(() => { From 7140b68474fd94a8a2cd0cf78302c3b11a76ca3f Mon Sep 17 00:00:00 2001 From: JoeMakuta Date: Mon, 30 Mar 2026 17:34:37 +0200 Subject: [PATCH 4/7] Use lazy state initialization for llm role manager --- surfsense_web/components/settings/llm-role-manager.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/surfsense_web/components/settings/llm-role-manager.tsx b/surfsense_web/components/settings/llm-role-manager.tsx index a35441518..2c9a18018 100644 --- a/surfsense_web/components/settings/llm-role-manager.tsx +++ b/surfsense_web/components/settings/llm-role-manager.tsx @@ -112,11 +112,11 @@ export function LLMRoleManager({ searchSpaceId }: LLMRoleManagerProps) { const { mutateAsync: updatePreferences } = useAtomValue(updateLLMPreferencesMutationAtom); - const [assignments, setAssignments] = useState({ + const [assignments, setAssignments] = useState(() => ({ agent_llm_id: preferences.agent_llm_id ?? "", document_summary_llm_id: preferences.document_summary_llm_id ?? "", image_generation_config_id: preferences.image_generation_config_id ?? "", - }); + })); const [hasChanges, setHasChanges] = useState(false); const [isSaving, setIsSaving] = useState(false); From 8f6c9f51ee5af3bfa927b1dc660e44b86424edf7 Mon Sep 17 00:00:00 2001 From: JoeMakuta Date: Mon, 30 Mar 2026 17:35:33 +0200 Subject: [PATCH 5/7] Use lazy state initialization for update confluence page --- .../tool-ui/confluence/update-confluence-page.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx b/surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx index b42e26f69..d88fe94cd 100644 --- a/surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx +++ b/surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx @@ -149,17 +149,15 @@ function ApprovalCard({ const context = interruptData.context; const page = context?.page; - const initialEditState = { + const [isPanelOpen, setIsPanelOpen] = useState(false); + const [editedArgs, setEditedArgs] = useState(() => ({ title: actionArgs.new_title ? String(actionArgs.new_title) : (page?.page_title ?? args.new_title ?? ""), content: actionArgs.new_content ? String(actionArgs.new_content) : (page?.body ?? args.new_content ?? ""), - }; - - const [isPanelOpen, setIsPanelOpen] = useState(false); - const [editedArgs, setEditedArgs] = useState(initialEditState); + })); const [hasPanelEdits, setHasPanelEdits] = useState(false); const openHitlEditPanel = useSetAtom(openHitlEditPanelAtom); From e0cd8932da9abd586c079eeee8a2231e3230dfe9 Mon Sep 17 00:00:00 2001 From: JoeMakuta Date: Mon, 30 Mar 2026 17:36:52 +0200 Subject: [PATCH 6/7] Use lazy state initialization in jira an linear issues --- .../components/tool-ui/jira/update-jira-issue.tsx | 8 +++----- .../components/tool-ui/linear/update-linear-issue.tsx | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/surfsense_web/components/tool-ui/jira/update-jira-issue.tsx b/surfsense_web/components/tool-ui/jira/update-jira-issue.tsx index d5ff8fc87..2a6366b51 100644 --- a/surfsense_web/components/tool-ui/jira/update-jira-issue.tsx +++ b/surfsense_web/components/tool-ui/jira/update-jira-issue.tsx @@ -173,7 +173,8 @@ function ApprovalCard({ const issue = context?.issue; const priorities = context?.priorities ?? []; - const initialEditState = { + const [isPanelOpen, setIsPanelOpen] = useState(false); + const [editedArgs, setEditedArgs] = useState(() => ({ summary: actionArgs.new_summary ? String(actionArgs.new_summary) : (issue?.issue_title ?? args.new_summary ?? ""), @@ -183,10 +184,7 @@ function ApprovalCard({ priority: actionArgs.new_priority ? String(actionArgs.new_priority) : (issue?.priority ?? args.new_priority ?? "__none__"), - }; - - const [isPanelOpen, setIsPanelOpen] = useState(false); - const [editedArgs, setEditedArgs] = useState(initialEditState); + })); const [hasPanelEdits, setHasPanelEdits] = useState(false); const openHitlEditPanel = useSetAtom(openHitlEditPanelAtom); diff --git a/surfsense_web/components/tool-ui/linear/update-linear-issue.tsx b/surfsense_web/components/tool-ui/linear/update-linear-issue.tsx index dc5bcd0e8..731bb8012 100644 --- a/surfsense_web/components/tool-ui/linear/update-linear-issue.tsx +++ b/surfsense_web/components/tool-ui/linear/update-linear-issue.tsx @@ -182,7 +182,8 @@ function ApprovalCard({ const priorities = context?.priorities ?? []; const issue = context?.issue; - const initialEditState = { + const [isPanelOpen, setIsPanelOpen] = useState(false); + const [editedArgs, setEditedArgs] = useState(() => ({ title: actionArgs.new_title ? String(actionArgs.new_title) : (issue?.title ?? args.new_title ?? ""), @@ -202,10 +203,7 @@ function ApprovalCard({ labelIds: Array.isArray(actionArgs.new_label_ids) ? (actionArgs.new_label_ids as string[]) : (issue?.current_labels?.map((l) => l.id) ?? []), - }; - - const [isPanelOpen, setIsPanelOpen] = useState(false); - const [editedArgs, setEditedArgs] = useState(initialEditState); + })); const [hasPanelEdits, setHasPanelEdits] = useState(false); const openHitlEditPanel = useSetAtom(openHitlEditPanelAtom); From 8263c7342774d96863a506e5a58b0395b4b963c2 Mon Sep 17 00:00:00 2001 From: JoeMakuta Date: Mon, 30 Mar 2026 18:00:00 +0200 Subject: [PATCH 7/7] refactor: memoize ThreadListItemComponent for performance optimization using memo --- surfsense_web/components/assistant-ui/thread-list.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/surfsense_web/components/assistant-ui/thread-list.tsx b/surfsense_web/components/assistant-ui/thread-list.tsx index db7704470..f1d10ca16 100644 --- a/surfsense_web/components/assistant-ui/thread-list.tsx +++ b/surfsense_web/components/assistant-ui/thread-list.tsx @@ -9,7 +9,7 @@ import { TrashIcon, } from "lucide-react"; import { useRouter } from "next/navigation"; -import { useCallback, useEffect, useState } from "react"; +import { memo, useCallback, useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; import { DropdownMenu, @@ -215,7 +215,7 @@ interface ThreadListItemComponentProps { onDelete: () => void; } -function ThreadListItemComponent({ +const ThreadListItemComponent = memo(function ThreadListItemComponent({ thread, isActive, isArchived, @@ -272,7 +272,7 @@ function ThreadListItemComponent({ ); -} +}); /** * Format a date as relative time (e.g., "2 hours ago", "Yesterday")