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);
|
setHistoryItems(combined);
|
||||||
}, [historyOpen, selectedTextId]);
|
}, [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(() => {
|
useEffect(() => {
|
||||||
refreshTexts().catch((error) => {
|
refreshTexts().catch((error) => {
|
||||||
console.error("Failed to load texts", error);
|
console.error("Failed to load texts", error);
|
||||||
|
|||||||
Reference in New Issue
Block a user