1
- import React , { useRef , useEffect } from 'react' ;
1
+ import React , { useRef , useEffect , useMemo } from 'react' ;
2
2
import { useTranslation } from 'react-i18next' ;
3
3
4
- import { bindActionCreators } from 'redux' ;
5
-
6
4
import { useSelector , useDispatch } from 'react-redux' ;
7
5
import classNames from 'classnames' ;
8
6
import { Console as ConsoleFeed } from 'console-feed' ;
9
- import warnLightUrl from '../../../images/console-warn-light.svg?byUrl' ;
10
- import warnDarkUrl from '../../../images/console-warn-dark.svg?byUrl' ;
11
- import warnContrastUrl from '../../../images/console-warn-contrast.svg?byUrl' ;
12
- import errorLightUrl from '../../../images/console-error-light.svg?byUrl' ;
13
- import errorDarkUrl from '../../../images/console-error-dark.svg?byUrl' ;
14
- import errorContrastUrl from '../../../images/console-error-contrast.svg?byUrl' ;
15
- import debugLightUrl from '../../../images/console-debug-light.svg?byUrl' ;
16
- import debugDarkUrl from '../../../images/console-debug-dark.svg?byUrl' ;
17
- import debugContrastUrl from '../../../images/console-debug-contrast.svg?byUrl' ;
18
- import infoLightUrl from '../../../images/console-info-light.svg?byUrl' ;
19
- import infoDarkUrl from '../../../images/console-info-dark.svg?byUrl' ;
20
- import infoContrastUrl from '../../../images/console-info-contrast.svg?byUrl' ;
21
7
import ConsoleInput from './ConsoleInput' ;
22
8
23
- import commandLightUrl from '../../../images/console-command-light.svg?byUrl' ;
24
- import resultLightUrl from '../../../images/console-result-light.svg?byUrl' ;
25
- import commandDarkUrl from '../../../images/console-command-dark.svg?byUrl' ;
26
- import resultDarkUrl from '../../../images/console-result-dark.svg?byUrl' ;
27
- import commandContrastUrl from '../../../images/console-command-contrast.svg?byUrl' ;
28
- import resultContrastUrl from '../../../images/console-result-contrast.svg?byUrl' ;
29
-
30
9
import UpArrowIcon from '../../../images/up-arrow.svg' ;
31
10
import DownArrowIcon from '../../../images/down-arrow.svg' ;
32
11
@@ -35,198 +14,40 @@ import * as ConsoleActions from '../../IDE/actions/console';
35
14
import { useDidUpdate } from '../hooks/custom-hooks' ;
36
15
import useHandleMessageEvent from '../hooks/useHandleMessageEvent' ;
37
16
import { listen } from '../../../utils/dispatcher' ;
38
-
39
- const CONSOLE_FEED_LIGHT_STYLES = {
40
- BASE_BACKGROUND_COLOR : '' ,
41
- LOG_ERROR_BACKGROUND : 'hsl(0, 100%, 97%)' ,
42
- LOG_ERROR_COLOR : '#D11518' ,
43
- LOG_ERROR_BORDER : 'hsl(0, 100%, 92%)' ,
44
- LOG_WARN_BACKGROUND : 'hsl(50, 100%, 95%)' ,
45
- LOG_WARN_COLOR : '#996B00' ,
46
- LOG_WARN_BORDER : 'hsl(50, 100%, 88%)' ,
47
- LOG_INFO_COLOR : '#4D4D4D' ,
48
- LOG_DEBUG_COLOR : '#0071AD' ,
49
- LOG_DEBUG_BACKGROUND : '#D6F1FF' ,
50
- LOG_DEBUG_BORDER : '#C2EBFF' ,
51
- LOG_COLOR : '#4D4D4D' ,
52
- ARROW_COLOR : '#666' ,
53
- OBJECT_NAME_COLOR : '#333' ,
54
- OBJECT_VALUE_NULL_COLOR : '#747474' ,
55
- OBJECT_VALUE_UNDEFINED_COLOR : '#747474' ,
56
- OBJECT_VALUE_STRING_COLOR : '#47820A' ,
57
- OBJECT_VALUE_REGEXP_COLOR : '#A06801' ,
58
- OBJECT_VALUE_NUMBER_COLOR : '#333' ,
59
- OBJECT_VALUE_BOOLEAN_COLOR : '#D52889' ,
60
- OBJECT_VALUE_FUNCTION_KEYWORD_COLOR : '#0B7CA9' ,
61
- LOG_AMOUNT_BACKGROUND : '#5276B7' ,
62
- LOG_AMOUNT_COLOR : '#FFF' ,
63
- LOG_WARN_AMOUNT_BACKGROUND : '#996B00' ,
64
- LOG_ERROR_AMOUNT_BACKGROUND : '#D11518' ,
65
- LOG_DEBUG_AMOUNT_BACKGROUND : '#0071AD'
66
- } ;
67
-
68
- const CONSOLE_FEED_DARK_STYLES = {
69
- BASE_BACKGROUND_COLOR : '' ,
70
- BASE_COLOR : 'white' ,
71
- OBJECT_NAME_COLOR : 'white' ,
72
- OBJECT_VALUE_NULL_COLOR : '#DE4A9B' ,
73
- OBJECT_VALUE_UNDEFINED_COLOR : '#DE4A9B' ,
74
- OBJECT_VALUE_REGEXP_COLOR : '#EE9900' ,
75
- OBJECT_VALUE_STRING_COLOR : '#58a10b' ,
76
- OBJECT_VALUE_SYMBOL_COLOR : 'hsl(230, 100%, 80%)' ,
77
- OBJECT_VALUE_NUMBER_COLOR : 'white' ,
78
- OBJECT_VALUE_BOOLEAN_COLOR : '#DE4A9B' ,
79
- OBJECT_VALUE_FUNCTION_KEYWORD_COLOR : '#b58318' ,
80
- LOG_ERROR_BACKGROUND : '#1F0000' ,
81
- LOG_ERROR_COLOR : '#DF3A3D' ,
82
- LOG_WARN_BACKGROUND : 'hsl(50, 100%, 10%)' ,
83
- LOG_WARN_COLOR : '#F5BC38' ,
84
- LOG_INFO_COLOR : '#D9D9D9' ,
85
- LOG_INFO_BORDER : '#4D4D4D' ,
86
- LOG_COLOR : '#D9D9D9' ,
87
- LOG_DEBUG_COLOR : '#0C99E2' ,
88
- LOG_DEBUG_BACKGROUND : '#05232E' ,
89
- LOG_DEBUG_BORDER : '#0C546E' ,
90
- TABLE_BORDER_COLOR : 'grey' ,
91
- TABLE_TH_BACKGROUND_COLOR : 'transparent' ,
92
- TABLE_TH_HOVER_COLOR : 'grey' ,
93
- TABLE_SORT_ICON_COLOR : 'grey' ,
94
- TABLE_DATA_BACKGROUND_IMAGE : 'grey' ,
95
- TABLE_DATA_BACKGROUND_SIZE : 'grey' ,
96
- ARROW_COLOR : '#D9D9D9' ,
97
- LOG_AMOUNT_BACKGROUND : '#5276B7' ,
98
- LOG_AMOUNT_COLOR : '#333' ,
99
- LOG_WARN_AMOUNT_BACKGROUND : '#996B00' ,
100
- LOG_ERROR_AMOUNT_BACKGROUND : '#D11518' ,
101
- LOG_DEBUG_AMOUNT_BACKGROUND : '#0071AD'
102
- } ;
103
-
104
- const CONSOLE_FEED_CONTRAST_STYLES = {
105
- BASE_BACKGROUND_COLOR : '' ,
106
- BASE_COLOR : 'white' ,
107
- OBJECT_NAME_COLOR : 'white' ,
108
- OBJECT_VALUE_NULL_COLOR : '#FFA9D9' ,
109
- OBJECT_VALUE_UNDEFINED_COLOR : '#FFA9D9' ,
110
- OBJECT_VALUE_REGEXP_COLOR : '#2DE9B6' ,
111
- OBJECT_VALUE_STRING_COLOR : '#2DE9B6' ,
112
- OBJECT_VALUE_SYMBOL_COLOR : '#B3BEFF' ,
113
- OBJECT_VALUE_NUMBER_COLOR : '#FFA9D9' ,
114
- OBJECT_VALUE_BOOLEAN_COLOR : '#FFA9D9' ,
115
- OBJECT_VALUE_FUNCTION_KEYWORD_COLOR : '#F5DC23' ,
116
- LOG_ERROR_BACKGROUND : '#1F0000' ,
117
- LOG_ERROR_COLOR : '#EA7B7D' ,
118
- LOG_WARN_BACKGROUND : 'hsl(50, 100%, 10%)' ,
119
- LOG_WARN_COLOR : '#F5BC38' ,
120
- LOG_INFO_COLOR : '#D9D9D9' ,
121
- LOG_INFO_BORDER : '#4D4D4D' ,
122
- LOG_COLOR : '#D9D9D9' ,
123
- LOG_DEBUG_COLOR : '#38B6F5' ,
124
- LOG_DEBUG_BACKGROUND : '#05232E' ,
125
- LOG_DEBUG_BORDER : '#0C546E' ,
126
- TABLE_BORDER_COLOR : 'grey' ,
127
- TABLE_TH_BACKGROUND_COLOR : 'transparent' ,
128
- TABLE_TH_HOVER_COLOR : 'grey' ,
129
- TABLE_SORT_ICON_COLOR : 'grey' ,
130
- TABLE_DATA_BACKGROUND_IMAGE : 'grey' ,
131
- TABLE_DATA_BACKGROUND_SIZE : 'grey' ,
132
- ARROW_COLOR : '#D9D9D9' ,
133
- LOG_AMOUNT_BACKGROUND : '#5276B7' ,
134
- LOG_AMOUNT_COLOR : '#333' ,
135
- LOG_WARN_AMOUNT_BACKGROUND : '#966C08' ,
136
- LOG_ERROR_AMOUNT_BACKGROUND : '#DD3134' ,
137
- LOG_DEBUG_AMOUNT_BACKGROUND : '#097BB3'
138
- } ;
139
-
140
- const getConsoleFeedStyle = ( theme , fontSize ) => {
141
- const style = {
142
- BASE_FONT_FAMILY : 'Inconsolata, monospace'
143
- } ;
144
- const CONSOLE_FEED_LIGHT_ICONS = {
145
- LOG_WARN_ICON : `url(${ warnLightUrl } )` ,
146
- LOG_ERROR_ICON : `url(${ errorLightUrl } )` ,
147
- LOG_DEBUG_ICON : `url(${ debugLightUrl } )` ,
148
- LOG_INFO_ICON : `url(${ infoLightUrl } )` ,
149
- LOG_COMMAND_ICON : `url(${ commandLightUrl } )` ,
150
- LOG_RESULT_ICON : `url(${ resultLightUrl } )`
151
- } ;
152
- const CONSOLE_FEED_DARK_ICONS = {
153
- LOG_WARN_ICON : `url(${ warnDarkUrl } )` ,
154
- LOG_ERROR_ICON : `url(${ errorDarkUrl } )` ,
155
- LOG_DEBUG_ICON : `url(${ debugDarkUrl } )` ,
156
- LOG_INFO_ICON : `url(${ infoDarkUrl } )` ,
157
- LOG_COMMAND_ICON : `url(${ commandDarkUrl } )` ,
158
- LOG_RESULT_ICON : `url(${ resultDarkUrl } )`
159
- } ;
160
- const CONSOLE_FEED_CONTRAST_ICONS = {
161
- LOG_WARN_ICON : `url(${ warnContrastUrl } )` ,
162
- LOG_ERROR_ICON : `url(${ errorContrastUrl } )` ,
163
- LOG_DEBUG_ICON : `url(${ debugContrastUrl } )` ,
164
- LOG_INFO_ICON : `url(${ infoContrastUrl } )` ,
165
- LOG_COMMAND_ICON : `url(${ commandContrastUrl } )` ,
166
- LOG_RESULT_ICON : `url(${ resultContrastUrl } )`
167
- } ;
168
- const CONSOLE_FEED_SIZES = {
169
- TREENODE_LINE_HEIGHT : 1.2 ,
170
- BASE_FONT_SIZE : `${ fontSize } px` ,
171
- ARROW_FONT_SIZE : `${ fontSize } px` ,
172
- LOG_ICON_WIDTH : `${ fontSize } px` ,
173
- LOG_ICON_HEIGHT : `${ 1.45 * fontSize } px`
174
- } ;
175
-
176
- switch ( theme ) {
177
- case 'light' :
178
- return Object . assign (
179
- CONSOLE_FEED_LIGHT_STYLES || { } ,
180
- CONSOLE_FEED_LIGHT_ICONS ,
181
- CONSOLE_FEED_SIZES ,
182
- style
183
- ) ;
184
- case 'dark' :
185
- return Object . assign (
186
- CONSOLE_FEED_DARK_STYLES || { } ,
187
- CONSOLE_FEED_DARK_ICONS ,
188
- CONSOLE_FEED_SIZES ,
189
- style
190
- ) ;
191
- case 'contrast' :
192
- return Object . assign (
193
- CONSOLE_FEED_CONTRAST_STYLES || { } ,
194
- CONSOLE_FEED_CONTRAST_ICONS ,
195
- CONSOLE_FEED_SIZES ,
196
- style
197
- ) ;
198
- default :
199
- return '' ;
200
- }
201
- } ;
17
+ import getConsoleFeedStyle from '../utils/consoleStyles' ;
202
18
203
19
const Console = ( ) => {
204
20
const { t } = useTranslation ( ) ;
205
21
const consoleEvents = useSelector ( ( state ) => state . console ) ;
206
22
const isExpanded = useSelector ( ( state ) => state . ide . consoleIsExpanded ) ;
207
23
const isPlaying = useSelector ( ( state ) => state . ide . isPlaying ) ;
208
24
const { theme, fontSize } = useSelector ( ( state ) => state . preferences ) ;
209
- const {
210
- collapseConsole,
211
- expandConsole,
212
- clearConsole,
213
- dispatchConsoleEvent
214
- } = bindActionCreators ( { ...IDEActions , ...ConsoleActions } , useDispatch ( ) ) ;
25
+ const dispatch = useDispatch ( ) ;
215
26
216
27
const cm = useRef ( { } ) ;
217
28
218
29
useDidUpdate ( ( ) => {
219
30
cm . current . scrollTop = cm . current . scrollHeight ;
220
31
} ) ;
221
32
33
+ const consoleFeedStyle = useMemo ( ( ) => getConsoleFeedStyle ( theme , fontSize ) , [
34
+ theme ,
35
+ fontSize
36
+ ] ) ;
37
+
222
38
const handleMessageEvent = useHandleMessageEvent ( ) ;
39
+
223
40
useEffect ( ( ) => {
224
41
const unsubscribe = listen ( handleMessageEvent ) ;
225
42
return function cleanup ( ) {
226
43
unsubscribe ( ) ;
227
44
} ;
228
45
} ) ;
229
46
47
+ const handleClearConsole = ( ) => dispatch ( ConsoleActions . clearConsole ( ) ) ;
48
+ const handleCollapseConsole = ( ) => dispatch ( IDEActions . collapseConsole ( ) ) ;
49
+ const handleExpandConsole = ( ) => dispatch ( IDEActions . expandConsole ( ) ) ;
50
+
230
51
const consoleClass = classNames ( {
231
52
'preview-console' : true ,
232
53
'preview-console--collapsed' : ! isExpanded
@@ -239,21 +60,21 @@ const Console = () => {
239
60
< div className = "preview-console__header-buttons" >
240
61
< button
241
62
className = "preview-console__clear"
242
- onClick = { clearConsole }
63
+ onClick = { handleClearConsole }
243
64
aria-label = { t ( 'Console.ClearARIA' ) }
244
65
>
245
66
{ t ( 'Console.Clear' ) }
246
67
</ button >
247
68
< button
248
69
className = "preview-console__collapse"
249
- onClick = { collapseConsole }
70
+ onClick = { handleCollapseConsole }
250
71
aria-label = { t ( 'Console.CloseARIA' ) }
251
72
>
252
73
< DownArrowIcon focusable = "false" aria-hidden = "true" />
253
74
</ button >
254
75
< button
255
76
className = "preview-console__expand"
256
- onClick = { expandConsole }
77
+ onClick = { handleExpandConsole }
257
78
aria-label = { t ( 'Console.OpenARIA' ) }
258
79
>
259
80
< UpArrowIcon focusable = "false" aria-hidden = "true" />
@@ -268,17 +89,13 @@ const Console = () => {
268
89
>
269
90
< ConsoleFeed
270
91
variant = { theme === 'light' ? 'light' : 'dark' }
271
- styles = { getConsoleFeedStyle ( theme , fontSize ) }
92
+ styles = { consoleFeedStyle }
272
93
logs = { consoleEvents }
273
94
key = { `${ theme } -${ fontSize } ` }
274
95
/>
275
96
</ div >
276
97
{ isExpanded && isPlaying && (
277
- < ConsoleInput
278
- theme = { theme }
279
- dispatchConsoleEvent = { dispatchConsoleEvent }
280
- fontSize = { fontSize }
281
- />
98
+ < ConsoleInput theme = { theme } fontSize = { fontSize } />
282
99
) }
283
100
</ div >
284
101
</ section >
0 commit comments