Add functionality to convert text to Markdown using Ollama API
This commit is contained in:
76
src/App.tsx
76
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);
|
||||
|
||||
Reference in New Issue
Block a user