import React from 'react'; import { getIn, get } from 'immutable'; import cn from 'classnames'; import { withRequest } from 'HOCs'; import { Loader, Icon, JSONTree } from 'UI'; import { Collapse } from 'antd'; import stl from './sentry.module.css'; const { Panel } = Collapse; @withRequest({ endpoint: (props) => `/integrations/sentry/events/${props.event.id}`, dataName: 'detailedEvent', loadOnInitialize: true, }) export default class SentryEventInfo extends React.PureComponent { makePanelsFromStackTrace(stacktrace) { return get(stacktrace, 'frames', []).map( ({ filename, function: method, lineNo, context = [] }) => ({ key: `${filename}_${method}_${lineNo}`, header: ( {filename} {' in '} {method} {' at line '} {lineNo} ), content: (
    {context.map(([ctxLineNo, codeText]) => (
  1. {codeText}
  2. ))}
), }), ); } renderBody() { const { detailedEvent, requestError, event } = this.props; const exceptionEntry = get(detailedEvent, ['entries'], []).find( ({ type }) => type === 'exception', ); const stacktraces = getIn(exceptionEntry, ['data', 'values']); if (!stacktraces) { return ( ); } return stacktraces.map(({ type, value, stacktrace }) => (
{type}

{value}

{this.makePanelsFromStackTrace(stacktrace).map((panel) => ( {panel.content} ))}
)); } render() { const { open, toggleOpen, loading } = this.props; return (
{this.renderBody()}
); } }