redux-devtools/packages/redux-devtools-trace-monitor/src/StackTraceTab.js

115 lines
3.4 KiB
JavaScript
Raw Normal View History

import React, { Component, PropTypes } from 'react';
2018-12-12 19:34:22 +03:00
import {getStackFrames} from './react-error-overlay/utils/getStackFrames';
import StackTrace from './react-error-overlay/containers/StackTrace';
2018-12-15 04:04:34 +03:00
import openFile from './openFile';
const rootStyle = {padding: '5px 10px'};
export default class StackTraceTab extends Component {
2018-12-12 19:34:22 +03:00
constructor(props) {
super(props);
this.state = {
stackFrames: []
};
}
componentDidMount() {
2018-12-12 23:45:37 +03:00
// console.log("StackTraceTab mounted");
2018-12-12 19:34:22 +03:00
this.checkForStackTrace();
}
2018-12-12 19:34:22 +03:00
componentDidUpdate(prevProps) {
const {action, actions} = prevProps;
2018-12-12 19:34:22 +03:00
if(action !== this.props.action || actions !== this.props.actions) {
this.checkForStackTrace();
}
2018-12-12 19:34:22 +03:00
}
2018-12-12 19:34:22 +03:00
checkForStackTrace() {
const {action, actions: liftedActionsById} = this.props;
2018-12-12 19:34:22 +03:00
if(!action) {
return;
}
2018-12-12 19:34:22 +03:00
const liftedActions = Object.values(liftedActionsById);
const liftedAction = liftedActions.find(liftedAction => liftedAction.action === action);
2018-12-12 19:34:22 +03:00
if(liftedAction && typeof liftedAction.stack === 'string') {
const deserializedError = Object.assign(new Error(), {stack: liftedAction.stack});
2018-12-12 19:34:22 +03:00
getStackFrames(deserializedError)
2018-12-12 23:45:37 +03:00
.then(stackFrames => {
/* eslint-disable no-console */
if (process.env.NODE_ENV === 'development') console.log('Stack frames: ', stackFrames);
/* eslint-enable no-console */
this.setState({stackFrames, currentError: deserializedError});
});
}
2018-12-12 19:34:22 +03:00
else {
this.setState({
stackFrames: [],
showDocsLink: liftedAction.action && liftedAction.action.type && liftedAction.action.type !== '@@INIT'
});
2018-12-12 19:34:22 +03:00
}
}
2018-12-12 19:34:22 +03:00
onStackLocationClicked = (fileLocation = {}) => {
2018-12-12 23:45:37 +03:00
// console.log("Stack location args: ", ...args);
2018-12-12 19:34:22 +03:00
const {fileName, lineNumber} = fileLocation;
2018-12-12 19:34:22 +03:00
if(fileName && lineNumber) {
const matchingStackFrame = this.state.stackFrames.find(stackFrame => {
const matches = (
2018-12-12 23:45:37 +03:00
(stackFrame._originalFileName === fileName && stackFrame._originalLineNumber === lineNumber) ||
(stackFrame.fileName === fileName && stackFrame.lineNumber === lineNumber)
);
2018-12-12 19:34:22 +03:00
return matches;
});
2018-12-12 23:45:37 +03:00
// console.log("Matching stack frame: ", matchingStackFrame);
2018-12-12 19:34:22 +03:00
if(matchingStackFrame) {
2018-12-12 23:45:37 +03:00
/*
const frameIndex = this.state.stackFrames.indexOf(matchingStackFrame);
const originalStackFrame = parsedFramesNoSourcemaps[frameIndex];
console.log("Original stack frame: ", originalStackFrame);
*/
2018-12-15 04:04:34 +03:00
openFile(fileName, lineNumber, matchingStackFrame);
2018-12-12 19:34:22 +03:00
}
}
}
openDocs = (e) => {
e.stopPropagation();
window.open('https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/Features/Trace.md');
2018-12-12 19:34:22 +03:00
}
2018-12-12 19:34:22 +03:00
render() {
const {stackFrames, showDocsLink} = this.state;
if (showDocsLink) {
return (
<div style={rootStyle}>
To enable tracing action calls, you should set `trace` option to `true` for Redux DevTools enhancer.
Refer to <a href="#" onClick={this.openDocs}>this page</a> for more details.
</div>
);
}
2018-12-12 19:34:22 +03:00
return (
<div style={rootStyle}>
<StackTrace
stackFrames={stackFrames}
errorName={"N/A"}
contextSize={3}
editorHandler={this.onStackLocationClicked}
/>
</div>
2018-12-12 19:34:22 +03:00
);
}
}