1
1
import React , { CSSProperties , FunctionComponent , useCallback } from 'react' ;
2
2
import PageContainer from '../../layouts/pages/pageContainer/PageContainer' ;
3
3
import styles from './HtmlEditorPage.module.scss' ;
4
- import { Col , Row , Tabs } from 'antd' ;
4
+ import { Button , Col , Row , Tabs } from 'antd' ;
5
5
import { useLocalstorageState } from 'rooks' ;
6
6
import getLocalStorageKey from '../../utils/getLocalStorageKey' ;
7
7
import useChangeStateHandler from '../../hooks/useChangeStateHandler' ;
@@ -14,6 +14,9 @@ import Javascript from '@mui/icons-material/Javascript';
14
14
import { OnMount } from '@monaco-editor/react' ;
15
15
import { emmetCSS , emmetHTML , emmetJSX } from 'emmet-monaco-es' ;
16
16
import { editor } from 'monaco-editor' ;
17
+ import ButtonGroup from 'antd/lib/button/button-group' ;
18
+ import { VerticalSplit , ViewHeadline } from '@mui/icons-material' ;
19
+ import useChangeValueStateHandler from '../../hooks/useChangeValueStateHandler' ;
17
20
18
21
enum EditorTab {
19
22
HTML = 'html' ,
@@ -58,6 +61,23 @@ const editorOptions: editor.IStandaloneEditorConstructionOptions = {
58
61
minimap : { enabled : false }
59
62
} ;
60
63
64
+ enum ViewMode {
65
+ EDITOR = 'EDITOR' ,
66
+ SPLIT = 'SPLIT' ,
67
+ VIEW = 'VIEW'
68
+ }
69
+
70
+ // const viewModes: CheckboxOptionType[] = [
71
+ // {
72
+ // value: ViewMode.EDITOR,
73
+ // label: <ViewHeadline/>
74
+ // },
75
+ // {
76
+ // value: ViewMode.SPLIT,
77
+ // label: <VerticalSplit/>
78
+ // }
79
+ // ];
80
+
61
81
const HtmlEditorPage : FunctionComponent = ( ) => {
62
82
const [ sources , setSources ] = useLocalstorageState < EditorSources > (
63
83
getLocalStorageKey ( 'html-editor' , 'sources' ) ,
@@ -69,12 +89,19 @@ const HtmlEditorPage: FunctionComponent = () => {
69
89
EditorTab . HTML
70
90
) ;
71
91
92
+ const [ viewMode , setViewMode ] = useLocalstorageState < ViewMode > (
93
+ getLocalStorageKey ( 'html-editor' , 'viewMode' ) ,
94
+ ViewMode . SPLIT
95
+ ) ;
96
+
72
97
const handleSourceChange = useChangeStateHandler ( setSources ) ;
73
98
74
99
const handleEditorTabChange = useCallback ( ( tab : string ) => {
75
100
setEditorTab ( tab as EditorTab ) ;
76
101
} , [ ] ) ;
77
102
103
+ const handleViewModeChange = useChangeValueStateHandler ( setViewMode ) ;
104
+
78
105
const resultSource = useDebouncedMemo (
79
106
{ sources } ,
80
107
( { sources } ) => {
@@ -99,16 +126,47 @@ ${sources.js}
99
126
emmetJSX ( monaco ) ;
100
127
} , [ ] ) ;
101
128
129
+ const leftColSpan = {
130
+ [ ViewMode . EDITOR ] : 24 ,
131
+ [ ViewMode . SPLIT ] : 12 ,
132
+ [ ViewMode . VIEW ] : 0
133
+ } [ viewMode ] ;
134
+
135
+ const rightColSpan = {
136
+ [ ViewMode . EDITOR ] : 0 ,
137
+ [ ViewMode . SPLIT ] : 12 ,
138
+ [ ViewMode . VIEW ] : 24
139
+ } [ viewMode ] ;
140
+
102
141
return (
103
142
< PageContainer noPadding className = { styles . container } >
104
143
< Row className = { styles . containerRow } >
105
- < Col span = { 12 } className = { classNames ( styles . col , styles . leftCol ) } >
144
+ < Col
145
+ span = { leftColSpan }
146
+ className = { classNames ( styles . col , styles . leftCol , { 'd-none' : viewMode === ViewMode . VIEW } ) }
147
+ >
106
148
< Tabs
107
149
activeKey = { editorTab }
108
150
onChange = { handleEditorTabChange }
109
151
tabBarStyle = { tabBarStyle }
110
152
className = { styles . editorTabs }
111
153
tabBarGutter = { 10 }
154
+ tabBarExtraContent = {
155
+ < ButtonGroup >
156
+ < Button
157
+ type = "text"
158
+ icon = { < ViewHeadline /> }
159
+ className = { classNames ( { 'antd-text-primary' : viewMode === ViewMode . EDITOR } ) }
160
+ onClick = { handleViewModeChange ( ViewMode . EDITOR ) }
161
+ />
162
+ < Button
163
+ type = "text"
164
+ icon = { < VerticalSplit /> }
165
+ className = { classNames ( { 'antd-text-primary' : viewMode === ViewMode . SPLIT } ) }
166
+ onClick = { handleViewModeChange ( ViewMode . SPLIT ) }
167
+ />
168
+ </ ButtonGroup >
169
+ }
112
170
>
113
171
< Tabs . TabPane
114
172
tab = {
@@ -166,7 +224,12 @@ ${sources.js}
166
224
</ Tabs . TabPane >
167
225
</ Tabs >
168
226
</ Col >
169
- < Col span = { 12 } className = { classNames ( 'yui3-cssreset' , styles . col , styles . rightCol ) } >
227
+ < Col
228
+ span = { rightColSpan }
229
+ className = { classNames ( 'yui3-cssreset' , styles . col , styles . rightCol , {
230
+ 'd-none' : viewMode === ViewMode . EDITOR
231
+ } ) }
232
+ >
170
233
< iframe srcDoc = { resultSource } className = { styles . resultFrame } />
171
234
</ Col >
172
235
</ Row >
0 commit comments