From 0156310b26dd7a25077a5283f65081db3f100da1 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Mon, 18 May 2026 09:53:34 -0400 Subject: [PATCH] fix: Restore drafts on active agent changes --- .../SidePanel/Agents/AgentPanel.tsx | 21 +++++++----- .../__tests__/AgentPanel.drafts.spec.tsx | 34 +++++++++++++++++++ 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/client/src/components/SidePanel/Agents/AgentPanel.tsx b/client/src/components/SidePanel/Agents/AgentPanel.tsx index 05f4c0a5d1..9d4f0eb61d 100644 --- a/client/src/components/SidePanel/Agents/AgentPanel.tsx +++ b/client/src/components/SidePanel/Agents/AgentPanel.tsx @@ -229,6 +229,11 @@ const isPersistableDraftField = (name?: string): boolean => { ); }; +const getDraftFormValues = (draftValues?: Partial): AgentForm => ({ + ...getDefaultAgentFormValues(), + ...draftValues, +}); + export default function AgentPanel() { const localize = useLocalize(); const { user } = useAuthContext(); @@ -262,13 +267,7 @@ export default function AgentPanel() { const models = useMemo(() => modelsQuery.data ?? {}, [modelsQuery.data]); const draftValues = useMemo(() => getAgentDraft(current_agent_id), [current_agent_id]); - const defaultValues = useMemo( - () => ({ - ...getDefaultAgentFormValues(), - ...draftValues, - }), - [draftValues], - ); + const defaultValues = useMemo(() => getDraftFormValues(draftValues), [draftValues]); const methods = useForm({ defaultValues, mode: 'onChange', @@ -338,10 +337,14 @@ export default function AgentPanel() { } currentAgentIdRef.current = current_agent_id; - const nextHasDraft = getAgentDraft(current_agent_id) != null; + const nextDraft = getAgentDraft(current_agent_id); + const nextHasDraft = nextDraft != null; shouldPersistDraftRef.current = nextHasDraft; setHasDraft(nextHasDraft); - }, [current_agent_id, getValues]); + if (nextDraft) { + reset(getDraftFormValues(nextDraft)); + } + }, [current_agent_id, getValues, reset]); useEffect(() => { if (hasDraft) { diff --git a/client/src/components/SidePanel/Agents/__tests__/AgentPanel.drafts.spec.tsx b/client/src/components/SidePanel/Agents/__tests__/AgentPanel.drafts.spec.tsx index a1418411ab..9af2dedfa3 100644 --- a/client/src/components/SidePanel/Agents/__tests__/AgentPanel.drafts.spec.tsx +++ b/client/src/components/SidePanel/Agents/__tests__/AgentPanel.drafts.spec.tsx @@ -313,4 +313,38 @@ describe('AgentPanel draft preservation', () => { expect(getAgentDraft('agent-123')).toBeUndefined(); expect(mockLastAgentSelectHasDraft).toBe(false); }); + + it('restores a draft when the current agent changes while mounted', async () => { + mockCurrentAgentId = 'agent-123'; + const { rerender } = render(); + + fireEvent.change(screen.getByLabelText('Draft name'), { + target: { value: 'Previous agent draft' }, + }); + saveAgentDraft('agent-456', { + id: 'agent-456', + name: 'Mounted switch draft', + description: '', + instructions: 'Draft for the switched agent', + model: 'gpt-4o', + model_parameters: {}, + provider: { label: 'OpenAI', value: 'openAI' }, + tools: [], + tool_options: {}, + category: 'general', + execute_code: false, + file_search: false, + web_search: false, + } as AgentForm); + + mockCurrentAgentId = 'agent-456'; + rerender(); + + await waitFor(() => { + expect(screen.getByLabelText('Draft name')).toHaveValue('Mounted switch draft'); + }); + expect(screen.getByLabelText('Draft instructions')).toHaveValue('Draft for the switched agent'); + expect(getAgentDraft('agent-123')?.name).toBe('Previous agent draft'); + expect(mockLastAgentSelectHasDraft).toBe(true); + }); });