import React, { useEffect, useRef } from 'react'; import { EditorView, basicSetup } from 'codemirror'; import { html } from '@codemirror/lang-html'; import { oneDark } from '@codemirror/theme-one-dark'; interface CodeEditorProps { value: string; onChange: (value: string) => void; placeholder?: string; } export function CodeEditor({ value, onChange, placeholder }: CodeEditorProps) { const editorRef = useRef(null); const viewRef = useRef(null); useEffect(() => { if (!editorRef.current) return; const view = new EditorView({ doc: value, extensions: [ basicSetup, html(), oneDark, EditorView.updateListener.of((update) => { if (update.docChanged) { onChange(update.state.doc.toString()); } }), ], parent: editorRef.current, }); viewRef.current = view; return () => { view.destroy(); }; }, []); // Update editor when value prop changes useEffect(() => { if (viewRef.current && value !== viewRef.current.state.doc.toString()) { viewRef.current.dispatch({ changes: { from: 0, to: viewRef.current.state.doc.length, insert: value, }, }); } }, [value]); return (
); }