import { useEffect, useRef } from 'react'; import { Crepe, CrepeFeature } from '@milkdown/crepe'; import '@milkdown/crepe/theme/common/style.css'; import '@milkdown/crepe/theme/nord.css'; interface MilkdownEditorProps { initialContent: string; onChange: (markdown: string) => void; } export function MilkdownEditor({ initialContent, onChange }: MilkdownEditorProps) { const containerRef = useRef(null); const crepeRef = useRef(null); const onChangeRef = useRef(onChange); onChangeRef.current = onChange; useEffect(() => { if (!containerRef.current) return; const crepe = new Crepe({ root: containerRef.current, defaultValue: initialContent, featureConfigs: { [CrepeFeature.Placeholder]: { text: 'Start writing...', }, }, }); crepe.on((listener) => { listener.markdownUpdated((_ctx, markdown, prevMarkdown) => { if (markdown !== prevMarkdown) { onChangeRef.current(markdown); } }); }); crepe.create(); crepeRef.current = crepe; return () => { crepe.destroy(); crepeRef.current = null; }; }, []); return
; }