diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index ec13191..351e03e 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -124,6 +124,7 @@ $current`); const [correctedContent, setCorrectedContent] = useState(''); const [previousNoteCorrectedContent, setPreviousNoteCorrectedContent] = useState(''); const [correctionTimeout, setCorrectionTimeout] = useState(); + const [correctionAbortController, setCorrectionAbortController] = useState(null); const { resolvedTheme, setTheme } = useTheme(); @@ -338,19 +339,37 @@ $current`); // Debounced text correction for previous note const debouncedCorrectPreviousNote = (content: string) => { + // Cancel any pending correction request + if (correctionAbortController) { + try { + correctionAbortController.abort(); + } catch (error) { + // Ignore abort errors - the controller might already be aborted + } + } + if (correctionTimeout) { clearTimeout(correctionTimeout); } + // Create new AbortController for this request + const abortController = new AbortController(); + setCorrectionAbortController(abortController); + const timeout = setTimeout(async () => { if (content.trim()) { try { addDebugInfo('Correcting previous note text...'); - const corrected = await correctText(content); + const corrected = await correctText(content, abortController); setPreviousNoteCorrectedContent(corrected); } catch (error) { - console.error('Previous note text correction failed:', error); - setPreviousNoteCorrectedContent(''); + if (error instanceof Error && error.name === 'AbortError') { + addDebugInfo('Previous note correction cancelled'); + return; // Don't set empty content for aborted requests + } else { + console.error('Previous note text correction failed:', error); + setPreviousNoteCorrectedContent(''); + } } } else { setPreviousNoteCorrectedContent(''); @@ -361,7 +380,7 @@ $current`); }; // Correct text using Ollama - const correctText = async (content: string): Promise => { + const correctText = async (content: string, abortController?: AbortController): Promise => { try { const response = await fetchWithTiming(`${ollamaEndpoint}/api/generate`, { method: 'POST', @@ -387,6 +406,7 @@ ${content}`, keep_alive: ollamaKeepAlive, temperature: 0.1, }), + signal: abortController?.signal, }, 'Correct Text'); if (!response.ok) { @@ -1169,6 +1189,16 @@ ${content}`, const reversedDelta = -delta; const newIndex = Math.max(0, Math.min(currentNoteIndex + reversedDelta, noteCache.length - 1)); if (newIndex !== currentNoteIndex && noteCache[newIndex]) { + // Cancel any pending correction request before changing notes + if (correctionAbortController) { + try { + correctionAbortController.abort(); + } catch (error) { + // Ignore abort errors - the controller might already be aborted + } + setCorrectionAbortController(null); + } + setCurrentNoteIndex(newIndex); setPreviousNote(noteCache[newIndex]); setIsPreviousNoteModified(false); @@ -1355,6 +1385,14 @@ ${content}`, if (correctionTimeout) { clearTimeout(correctionTimeout); } + // Cancel any pending correction request on cleanup + if (correctionAbortController) { + try { + correctionAbortController.abort(); + } catch (error) { + // Ignore abort errors - the controller might already be aborted + } + } }; }, [currentNote, previousNote, scratchPad, isPreviousNoteModified, isSearchOpen, isGotoOpen, isCleanupOpen]);