2019-01-10 20:23:33 +03:00
|
|
|
import React, { Component } from 'react';
|
2018-12-11 23:26:24 +03:00
|
|
|
|
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';
|
2018-12-11 23:26:24 +03:00
|
|
|
|
2018-12-18 20:26:17 +03:00
|
|
|
const rootStyle = {padding: '5px 10px'};
|
|
|
|
|
2018-12-11 23:26:24 +03:00
|
|
|
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-11 23:26:24 +03:00
|
|
|
|
2018-12-12 19:34:22 +03:00
|
|
|
componentDidUpdate(prevProps) {
|
|
|
|
const {action, actions} = prevProps;
|
2018-12-11 23:26:24 +03:00
|
|
|
|
2018-12-12 19:34:22 +03:00
|
|
|
if(action !== this.props.action || actions !== this.props.actions) {
|
|
|
|
this.checkForStackTrace();
|
2018-12-11 23:26:24 +03:00
|
|
|
}
|
2018-12-12 19:34:22 +03:00
|
|
|
}
|
2018-12-11 23:26:24 +03:00
|
|
|
|
2018-12-12 19:34:22 +03:00
|
|
|
checkForStackTrace() {
|
|
|
|
const {action, actions: liftedActionsById} = this.props;
|
2018-12-11 23:26:24 +03:00
|
|
|
|
2018-12-12 19:34:22 +03:00
|
|
|
if(!action) {
|
|
|
|
return;
|
|
|
|
}
|
2018-12-11 23:26:24 +03:00
|
|
|
|
2018-12-12 19:34:22 +03:00
|
|
|
const liftedActions = Object.values(liftedActionsById);
|
|
|
|
const liftedAction = liftedActions.find(liftedAction => liftedAction.action === action);
|
2018-12-11 23:26:24 +03:00
|
|
|
|
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-11 23:26:24 +03:00
|
|
|
|
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-11 23:26:24 +03:00
|
|
|
}
|
2018-12-12 19:34:22 +03:00
|
|
|
else {
|
2018-12-18 20:26:17 +03:00
|
|
|
this.setState({
|
|
|
|
stackFrames: [],
|
|
|
|
showDocsLink: liftedAction.action && liftedAction.action.type && liftedAction.action.type !== '@@INIT'
|
|
|
|
});
|
2018-12-12 19:34:22 +03:00
|
|
|
}
|
|
|
|
}
|
2018-12-11 23:26:24 +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-11 23:26:24 +03:00
|
|
|
|
2018-12-12 19:34:22 +03:00
|
|
|
const {fileName, lineNumber} = fileLocation;
|
2018-12-11 23:26:24 +03:00
|
|
|
|
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-11 23:26:24 +03:00
|
|
|
|
2018-12-12 23:45:37 +03:00
|
|
|
// console.log("Matching stack frame: ", matchingStackFrame);
|
2018-12-11 23:26:24 +03:00
|
|
|
|
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
|
|
|
}
|
2018-12-11 23:26:24 +03:00
|
|
|
}
|
2018-12-18 20:26:17 +03:00
|
|
|
}
|
2018-12-11 23:26:24 +03:00
|
|
|
|
2018-12-18 20:26:17 +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-11 23:26:24 +03:00
|
|
|
|
2018-12-12 19:34:22 +03:00
|
|
|
render() {
|
2018-12-18 20:26:17 +03:00
|
|
|
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 (
|
2018-12-18 20:26:17 +03:00
|
|
|
<div style={rootStyle}>
|
2018-12-14 20:21:36 +03:00
|
|
|
<StackTrace
|
|
|
|
stackFrames={stackFrames}
|
2019-01-10 20:23:33 +03:00
|
|
|
errorName="N/A"
|
2018-12-14 20:21:36 +03:00
|
|
|
contextSize={3}
|
|
|
|
editorHandler={this.onStackLocationClicked}
|
|
|
|
/>
|
|
|
|
</div>
|
2018-12-12 19:34:22 +03:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|