Spaces:
Build error
Build error
| '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<any>(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 ( | |
| <div className={cn("monaco-editor-container", className)}> | |
| <Editor | |
| height="100%" | |
| defaultLanguage={language} | |
| theme={theme} | |
| value={value} | |
| onChange={handleEditorChange} | |
| onMount={handleEditorDidMount} | |
| options={{ | |
| selectOnLineNumbers: true, | |
| roundedSelection: false, | |
| readOnly: false, | |
| cursorStyle: 'line', | |
| automaticLayout: true, | |
| wordWrap: 'on', | |
| minimap: { enabled: false }, | |
| scrollBeyondLastLine: false, | |
| fontSize: 14, | |
| fontFamily: 'JetBrains Mono, Monaco, Consolas, "Courier New", monospace', | |
| tabSize: 2, | |
| insertSpaces: true, | |
| renderLineHighlight: 'line', | |
| lineNumbers: 'on', | |
| contextmenu: true, | |
| mouseWheelZoom: true, | |
| smoothScrolling: true, | |
| folding: true, | |
| foldingHighlight: true, | |
| showFoldingControls: 'mouseover', | |
| }} | |
| /> | |
| </div> | |
| ); | |
| } |