deepsite-ai-coding / code-editor.tsx
likhonsheikh's picture
Upload components directory - minimal build
d2be573 verified
'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>
);
}