11import MonacoEditor from "@monaco-editor/react" ;
22import { useState } from "react" ;
3+ import { themeList } from "./themes" ;
34
45const tabs = {
56 mdx : {
@@ -19,12 +20,8 @@ const tabs = {
1920export function Editor ( { setInput, input } ) {
2021 const [ tab , setTab ] = useState ( "mdx" ) ;
2122
22- function handleEditorChange ( code , event ) {
23+ function handleEditorChange ( code ) {
2324 let value = code ;
24- if ( tab === "config" ) {
25- console . log ( { code } ) ;
26- value = JSON . parse ( code ) ;
27- }
2825 setInput ( ( prev ) => ( { ...prev , [ tab ] : value } ) ) ;
2926 }
3027
@@ -53,28 +50,72 @@ export function Editor({ setInput, input }) {
5350 Config
5451 </ span >
5552 </ nav >
56- < MonacoEditor
57- className = "editor"
58- onChange = { handleEditorChange }
59- theme = "vs-dark"
60- path = { tab }
61- defaultLanguage = { tabs [ tab ] . lang }
62- defaultValue = { tabs [ tab ] . code ( input ) }
63- options = { {
64- // https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IEditorConstructionOptions.html
65- minimap : {
66- enabled : false ,
67- } ,
68- lineNumbers : "off" ,
69- scrollBeyondLastLine : false ,
70- hideCursorInOverviewRuler : true ,
71- matchBrackets : false ,
72- overviewRulerBorder : false ,
73- renderLineHighlight : "none" ,
74- wordWrap : "on" ,
75- tabSize : 2 ,
76- } }
77- />
53+ { tab === "config" ? (
54+ < ConfigEditor config = { input . config } onChange = { handleEditorChange } />
55+ ) : (
56+ < div className = "editor" >
57+ < MonacoEditor
58+ onChange = { handleEditorChange }
59+ theme = "vs-dark"
60+ path = { tab }
61+ defaultLanguage = { tabs [ tab ] . lang }
62+ defaultValue = { tabs [ tab ] . code ( input ) }
63+ options = { {
64+ // https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IEditorConstructionOptions.html
65+ minimap : {
66+ enabled : false ,
67+ } ,
68+ lineNumbers : "off" ,
69+ scrollBeyondLastLine : false ,
70+ hideCursorInOverviewRuler : true ,
71+ matchBrackets : false ,
72+ overviewRulerBorder : false ,
73+ renderLineHighlight : "none" ,
74+ wordWrap : "on" ,
75+ tabSize : 2 ,
76+ } }
77+ />
78+ </ div >
79+ ) }
7880 </ div >
7981 ) ;
8082}
83+
84+ function ConfigEditor ( { config, onChange } ) {
85+ return (
86+ < form className = "editor config-editor" >
87+ < label >
88+ < input
89+ type = "checkbox"
90+ checked = { config . lineNumbers }
91+ onChange = { ( e ) =>
92+ onChange ( { ...config , lineNumbers : e . target . checked } )
93+ }
94+ />
95+ Line Numbers
96+ </ label >
97+ < label >
98+ < input
99+ type = "checkbox"
100+ checked = { config . showCopyButton }
101+ onChange = { ( e ) =>
102+ onChange ( { ...config , showCopyButton : e . target . checked } )
103+ }
104+ />
105+ Copy Button
106+ </ label >
107+ < label >
108+ Theme:
109+ < br />
110+ < select
111+ value = { config . theme }
112+ onChange = { ( e ) => onChange ( { ...config , theme : e . target . value } ) }
113+ >
114+ { themeList ( ) . map ( ( theme ) => (
115+ < option key = { theme } > { theme } </ option >
116+ ) ) }
117+ </ select >
118+ </ label >
119+ </ form >
120+ ) ;
121+ }
0 commit comments