1
1
import MonacoEditor from "@monaco-editor/react" ;
2
2
import { useState } from "react" ;
3
+ import { themeList } from "./themes" ;
3
4
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
+ } ;
8
19
20
+ export function Editor ( { setInput, input } ) {
9
21
const [ tab , setTab ] = useState ( "mdx" ) ;
22
+
23
+ function handleEditorChange ( code ) {
24
+ let value = code ;
25
+ setInput ( ( prev ) => ( { ...prev , [ tab ] : value } ) ) ;
26
+ }
27
+
10
28
return (
11
29
< div className = "editor-side" >
12
30
< nav >
@@ -32,27 +50,72 @@ export function Editor({ setCode, defaultCode }) {
32
50
Config
33
51
</ span >
34
52
</ 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
+ ) }
56
80
</ div >
57
81
) ;
58
82
}
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