'use client'; import { useEffect, useRef } from 'react'; import { Editor } from '@monaco-editor/react'; import { cn } from '@/lib/utils'; interface CodeEditorProps { value: string; onChange: (value: string) => void; className?: string; language?: string; theme?: string; } export function CodeEditor({ value, onChange, className, language = 'javascript', theme = 'vs-dark' }: CodeEditorProps) { const editorRef = useRef(null); const handleEditorDidMount = (editor: any) => { editorRef.current = editor; // Configure editor options editor.updateOptions({ fontSize: 14, fontFamily: 'JetBrains Mono, Monaco, Consolas, "Courier New", monospace', minimap: { enabled: false }, scrollBeyondLastLine: false, wordWrap: 'on', automaticLayout: true, tabSize: 2, insertSpaces: true, roundedSelection: false, readOnly: false, cursorStyle: 'line', lineNumbers: 'on', renderLineHighlight: 'line', selectOnLineNumbers: true, roundedSelection: false, renderIndentGuides: true, colorDecorators: true, lineDecorationsWidth: 0, lineNumbersMinChars: 3, folding: true, foldingHighlight: true, showFoldingControls: 'mouseover', smoothScrolling: true, contextmenu: true, mouseWheelZoom: true, }); // Add custom key bindings editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => { // Handle save action console.log('Save action triggered'); }); // Add code completion suggestions const suggestions = [ { label: 'console.log', kind: monaco.languages.CompletionItemKind.Function, insertText: 'console.log(${1:message});', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, documentation: 'Log a message to the console' }, { label: 'function', kind: monaco.languages.CompletionItemKind.Snippet, insertText: 'function ${1:functionName}(${2:params}) {\n\t${3:// function body}\n}', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, documentation: 'Create a function' }, { label: 'if', kind: monaco.languages.CompletionItemKind.Snippet, insertText: 'if (${1:condition}) {\n\t${2:// code}\n}', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, documentation: 'Create an if statement' } ]; // Register completion provider const completionProvider = { provideCompletionItems: () => ({ suggestions: suggestions.map(suggestion => ({ ...suggestion, range: undefined })) }) }; // Register the completion provider const disposable = monaco.languages.registerCompletionItemProvider(language, completionProvider); // Cleanup on unmount return () => { disposable.dispose(); }; }; const handleEditorChange = (value: string | undefined) => { if (value !== undefined) { onChange(value); } }; return (
); }