1- import React , { useRef } from 'react' ;
1+ import React , { useRef , useEffect } from 'react' ;
22import PropTypes from 'prop-types' ;
33import { withTranslation } from 'react-i18next' ;
44
@@ -25,33 +25,51 @@ import debugContrastUrl from '../../../images/console-debug-contrast.svg?byUrl';
2525import infoLightUrl from '../../../images/console-info-light.svg?byUrl' ;
2626import infoDarkUrl from '../../../images/console-info-dark.svg?byUrl' ;
2727import 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' ;
2836
2937import UpArrowIcon from '../../../images/up-arrow.svg' ;
3038import DownArrowIcon from '../../../images/down-arrow.svg' ;
3139
3240import * as IDEActions from '../../IDE/actions/ide' ;
3341import * 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' ;
3545
3646const getConsoleFeedStyle = ( theme , times , fontSize ) => {
37- const style = { } ;
47+ const style = {
48+ BASE_FONT_FAMILY : 'Inconsolata, monospace'
49+ } ;
3850 const CONSOLE_FEED_LIGHT_ICONS = {
3951 LOG_WARN_ICON : `url(${ warnLightUrl } )` ,
4052 LOG_ERROR_ICON : `url(${ errorLightUrl } )` ,
4153 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 } )`
4357 } ;
4458 const CONSOLE_FEED_DARK_ICONS = {
4559 LOG_WARN_ICON : `url(${ warnDarkUrl } )` ,
4660 LOG_ERROR_ICON : `url(${ errorDarkUrl } )` ,
4761 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 } )`
4965 } ;
5066 const CONSOLE_FEED_CONTRAST_ICONS = {
5167 LOG_WARN_ICON : `url(${ warnContrastUrl } )` ,
5268 LOG_ERROR_ICON : `url(${ errorContrastUrl } )` ,
5369 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 } )`
5573 } ;
5674 const CONSOLE_FEED_SIZES = {
5775 TREENODE_LINE_HEIGHT : 1.2 ,
@@ -94,6 +112,7 @@ const getConsoleFeedStyle = (theme, times, fontSize) => {
94112const Console = ( { t } ) => {
95113 const consoleEvents = useSelector ( ( state ) => state . console ) ;
96114 const isExpanded = useSelector ( ( state ) => state . ide . consoleIsExpanded ) ;
115+ const isPlaying = useSelector ( ( state ) => state . ide . isPlaying ) ;
97116 const { theme, fontSize } = useSelector ( ( state ) => state . preferences ) ;
98117
99118 const {
@@ -103,17 +122,20 @@ const Console = ({ t }) => {
103122 dispatchConsoleEvent
104123 } = bindActionCreators ( { ...IDEActions , ...ConsoleActions } , useDispatch ( ) ) ;
105124
106- useDidUpdate ( ( ) => {
107- clearConsole ( ) ;
108- dispatchConsoleEvent ( consoleEvents ) ;
109- } , [ theme , fontSize ] ) ;
110-
111125 const cm = useRef ( { } ) ;
112126
113127 useDidUpdate ( ( ) => {
114128 cm . current . scrollTop = cm . current . scrollHeight ;
115129 } ) ;
116130
131+ const handleMessageEvent = useHandleMessageEvent ( ) ;
132+ useEffect ( ( ) => {
133+ const unsubscribe = listen ( handleMessageEvent ) ;
134+ return function cleanup ( ) {
135+ unsubscribe ( ) ;
136+ } ;
137+ } ) ;
138+
117139 const consoleClass = classNames ( {
118140 'preview-console' : true ,
119141 'preview-console--collapsed' : ! isExpanded
@@ -147,29 +169,39 @@ const Console = ({ t }) => {
147169 </ button >
148170 </ div >
149171 </ 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+ ) }
173205 </ div >
174206 </ section >
175207 ) ;
0 commit comments