p5.js-web-editor/client/modules/IDE/components/Console.js

65 lines
1.7 KiB
JavaScript
Raw Normal View History

import React, { PropTypes } from 'react';
2016-07-18 02:05:20 +02:00
/**
* How many console messages to store
* @type {Number}
*/
2016-07-21 06:05:47 +02:00
const consoleMax = 100;
class Console extends React.Component {
constructor(props) {
super(props);
2016-07-18 02:05:20 +02:00
/**
* An array of React Elements that include previous console messages
* @type {Array}
*/
this.children = [];
}
componentWillReceiveProps(nextProps) {
if (nextProps.isPlaying && !this.props.isPlaying) {
this.children = [];
} else if (nextProps.consoleEvent !== this.props.consoleEvent) {
const args = nextProps.consoleEvent.arguments;
const method = nextProps.consoleEvent.method;
const nextChild = (
2016-07-19 01:10:42 +02:00
<div key={this.children.length} className={`preview-console__${method}`}>
{Object.keys(args).map((key) => <span key={`${this.children.length}-${key}`}>{args[key]}</span>)}
</div>
);
this.children.push(nextChild);
}
}
shouldComponentUpdate(nextProps) {
return (nextProps.consoleEvent !== this.props.consoleEvent) || (nextProps.isPlaying && !this.props.isPlaying);
}
2016-07-21 06:05:47 +02:00
componentDidUpdate() {
this.refs.console_messages.scrollTop = this.refs.console_messages.scrollHeight;
}
render() {
const childrenToDisplay = this.children.slice(-consoleMax);
return (
<div ref="console" className="preview-console">
2016-07-21 06:05:47 +02:00
<h2 className="preview-console__header">console</h2>
<div ref="console_messages" className="preview-console__messages">
{childrenToDisplay}
</div>
</div>
);
}
}
Console.propTypes = {
consoleEvent: PropTypes.object,
isPlaying: PropTypes.bool.isRequired
};
export default Console;