From 443a937370789afd72f9bc21a52dc1eed75752f7 Mon Sep 17 00:00:00 2001 From: Dayuan Jiang <34411969+DayuanJiang@users.noreply.github.com> Date: Wed, 3 Dec 2025 13:53:16 +0900 Subject: [PATCH] fix: prevent duplicate diagram history entries on message send (#48) When sending a message, the history was being added twice because: 1. handleExport() triggers exportDiagram() which adds to history 2. AI responds and loadDiagram() is called, which internally triggers another export event in DrawIO, adding a duplicate entry Added expectHistoryExportRef flag to track user-initiated exports and only add to history when the export was explicitly requested. --- contexts/diagram-context.tsx | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/contexts/diagram-context.tsx b/contexts/diagram-context.tsx index a47f8ae..46edfb8 100644 --- a/contexts/diagram-context.tsx +++ b/contexts/diagram-context.tsx @@ -26,9 +26,13 @@ export function DiagramProvider({ children }: { children: React.ReactNode }) { >([]); const drawioRef = useRef(null); const resolverRef = useRef<((value: string) => void) | null>(null); + // Track if we're expecting an export for history (user-initiated) + const expectHistoryExportRef = useRef(false); const handleExport = () => { if (drawioRef.current) { + // Mark that this export should be saved to history + expectHistoryExportRef.current = true; drawioRef.current.exportDiagram({ format: "xmlsvg", }); @@ -47,13 +51,19 @@ export function DiagramProvider({ children }: { children: React.ReactNode }) { const extractedXML = extractDiagramXML(data.data); setChartXML(extractedXML); setLatestSvg(data.data); - setDiagramHistory((prev) => [ - ...prev, - { - svg: data.data, - xml: extractedXML, - }, - ]); + + // Only add to history if this was a user-initiated export + if (expectHistoryExportRef.current) { + setDiagramHistory((prev) => [ + ...prev, + { + svg: data.data, + xml: extractedXML, + }, + ]); + expectHistoryExportRef.current = false; + } + if (resolverRef.current) { resolverRef.current(extractedXML); resolverRef.current = null;