Codeki / frontend /src /components /CodeEditor.tsx
Mayank2027's picture
Create frontend/src/components/CodeEditor.tsx
6b7fbaf verified
Raw
History Blame Contribute Delete
2.83 kB
import React, { useRef } from 'react';
import Editor, { OnMount } from '@monaco-editor/react';
import * as monaco from 'monaco-editor';
const CodeEditor: React.FC<{ filePath: string | null; projectPath: string }> = ({ filePath, projectPath }) => {
const editorRef = useRef<monaco.editor.IStandaloneCodeEditor | null>(null);
const handleEditorDidMount: OnMount = (editor, monaco) => {
editorRef.current = editor;
monaco.languages.registerInlineCompletionsProvider('*', {
provideInlineCompletions: async (model, position, context, token) => {
const prefix = model.getValueInRange({
startLineNumber: 1,
startColumn: 1,
endLineNumber: position.lineNumber,
endColumn: position.column,
});
const suffix = model.getValueInRange({
startLineNumber: position.lineNumber,
startColumn: position.column,
endLineNumber: model.getLineCount(),
endColumn: model.getLineMaxColumn(model.getLineCount()),
});
try {
const resp = await fetch('/api/autocomplete', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
prefix,
suffix,
filepath: filePath || '',
language: model.getLanguageId(),
max_tokens: 64,
model: 'groq-llama-3.1-8b-instant',
}),
});
if (!resp.ok) return { items: [] };
const data = await resp.json();
const completions = data.completions || [];
return {
items: completions.map((c: any) => ({
insertText: c.text,
range: {
startLineNumber: position.lineNumber,
startColumn: position.column,
endLineNumber: position.lineNumber,
endColumn: position.column,
},
})),
};
} catch (e) {
return { items: [] };
}
},
freeInlineCompletions: () => {},
});
};
if (!filePath) return (
<div style={{ flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--text-secondary)', fontSize: 14 }}>
← Select a file from the explorer to start editing
</div>
);
return (
<Editor
height="100%"
defaultLanguage="typescript"
theme="vs-dark"
path={filePath}
onMount={handleEditorDidMount}
loading={<div style={{ color: 'var(--text-secondary)', padding: 20 }}>Loading editor...</div>}
options={{
fontSize: 13,
minimap: { enabled: true },
smoothScrolling: true,
cursorBlinking: 'smooth',
inlineSuggest: { enabled: true },
}}
/>
);
};
export default CodeEditor;