import React, { useEffect, useState } from 'react'; import Editor from '@monaco-editor/react'; import { upload } from '../../../assets/icons/input'; import { cn } from '../../../lib/cn'; import { DropDownList } from '../../../components/input/DropDownList'; const languageMap: Record = { c: 'cpp', 'C++': 'cpp', java: 'java', python: 'python', pascal: 'pascal', kotlin: 'kotlin', csharp: 'csharp', }; export interface CodeEditorProps { onChange: (value: string) => void; onChangeLanguage: (value: string) => void; } const CodeEditor: React.FC = ({ onChange, onChangeLanguage, }) => { const [language, setLanguage] = useState('C++'); const [code, setCode] = useState(''); const [isDragging, setIsDragging] = useState(false); const items = [ { value: 'c', text: 'C' }, { value: 'C++', text: 'C++' }, { value: 'java', text: 'Java' }, { value: 'python', text: 'Python' }, { value: 'pascal', text: 'Pascal' }, { value: 'kotlin', text: 'Kotlin' }, { value: 'csharp', text: 'C#' }, ]; useEffect(() => { onChange(code); }, [code]); useEffect(() => { onChangeLanguage(language); }, [language]); const handleFileUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; const reader = new FileReader(); reader.onload = (event) => { const text = event.target?.result; if (typeof text === 'string') setCode(text); }; reader.readAsText(file); e.target.value = ''; }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); const droppedFile = e.dataTransfer.files[0]; if (!droppedFile) return; const reader = new FileReader(); reader.onload = (event) => { const text = event.target?.result; if (typeof text === 'string') setCode(text); }; reader.readAsText(droppedFile); }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); // обязательно }; const handleDragEnter = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(true); }; const handleDragLeave = (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); }; return (
{/* Панель выбора языка и загрузки файла */}
{ setLanguage(v); }} defaultState={{ value: 'C++', text: 'C++' }} />
{/* Monaco Editor */}
setCode(value ?? '')} theme="vs-dark" options={{ fontSize: 14, minimap: { enabled: false }, automaticLayout: true, quickSuggestions: true, suggestOnTriggerCharacters: true, tabSize: 4, insertSpaces: true, detectIndentation: false, autoIndent: 'full', }} />
); }; export default CodeEditor;