import React from "react" import ReactDOM from "react-dom" import {connect} from 'react-redux' import shallowEqual from "shallowequal" import {toggleEventLogFilter, toggleEventLogVisibility} from "../ducks/eventLog" import AutoScroll from "./helpers/AutoScroll"; import {calcVScroll} from "./helpers/VirtualScroll" import {ToggleButton} from "./common"; function LogIcon({entry}) { let icon = {web: "html5", debug: "bug"}[entry.level] || "info"; return } function LogEntry({entry}) { return
{entry.message}
; } class EventLogContents extends React.Component { 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, ref) { if (ref && !this.heights[id]) { const height = ReactDOM.findDOMNode(ref).offsetHeight; if (this.heights[id] !== height) { this.heights[id] = height; this.onViewportUpdate(); } } } render() { const vScroll = this.state.vScroll; const events = this.props.events .slice(vScroll.start, vScroll.end) .map(entry => ); return (
                
{events}
); } } EventLogContents = AutoScroll(EventLogContents); const EventLogContentsContainer = connect( state => ({ events: state.eventLog.filteredEvents }) )(EventLogContents); export const ToggleEventLog = connect( state => ({ checked: state.eventLog.visible }), dispatch => ({ onToggle: () => dispatch(toggleEventLogVisibility()) }) )(ToggleButton); const ToggleFilter = connect( (state, ownProps) => ({ checked: state.eventLog.filter[ownProps.text] }), (dispatch, ownProps) => ({ onToggle: () => dispatch(toggleEventLogFilter(ownProps.text)) }) )(ToggleButton); const EventLog = ({close}) =>
Eventlog
; EventLog.propTypes = { close: React.PropTypes.func.isRequired }; const EventLogContainer = connect( undefined, dispatch => ({ close: () => dispatch(toggleEventLogVisibility()) }) )(EventLog); export default EventLogContainer;