import React from 'react'; import copy from 'copy-to-clipboard'; import cn from 'classnames'; import { Icon, TextEllipsis } from 'UI'; import { TYPES } from 'Types/session/event'; import { prorata } from 'App/utils'; import withOverlay from 'Components/hocs/withOverlay'; import LoadInfo from './LoadInfo'; import cls from './event.module.css'; import { numberWithCommas } from 'App/utils'; @withOverlay() export default class Event extends React.PureComponent { state = { menuOpen: false, } componentDidMount() { this.wrapper.addEventListener('contextmenu', this.onContextMenu); } onContextMenu = (e) => { e.preventDefault(); this.setState({ menuOpen: true }); } onMouseLeave = () => this.setState({ menuOpen: false }) copyHandler = (e) => { e.stopPropagation(); //const ctrlOrCommandPressed = e.ctrlKey || e.metaKey; //if (ctrlOrCommandPressed && e.keyCode === 67) { const { event } = this.props; copy(event.getIn([ 'target', 'path' ]) || event.url || ''); this.setState({ menuOpen: false }); } toggleInfo = (e) => { e.stopPropagation(); this.props.toggleInfo(); } // eslint-disable-next-line complexity renderBody = () => { const { event } = this.props; let title = event.type; let body; switch (event.type) { case TYPES.LOCATION: title = 'Visited'; body = event.url; break; case TYPES.CLICK: title = 'Clicked'; body = event.label; break; case TYPES.INPUT: title = 'Input'; body = event.value; break; case TYPES.CLICKRAGE: title = `${ event.count } Clicks`; body = event.label; break; case TYPES.IOS_VIEW: title = 'View'; body = event.name; break; } const isLocation = event.type === TYPES.LOCATION; const isClickrage = event.type === TYPES.CLICKRAGE; return (
{ event.type && }
{ title } {/* { body && !isLocation &&
{ body }
} */} { body && !isLocation && }
{ isLocation && event.speedIndex != null &&
{"Speed Index"}
{ numberWithCommas(event.speedIndex || 0) }
}
{ event.target && event.target.label &&
{ event.target.label }
}
{ isLocation &&
{ body }
}
); }; render() { const { event, selected, isCurrent, onClick, showSelection, onCheckboxClick, showLoadInfo, toggleLoadInfo, isRed, extended, highlight = false, presentInSearch = false, isLastInGroup, whiteBg, } = this.props; const { menuOpen } = this.state; return (
{ this.wrapper = ref } } onMouseLeave={ this.onMouseLeave } data-openreplay-label="Event" data-type={event.type} className={ cn(cls.event, { [ cls.menuClosed ]: !menuOpen, [ cls.highlighted ]: showSelection ? selected : isCurrent, [ cls.selected ]: selected, [ cls.showSelection ]: showSelection, [ cls.red ]: isRed, [ cls.clickType ]: event.type === TYPES.CLICK, [ cls.inputType ]: event.type === TYPES.INPUT, [ cls.clickrageType ]: event.type === TYPES.CLICKRAGE, [ cls.highlight ] : presentInSearch, [ cls.lastInGroup ]: whiteBg, }) } onClick={ onClick } > { menuOpen && }
{ this.renderBody() }
{/* { event.type === TYPES.LOCATION &&
{event.url}
} */}
{ event.type === TYPES.LOCATION && (event.fcpTime || event.visuallyComplete || event.timeToInteractive) && elements / 1.2, // eslint-disable-next-line no-mixed-operators divisorFn: (elements, parts) => elements / (2 * parts + 1), }) } /> }
); } }