1
1
import React , { Component } from 'react' ;
2
+ import { Modal } from 'react-bootstrap' ;
2
3
import PropTypes from 'prop-types' ;
3
4
import SplitPane from 'react-split-pane' ;
4
5
import UASTViewer , { Editor , withUASTEditor } from 'uast-viewer' ;
6
+ import Switch from 'react-switch' ;
5
7
import api from '../api' ;
6
8
import './CodeViewer.less' ;
7
9
8
- function EditorPane ( {
9
- languages,
10
- language,
11
- showUast,
12
- handleLangChange,
13
- handleShowUastChange,
14
- editorProps
15
- } ) {
10
+ function EditorPane ( { languages, language, handleLangChange, editorProps } ) {
16
11
return (
17
12
< div className = "editor-pane" >
18
13
Language:{ ' ' }
@@ -24,14 +19,6 @@ function EditorPane({
24
19
</ option >
25
20
) ) }
26
21
</ select >
27
- < label >
28
- < input
29
- type = "checkbox"
30
- checked = { showUast }
31
- onChange = { handleShowUastChange }
32
- disabled = { ! language }
33
- /> UAST
34
- </ label >
35
22
< Editor { ...editorProps } theme = "default" />
36
23
</ div >
37
24
) ;
@@ -43,30 +30,24 @@ EditorPane.propTypes = {
43
30
id : PropTypes . string . isRequired ,
44
31
name : PropTypes . string . isRequired
45
32
} )
46
- ) ,
33
+ ) . isRequired ,
47
34
language : PropTypes . string ,
48
- showUast : PropTypes . bool ,
49
35
handleLangChange : PropTypes . func . isRequired ,
50
- handleShowUastChange : PropTypes . func . isRequired ,
51
36
editorProps : PropTypes . object
52
37
} ;
53
38
54
39
function EditorUASTSpitPane ( {
55
40
languages,
56
41
editorProps,
57
42
uastViewerProps,
58
- showUast,
59
- handleLangChange,
60
- handleShowUastChange
43
+ handleLangChange
61
44
} ) {
62
45
return (
63
46
< SplitPane split = "vertical" defaultSize = { 250 } minSize = { 175 } >
64
47
< EditorPane
65
48
languages = { languages }
66
49
language = { editorProps . languageMode }
67
- showUast = { showUast }
68
50
handleLangChange = { handleLangChange }
69
- handleShowUastChange = { handleShowUastChange }
70
51
editorProps = { editorProps }
71
52
/>
72
53
{ uastViewerProps . uast ? < UASTViewer { ...uastViewerProps } /> : < div /> }
@@ -78,9 +59,7 @@ EditorUASTSpitPane.propTypes = {
78
59
languages : EditorPane . propTypes . languages ,
79
60
editorProps : PropTypes . object ,
80
61
uastViewerProps : PropTypes . object ,
81
- showUast : PropTypes . bool ,
82
- handleLangChange : PropTypes . func . isRequired ,
83
- handleShowUastChange : PropTypes . func . isRequired
62
+ handleLangChange : PropTypes . func . isRequired
84
63
} ;
85
64
86
65
const EditorWithUAST = withUASTEditor ( EditorUASTSpitPane ) ;
@@ -156,51 +135,74 @@ class CodeViewer extends Component {
156
135
157
136
render ( ) {
158
137
const { loading, language, showUast, uast, error } = this . state ;
138
+ const { showModal, onHide, code, languages } = this . props ;
159
139
160
140
if ( loading ) {
161
141
return 'loading' ;
162
142
}
163
143
164
- if ( showUast ) {
165
- return (
166
- < div className = "code-viewer" >
167
- < EditorWithUAST
168
- languages = { this . props . languages }
169
- code = { this . props . code }
170
- languageMode = { language }
171
- showUast = { showUast }
172
- handleLangChange = { this . handleLangChange }
173
- handleShowUastChange = { this . handleShowUastChange }
174
- uast = { uast }
175
- />
176
- { error ? (
177
- < div className = "error" >
178
- < button onClick = { this . removeError } className = "close" >
179
- close
180
- </ button >
181
- { error }
182
- </ div >
183
- ) : null }
184
- </ div >
185
- ) ;
186
- }
187
-
188
144
return (
189
- < EditorPane
190
- languages = { this . props . languages }
191
- language = { language }
192
- showUast = { showUast }
193
- handleLangChange = { this . handleLangChange }
194
- handleShowUastChange = { this . handleShowUastChange }
195
- editorProps = { { code : this . props . code , languageMode : language } }
196
- />
145
+ < Modal show = { showModal } onHide = { onHide } bsSize = "large" >
146
+ < Modal . Header closeButton >
147
+ < Modal . Title >
148
+ CODE
149
+ < Switch
150
+ checked = { showUast }
151
+ onChange = { this . handleShowUastChange }
152
+ disabled = { ! language }
153
+ checkedIcon = { < span className = "switch-text checked" > UAST</ span > }
154
+ uncheckedIcon = {
155
+ < span className = "switch-text unchecked" > UAST</ span >
156
+ }
157
+ width = { 100 }
158
+ handleDiameter = { 20 }
159
+ className = { `code-toggler ${ showUast ? 'checked' : 'unchecked' } ` }
160
+ aria-label = "Toggle UAST view"
161
+ />
162
+ </ Modal . Title >
163
+ </ Modal . Header >
164
+ < Modal . Body >
165
+ { showUast ? (
166
+ < div className = "code-viewer" >
167
+ < EditorWithUAST
168
+ languages = { languages }
169
+ code = { code }
170
+ languageMode = { language }
171
+ showUast = { showUast }
172
+ handleLangChange = { this . handleLangChange }
173
+ handleShowUastChange = { this . handleShowUastChange }
174
+ uast = { uast }
175
+ />
176
+ { error ? (
177
+ < div className = "error" >
178
+ < button onClick = { this . removeError } className = "close" >
179
+ close
180
+ </ button >
181
+ { error }
182
+ </ div >
183
+ ) : null }
184
+ </ div >
185
+ ) : (
186
+ < EditorPane
187
+ languages = { languages }
188
+ language = { language }
189
+ showUast = { showUast }
190
+ handleLangChange = { this . handleLangChange }
191
+ handleShowUastChange = { this . handleShowUastChange }
192
+ editorProps = { { code, languageMode : language } }
193
+ />
194
+ ) }
195
+ </ Modal . Body >
196
+ </ Modal >
197
197
) ;
198
198
}
199
199
}
200
200
201
201
CodeViewer . propTypes = {
202
- code : PropTypes . string . isRequired ,
203
- languages : EditorPane . propTypes . languages
202
+ code : PropTypes . string ,
203
+ languages : EditorPane . propTypes . languages ,
204
+ showModal : PropTypes . bool . isRequired ,
205
+ onHide : PropTypes . func . isRequired
204
206
} ;
205
207
206
208
export default CodeViewer ;
0 commit comments