Skip to content

Commit 840836d

Browse files
committed
Integrated Monaco Code Editor, Completing Issue #192
1 parent 4d478b7 commit 840836d

2 files changed

Lines changed: 42 additions & 69 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"private": true,
55
"homepage": "https://controlcore-project.github.io/concore-editor",
66
"dependencies": {
7+
"@monaco-editor/react": "^4.4.5",
78
"@szhsin/react-menu": "^1.10.0",
89
"@testing-library/jest-dom": "^5.11.4",
910
"@testing-library/react": "^11.1.0",
@@ -20,7 +21,7 @@
2021
"konva": "^7.0.3",
2122
"md5": "^2.3.0",
2223
"moment": "^2.29.4",
23-
"prismjs": "^1.29.0",
24+
"prismjs": "^1.30.0",
2425
"rc-slider": "^9.7.2",
2526
"rc-switch": "^3.2.2",
2627
"react": "^17.0.2",

src/component/modals/FileEdit.jsx

Lines changed: 40 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,15 @@
11
import React, { useState, useEffect } from 'react';
2-
import Editor from 'react-simple-code-editor';
3-
import { highlight, languages } from 'prismjs/components/prism-core';
2+
import Editor from '@monaco-editor/react';
43
import { saveAs } from 'file-saver';
54
import Modal from './ParentModal';
65
import './file-edit.css';
7-
import 'prismjs/components/prism-bash';
8-
import 'prismjs/components/prism-clike';
9-
import 'prismjs/components/prism-c';
10-
import 'prismjs/components/prism-cpp';
11-
import 'prismjs/components/prism-matlab';
12-
import 'prismjs/components/prism-verilog';
13-
import 'prismjs/components/prism-python';
14-
import 'prismjs/components/prism-javascript';
15-
import 'prismjs/themes/prism.css';
166
import { actionType as T } from '../../reducer';
177

188
const FileEditModal = ({ superState, dispatcher }) => {
199
const [codeStuff, setCodeStuff] = useState('');
2010
const [fileName, setFileName] = useState('');
2111
const [dirButton, setDirButton] = useState(false);
12+
const [language, setLanguage] = useState('plaintext');
2213

2314
useEffect(() => {
2415
if (navigator.userAgent.indexOf('Edg') !== -1 || navigator.userAgent.indexOf('Chrome') !== -1) {
@@ -38,7 +29,6 @@ const FileEditModal = ({ superState, dispatcher }) => {
3829
await stream.write(codeStuff);
3930
await stream.close();
4031
} else {
41-
// eslint-disable-next-line no-alert
4232
alert('Switch to Edge/Chrome!');
4333
}
4434
dispatcher({ type: T.EDIT_TEXTFILE, payload: { show: false } });
@@ -59,48 +49,45 @@ const FileEditModal = ({ superState, dispatcher }) => {
5949
fileHandle: handle,
6050
}]);
6151
dispatcher({ type: T.SET_FILE_STATE, payload: fS });
62-
// dispatcher({ type: T.EDIT_TEXTFILE, payload: { show: false } });
6352
}
6453

6554
async function saveSubmit() {
66-
// eslint-disable-next-line no-alert
6755
const newFileName = prompt('Filename:');
6856
const bytes = new TextEncoder().encode(codeStuff);
6957
const blob = new Blob([bytes], { type: 'application/json;charset=utf-8' });
7058
saveAs(blob, newFileName);
71-
// dispatcher({ type: T.EDIT_TEXTFILE, payload: { show: false } });
7259
}
7360

74-
useEffect(async () => {
75-
if (superState.fileObj) {
76-
setFileName(superState.fileObj.name);
77-
const fr = new FileReader();
78-
fr.onload = (x) => {
79-
setCodeStuff(x.target.result);
80-
};
81-
if (superState.fileHandle) fr.readAsText(await superState.fileHandle.getFile());
82-
else fr.readAsText(superState.fileObj);
61+
useEffect(() => {
62+
async function loadFile() {
63+
if (superState.fileObj) {
64+
setFileName(superState.fileObj.name);
65+
const fr = new FileReader();
66+
fr.onload = (x) => {
67+
setCodeStuff(x.target.result);
68+
};
69+
if (superState.fileHandle) fr.readAsText(await superState.fileHandle.getFile());
70+
else fr.readAsText(superState.fileObj);
71+
}
8372
}
73+
loadFile();
8474
}, [superState.fileObj]);
8575

86-
function highlightSyntax(code) {
87-
const extensions = ['v', 'c', 'h', 'hpp', 'cpp', 'py', 'm', 'sh'];
76+
useEffect(() => {
77+
if (!fileName) return;
8878
const fileEx = fileName.split('.').pop();
89-
if (extensions.includes(fileEx)) {
90-
switch (fileEx) {
91-
case 'v': return highlight(code, languages.verilog, 'verilog');
92-
case 'c': return highlight(code, languages.c, 'c');
93-
case 'h': return highlight(code, languages.c, 'c');
94-
case 'hpp': return highlight(code, languages.c, 'c');
95-
case 'cpp': return highlight(code, languages.cpp, 'cpp');
96-
case 'py': return highlight(code, languages.python, 'python');
97-
case 'm': return highlight(code, languages.matlab, 'matlab');
98-
case 'sh': return highlight(code, languages.bash, 'bash');
99-
default: return highlight(code, languages.plaintext);
100-
}
101-
}
102-
return highlight(code, languages.plaintext);
103-
}
79+
const langMap = {
80+
v: 'verilog',
81+
c: 'c',
82+
h: 'c',
83+
hpp: 'cpp',
84+
cpp: 'cpp',
85+
py: 'python',
86+
m: 'matlab',
87+
sh: 'bash',
88+
};
89+
setLanguage(langMap[fileEx] || 'plaintext');
90+
}, [fileName]);
10491

10592
return (
10693
<Modal
@@ -109,41 +96,26 @@ const FileEditModal = ({ superState, dispatcher }) => {
10996
title={fileName}
11097
>
11198
<div>
112-
<div className="save-bar">
113-
{fileName
114-
&& (
115-
<button type="submit" className="btn btn-primary" onClick={submit}>Save</button>
116-
)}
117-
{dirButton && (
118-
<button type="submit" className="btn btn-primary" onClick={saveAsSubmit}>
119-
Save
120-
{fileName ? ' As' : ''}
121-
</button>
122-
)}
123-
{!dirButton && (
124-
<button type="submit" className="btn btn-primary" onClick={saveSubmit}>Save As</button>
125-
)}
126-
</div>
12799
<div className="setting-container">
128100
<Editor
101+
height="60vh"
102+
language={language}
103+
theme="vs-light"
129104
value={codeStuff}
130-
onValueChange={(e) => setCodeStuff(e)}
131-
highlight={(code) => highlightSyntax(code)}
132-
padding={10}
133-
style={{
134-
fontFamily: '"Arial", "Helvetica", sans-serif',
105+
onChange={(value) => setCodeStuff(value)}
106+
options={{
107+
inlineSuggest: true,
135108
fontSize: 16,
136-
minHeight: '100vh',
137-
minWidth: '90vw',
138-
border: '1px solid black',
109+
formatOnType: true,
110+
autoClosingBrackets: true,
111+
minimap: { enabled: true },
139112
}}
140113
/>
141114
</div>
142115
<div className="save-bar">
143-
{fileName
144-
&& (
145-
<button type="submit" className="btn btn-primary" onClick={submit}>Save</button>
146-
)}
116+
{fileName && (
117+
<button type="submit" className="btn btn-primary" onClick={submit}>Save</button>
118+
)}
147119
{dirButton && (
148120
<button type="submit" className="btn btn-primary" onClick={saveAsSubmit}>Save As</button>
149121
)}

0 commit comments

Comments
 (0)