import { useState, useEffect, useMemo } from 'react'; import { DocContent } from '../api'; import { marked } from 'marked'; import { cleanDisplayText } from '../presentation'; interface Props { doc: DocContent; onSave: (title: string, body: string) => void; } export function Editor({ doc, onSave }: Props) { const [editing, setEditing] = useState(false); const [title, setTitle] = useState(doc.meta.title); const [body, setBody] = useState(doc.body); // 切换文档时重置 useEffect(() => { setTitle(doc.meta.title); setBody(doc.body); setEditing(false); }, [doc.meta.id]); const rendered = useMemo(() => { try { return marked(body, { async: false }) as string; } catch { return '
渲染失败
'; } }, [body]); const handleSave = () => { onSave(title, body); setEditing(false); }; const handleCancel = () => { setTitle(doc.meta.title); setBody(doc.body); setEditing(false); }; const displayPath = doc.meta.id.split('/').map(cleanDisplayText).join(' / '); return (