import { error as errorRoute } from 'App/routes'; import JsonViewer from 'Components/Session_/StackEvents/UserEvent/JsonViewer'; import Sentry from 'Components/Session_/StackEvents/UserEvent/Sentry'; import { hideHint } from 'Duck/components/player'; import withEnumToggle from 'HOCs/withEnumToggle'; import { connectPlayer, jump } from 'Player'; import React from 'react'; import { connect } from 'react-redux'; import { DATADOG, SENTRY, STACKDRIVER, typeList } from 'Types/session/stackEvent'; import { NoContent, SlideModal, Tabs, Link } from 'UI'; import Autoscroll from '../Autoscroll'; import BottomBlock from '../BottomBlock'; import UserEvent from './UserEvent'; const ALL = 'ALL'; const TABS = [ALL, ...typeList].map((tab) => ({ text: tab, key: tab })); @withEnumToggle('activeTab', 'setActiveTab', ALL) @connectPlayer((state) => ({ stackEvents: state.stackList, stackEventsNow: state.stackListNow, })) @connect( (state) => ({ hintIsHidden: state.getIn(['components', 'player', 'hiddenHints', 'stack']) || !state.getIn(['site', 'list']).some((s) => s.stackIntegrations), }), { hideHint, } ) export default class StackEvents extends React.PureComponent { // onFilterChange = (e, { value }) => this.setState({ filter: value }) state = { currentEvent: null, }; onDetailsClick(userEvent) { this.setState({ currentEvent: userEvent }); } closeModal() { this.setState({ currentEvent: undefined }); } renderPopupContent(userEvent) { const { source, payload, name } = userEvent; switch (source) { case SENTRY: return ; case DATADOG: return ; case STACKDRIVER: return ; default: return ; } } render() { const { stackEvents, activeTab, setActiveTab, hintIsHidden } = this.props; //const filterRE = new RegExp(filter, 'i'); const { currentEvent } = this.state; const tabs = TABS.filter( ({ key }) => key === ALL || stackEvents.some(({ source }) => key === source) ); const filteredStackEvents = stackEvents // .filter(({ data }) => data.includes(filter)) .filter(({ source }) => activeTab === ALL || activeTab === source); let lastIndex = -1; // TODO: Need to do filtering in store, or preferably in a selector filteredStackEvents.forEach((item, index) => { if ( this.props.stackEventsNow.length > 0 && item.time <= this.props.stackEventsNow[this.props.stackEventsNow.length - 1].time ) { lastIndex = index; } }); return ( <>
{currentEvent.name} {currentEvent.function}
{currentEvent.message}
) } isDisplayed={currentEvent != null} content={ currentEvent &&
{this.renderPopupContent(currentEvent)}
} onClose={this.closeModal.bind(this)} />
Events
Integrations {' and '} Events { ' make debugging easier. Sync your backend logs and custom events with session replay.' }

) : null } size="small" show={filteredStackEvents.length === 0} > {filteredStackEvents.map((userEvent, index) => ( lastIndex} selected={lastIndex === index} userEvent={userEvent} onJump={() => jump(userEvent.time)} /> ))}
); } }