1
- import React , { useRef } from 'react' ;
1
+ import React , { useRef , useEffect } from 'react' ;
2
2
import PropTypes from 'prop-types' ;
3
3
import { withTranslation } from 'react-i18next' ;
4
4
@@ -25,33 +25,51 @@ import debugContrastUrl from '../../../images/console-debug-contrast.svg?byUrl';
25
25
import infoLightUrl from '../../../images/console-info-light.svg?byUrl' ;
26
26
import infoDarkUrl from '../../../images/console-info-dark.svg?byUrl' ;
27
27
import infoContrastUrl from '../../../images/console-info-contrast.svg?byUrl' ;
28
+ import ConsoleInput from './ConsoleInput' ;
29
+
30
+ import commandLightUrl from '../../../images/console-command-light.svg?byUrl' ;
31
+ import resultLightUrl from '../../../images/console-result-light.svg?byUrl' ;
32
+ import commandDarkUrl from '../../../images/console-command-dark.svg?byUrl' ;
33
+ import resultDarkUrl from '../../../images/console-result-dark.svg?byUrl' ;
34
+ import commandContrastUrl from '../../../images/console-command-contrast.svg?byUrl' ;
35
+ import resultContrastUrl from '../../../images/console-result-contrast.svg?byUrl' ;
28
36
29
37
import UpArrowIcon from '../../../images/up-arrow.svg' ;
30
38
import DownArrowIcon from '../../../images/down-arrow.svg' ;
31
39
32
40
import * as IDEActions from '../../IDE/actions/ide' ;
33
41
import * as ConsoleActions from '../../IDE/actions/console' ;
34
- import { useDidUpdate } from '../../../utils/custom-hooks' ;
42
+ import { useDidUpdate } from '../hooks/custom-hooks' ;
43
+ import useHandleMessageEvent from '../hooks/useHandleMessageEvent' ;
44
+ import { listen } from '../../../utils/dispatcher' ;
35
45
36
46
const getConsoleFeedStyle = ( theme , times , fontSize ) => {
37
- const style = { } ;
47
+ const style = {
48
+ BASE_FONT_FAMILY : 'Inconsolata, monospace'
49
+ } ;
38
50
const CONSOLE_FEED_LIGHT_ICONS = {
39
51
LOG_WARN_ICON : `url(${ warnLightUrl } )` ,
40
52
LOG_ERROR_ICON : `url(${ errorLightUrl } )` ,
41
53
LOG_DEBUG_ICON : `url(${ debugLightUrl } )` ,
42
- LOG_INFO_ICON : `url(${ infoLightUrl } )`
54
+ LOG_INFO_ICON : `url(${ infoLightUrl } )` ,
55
+ LOG_COMMAND_ICON : `url(${ commandLightUrl } )` ,
56
+ LOG_RESULT_ICON : `url(${ resultLightUrl } )`
43
57
} ;
44
58
const CONSOLE_FEED_DARK_ICONS = {
45
59
LOG_WARN_ICON : `url(${ warnDarkUrl } )` ,
46
60
LOG_ERROR_ICON : `url(${ errorDarkUrl } )` ,
47
61
LOG_DEBUG_ICON : `url(${ debugDarkUrl } )` ,
48
- LOG_INFO_ICON : `url(${ infoDarkUrl } )`
62
+ LOG_INFO_ICON : `url(${ infoDarkUrl } )` ,
63
+ LOG_COMMAND_ICON : `url(${ commandDarkUrl } )` ,
64
+ LOG_RESULT_ICON : `url(${ resultDarkUrl } )`
49
65
} ;
50
66
const CONSOLE_FEED_CONTRAST_ICONS = {
51
67
LOG_WARN_ICON : `url(${ warnContrastUrl } )` ,
52
68
LOG_ERROR_ICON : `url(${ errorContrastUrl } )` ,
53
69
LOG_DEBUG_ICON : `url(${ debugContrastUrl } )` ,
54
- LOG_INFO_ICON : `url(${ infoContrastUrl } )`
70
+ LOG_INFO_ICON : `url(${ infoContrastUrl } )` ,
71
+ LOG_COMMAND_ICON : `url(${ commandContrastUrl } )` ,
72
+ LOG_RESULT_ICON : `url(${ resultContrastUrl } )`
55
73
} ;
56
74
const CONSOLE_FEED_SIZES = {
57
75
TREENODE_LINE_HEIGHT : 1.2 ,
@@ -94,6 +112,7 @@ const getConsoleFeedStyle = (theme, times, fontSize) => {
94
112
const Console = ( { t } ) => {
95
113
const consoleEvents = useSelector ( ( state ) => state . console ) ;
96
114
const isExpanded = useSelector ( ( state ) => state . ide . consoleIsExpanded ) ;
115
+ const isPlaying = useSelector ( ( state ) => state . ide . isPlaying ) ;
97
116
const { theme, fontSize } = useSelector ( ( state ) => state . preferences ) ;
98
117
99
118
const {
@@ -103,17 +122,20 @@ const Console = ({ t }) => {
103
122
dispatchConsoleEvent
104
123
} = bindActionCreators ( { ...IDEActions , ...ConsoleActions } , useDispatch ( ) ) ;
105
124
106
- useDidUpdate ( ( ) => {
107
- clearConsole ( ) ;
108
- dispatchConsoleEvent ( consoleEvents ) ;
109
- } , [ theme , fontSize ] ) ;
110
-
111
125
const cm = useRef ( { } ) ;
112
126
113
127
useDidUpdate ( ( ) => {
114
128
cm . current . scrollTop = cm . current . scrollHeight ;
115
129
} ) ;
116
130
131
+ const handleMessageEvent = useHandleMessageEvent ( ) ;
132
+ useEffect ( ( ) => {
133
+ const unsubscribe = listen ( handleMessageEvent ) ;
134
+ return function cleanup ( ) {
135
+ unsubscribe ( ) ;
136
+ } ;
137
+ } ) ;
138
+
117
139
const consoleClass = classNames ( {
118
140
'preview-console' : true ,
119
141
'preview-console--collapsed' : ! isExpanded
@@ -147,29 +169,39 @@ const Console = ({ t }) => {
147
169
</ button >
148
170
</ div >
149
171
</ header >
150
- < div ref = { cm } className = "preview-console__messages" >
151
- { consoleEvents . map ( ( consoleEvent ) => {
152
- const { method, times } = consoleEvent ;
153
- return (
154
- < div
155
- key = { consoleEvent . id }
156
- className = { `preview-console__message preview-console__message--${ method } ` }
157
- >
158
- { times > 1 && (
159
- < div
160
- className = "preview-console__logged-times"
161
- style = { { fontSize, borderRadius : fontSize / 2 } }
162
- >
163
- { times }
164
- </ div >
165
- ) }
166
- < ConsoleFeed
167
- styles = { getConsoleFeedStyle ( theme , times , fontSize ) }
168
- logs = { [ consoleEvent ] }
169
- />
170
- </ div >
171
- ) ;
172
- } ) }
172
+ < div className = "preview-console__body" >
173
+ < div ref = { cm } className = "preview-console__messages" >
174
+ { consoleEvents . map ( ( consoleEvent ) => {
175
+ const { method, times } = consoleEvent ;
176
+ return (
177
+ < div
178
+ key = { consoleEvent . id }
179
+ className = { `preview-console__message preview-console__message--${ method } ` }
180
+ >
181
+ { times > 1 && (
182
+ < div
183
+ className = "preview-console__logged-times"
184
+ style = { { fontSize, borderRadius : fontSize / 2 } }
185
+ >
186
+ { times }
187
+ </ div >
188
+ ) }
189
+ < ConsoleFeed
190
+ styles = { getConsoleFeedStyle ( theme , times , fontSize ) }
191
+ logs = { [ consoleEvent ] }
192
+ key = { `${ consoleEvent . id } -${ theme } -${ fontSize } ` }
193
+ />
194
+ </ div >
195
+ ) ;
196
+ } ) }
197
+ </ div >
198
+ { isExpanded && isPlaying && (
199
+ < ConsoleInput
200
+ theme = { theme }
201
+ dispatchConsoleEvent = { dispatchConsoleEvent }
202
+ fontSize = { fontSize }
203
+ />
204
+ ) }
173
205
</ div >
174
206
</ section >
175
207
) ;
0 commit comments