11import 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' ;
43import { saveAs } from 'file-saver' ;
54import Modal from './ParentModal' ;
65import './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' ;
166import { actionType as T } from '../../reducer' ;
177
188const 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