Skip to content

Commit ce7a85d

Browse files
authored
Merge pull request #1756 from processing/bug/interactive-console
Interactive console
2 parents b4a985a + 2b75aed commit ce7a85d

20 files changed

+515
-114
lines changed

Diff for: client/components/useAsModal.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import styled from 'styled-components';
3-
import { useModalBehavior } from '../utils/custom-hooks';
3+
import { useModalBehavior } from '../modules/IDE/hooks/custom-hooks';
44

55
const BackgroundOverlay = styled.div`
66
position: fixed;

Diff for: client/images/console-command-contrast.svg

+13
Loading

Diff for: client/images/console-command-dark.svg

+13
Loading

Diff for: client/images/console-command-light.svg

+13
Loading

Diff for: client/images/console-result-contrast.svg

+22
Loading

Diff for: client/images/console-result-dark.svg

+22
Loading

Diff for: client/images/console-result-light.svg

+22
Loading

Diff for: client/modules/IDE/components/Console.jsx

+66-34
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useRef } from 'react';
1+
import React, { useRef, useEffect } from 'react';
22
import PropTypes from 'prop-types';
33
import { withTranslation } from 'react-i18next';
44

@@ -25,33 +25,51 @@ import debugContrastUrl from '../../../images/console-debug-contrast.svg?byUrl';
2525
import infoLightUrl from '../../../images/console-info-light.svg?byUrl';
2626
import infoDarkUrl from '../../../images/console-info-dark.svg?byUrl';
2727
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';
2836

2937
import UpArrowIcon from '../../../images/up-arrow.svg';
3038
import DownArrowIcon from '../../../images/down-arrow.svg';
3139

3240
import * as IDEActions from '../../IDE/actions/ide';
3341
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';
3545

3646
const 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) => {
94112
const 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

Comments
 (0)