diff options
author | Jason <jason.daurus@gmail.com> | 2016-06-09 18:40:59 +0800 |
---|---|---|
committer | Jason <jason.daurus@gmail.com> | 2016-06-09 18:40:59 +0800 |
commit | 6c95635cb809d9261acc317f223ef80ba9c25f20 (patch) | |
tree | f9f272b0c5ff3001b9747fd85a3089457eb98626 /web/src/js/components/EventLog | |
parent | 1baefcdc99bd8e4ee6bf7620965d51d1aab6ddd4 (diff) | |
download | mitmproxy-6c95635cb809d9261acc317f223ef80ba9c25f20.tar.gz mitmproxy-6c95635cb809d9261acc317f223ef80ba9c25f20.tar.bz2 mitmproxy-6c95635cb809d9261acc317f223ef80ba9c25f20.zip |
[web] eventlog.js -> EventLog.jsx
Diffstat (limited to 'web/src/js/components/EventLog')
-rw-r--r-- | web/src/js/components/EventLog/EventList.jsx | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/web/src/js/components/EventLog/EventList.jsx b/web/src/js/components/EventLog/EventList.jsx new file mode 100644 index 00000000..d0b036e7 --- /dev/null +++ b/web/src/js/components/EventLog/EventList.jsx @@ -0,0 +1,90 @@ +import React, { Component, PropTypes } from 'react' +import ReactDOM from 'react-dom' +import shallowEqual from 'shallowequal' +import AutoScroll from '../helpers/AutoScroll' +import { calcVScroll } from '../helpers/VirtualScroll' + +class EventLogList extends Component { + + static propTypes = { + events: PropTypes.array.isRequired, + rowHeight: PropTypes.number, + } + + static defaultProps = { + rowHeight: 18, + } + + constructor(props) { + super(props) + + this.heights = {} + this.state = { vScroll: calcVScroll() } + + this.onViewportUpdate = this.onViewportUpdate.bind(this) + } + + componentDidMount() { + window.addEventListener('resize', this.onViewportUpdate) + this.onViewportUpdate() + } + + componentWillUnmount() { + window.removeEventListener('resize', this.onViewportUpdate) + } + + componentDidUpdate() { + this.onViewportUpdate() + } + + onViewportUpdate() { + const viewport = ReactDOM.findDOMNode(this) + + const vScroll = calcVScroll({ + itemCount: this.props.events.length, + rowHeight: this.props.rowHeight, + viewportTop: viewport.scrollTop, + viewportHeight: viewport.offsetHeight, + itemHeights: this.props.events.map(entry => this.heights[entry.id]), + }) + + if (!shallowEqual(this.state.vScroll, vScroll)) { + this.setState({vScroll}) + } + } + + setHeight(id, node) { + if (node && !this.heights[id]) { + const height = node.offsetHeight + if (this.heights[id] !== height) { + this.heights[id] = height + this.onViewportUpdate() + } + } + } + + render() { + const { vScroll } = this.state + const { events } = this.props + + return ( + <pre onScroll={this.onViewportUpdate}> + <div style={{ height: vScroll.paddingTop }}></div> + {events.slice(vScroll.start, vScroll.end).map(event => ( + <div key={event.id} ref={node => this.setHeight(event.id, node)}> + <LogIcon event={event}/> + {event.message} + </div> + ))} + <div style={{ height: vScroll.paddingBottom }}></div> + </pre> + ) + } +} + +function LogIcon({ event }) { + const icon = { web: 'html5', debug: 'bug' }[event.level] || 'info' + return <i className={`fa fa-fw fa-${icon}`}></i> +} + +export default AutoScroll(EventLogList) |