From 63efadd3fbd0d6f12867ad9b74c1c7ddeff11dcd Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sun, 1 Feb 2026 05:15:20 +0100 Subject: [PATCH] Add functionality to convert text to Markdown using Ollama API --- src/App.tsx | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/App.tsx b/src/App.tsx index 28ad7c7..7fb327f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -581,6 +581,82 @@ export default function App() { setHistoryItems(combined); }, [historyOpen, selectedTextId]); + const handleConvertToMarkdown = useCallback(async () => { + if (!selectedTextId || !hasText || isViewingHistory || isConverting) return; + if (!ollamaModel) { + setConfirmState({ + title: "Ollama", + message: "Select an Ollama model first.", + actionLabel: "OK", + onConfirm: () => {} + }); + return; + } + const prompt = (ollamaPrompt || DEFAULT_OLLAMA_PROMPT).trim(); + const fullPrompt = `${prompt}\n${body}`; + setIsConverting(true); + try { + const response = await fetch(`${normalizedOllamaUrl}/api/generate`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + model: ollamaModel, + prompt: fullPrompt, + stream: false + }) + }); + if (!response.ok) { + throw new Error(`Ollama responded with ${response.status}`); + } + const data = await response.json(); + const resultText = typeof data?.response === "string" ? data.response : ""; + if (!resultText) { + throw new Error("Ollama returned an empty response."); + } + const normalizedTitle = title.trim() || DEFAULT_TITLE; + const result = await saveManualVersion( + selectedTextId, + normalizedTitle, + resultText + ); + setBody(resultText); + setLastPersistedBody(resultText); + setLastPersistedTitle(normalizedTitle); + setHasDraft(false); + setRestoredDraft(false); + setLatestManualVersionId(result.versionId); + setDraftBaseVersionId(result.versionId); + setSelectedHistoryId(result.versionId); + setViewingVersion(null); + historySnapshotRef.current = null; + setMarkdownPreview(true); + await refreshTexts(); + await refreshVersions(); + } catch (error) { + console.error("Failed to convert with Ollama", error); + setConfirmState({ + title: "Ollama error", + message: error instanceof Error ? error.message : "Conversion failed.", + actionLabel: "OK", + onConfirm: () => {} + }); + } finally { + setIsConverting(false); + } + }, [ + body, + hasText, + isConverting, + isViewingHistory, + normalizedOllamaUrl, + ollamaModel, + ollamaPrompt, + refreshTexts, + refreshVersions, + selectedTextId, + title + ]); + useEffect(() => { refreshTexts().catch((error) => { console.error("Failed to load texts", error);