11import MonacoEditor from "@monaco-editor/react" ;
22import { useState } from "react" ;
3+ import { themeList } from "./themes" ;
34
4- export function Editor ( { setCode, defaultCode } ) {
5- function handleEditorChange ( value , event ) {
6- setCode ( value ) ;
7- }
5+ const tabs = {
6+ mdx : {
7+ lang : "markdown" ,
8+ code : ( input ) => input . mdx ,
9+ } ,
10+ css : {
11+ lang : "css" ,
12+ code : ( input ) => input . css ,
13+ } ,
14+ config : {
15+ lang : "json" ,
16+ code : ( input ) => JSON . stringify ( input . config , null , 2 ) ,
17+ } ,
18+ } ;
819
20+ export function Editor ( { setInput, input } ) {
921 const [ tab , setTab ] = useState ( "mdx" ) ;
22+
23+ function handleEditorChange ( code ) {
24+ let value = code ;
25+ setInput ( ( prev ) => ( { ...prev , [ tab ] : value } ) ) ;
26+ }
27+
1028 return (
1129 < div className = "editor-side" >
1230 < nav >
@@ -32,27 +50,72 @@ export function Editor({ setCode, defaultCode }) {
3250 Config
3351 </ span >
3452 </ nav >
35- < MonacoEditor
36- className = "editor"
37- onChange = { handleEditorChange }
38- defaultLanguage = "markdown"
39- theme = "vs-dark"
40- defaultValue = { defaultCode }
41- options = { {
42- // https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IEditorConstructionOptions.html
43- minimap : {
44- enabled : false ,
45- } ,
46- lineNumbers : "off" ,
47- scrollBeyondLastLine : false ,
48- hideCursorInOverviewRuler : true ,
49- matchBrackets : false ,
50- overviewRulerBorder : false ,
51- renderLineHighlight : "none" ,
52- wordWrap : "on" ,
53- tabSize : 2 ,
54- } }
55- />
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+ ) }
5680 </ div >
5781 ) ;
5882}
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