import React, { Component } from 'react';
import Draggable from 'react-draggable';
import ReactNoop from '../../../../build/packages/react-noop-renderer';
import ReactFiberInstrumentation from '../../../../build/packages/react-noop-renderer/lib/ReactFiberInstrumentation';
import Editor from './Editor';
import Fibers from './Fibers';
import describeFibers from './describeFibers';
function getFiberState(root, workInProgress) {
if (!root) {
return null;
}
return describeFibers(root.current, workInProgress);
}
const defaultCode = `
log('Render
Hello
');
ReactNoop.render(Hello
);
ReactNoop.flush();
log('Render Goodbye
');
ReactNoop.render(Goodbye
);
ReactNoop.flush();
`;
class App extends Component {
constructor(props) {
super(props);
this.state = {
code: defaultCode,
isEditing: false,
history: [],
currentStep: 0,
show: {
alt: false,
child: true,
sibling: true,
return: false,
fx: false,
progressedChild: false,
progressedDel: false
}
};
}
componentDidMount() {
this.runCode(this.state.code);
}
runCode(code) {
let currentStage;
let currentRoot;
ReactFiberInstrumentation.debugTool = {
onMountContainer: (root) => {
currentRoot = root;
},
onUpdateContainer: (root) => {
currentRoot = root;
},
onWillBeginWork: (fiber) => {
const fibers = getFiberState(currentRoot, fiber);
const stage = currentStage;
this.setState(({ history }) => ({
history: [
...history, {
action: 'willBeginWork',
fibers,
stage
}
]
}));
},
onDidBeginWork: (fiber) => {
const fibers = getFiberState(currentRoot, fiber);
const stage = currentStage;
this.setState(({ history }) => ({
history: [
...history, {
action: 'didBeginWork',
fibers,
stage
}
]
}));
},
onWillCompleteWork: (fiber) => {
const fibers = getFiberState(currentRoot, fiber);
const stage = currentStage;
this.setState(({ history }) => ({
history: [
...history, {
action: 'willCompleteWork',
fibers,
stage
}
]
}));
},
onDidCompleteWork: (fiber) => {
const fibers = getFiberState(currentRoot, fiber);
const stage = currentStage;
this.setState(({ history }) => ({
history: [
...history, {
action: 'didCompleteWork',
fibers,
stage
}
]
}));
},
};
window.React = React;
window.ReactNoop = ReactNoop;
window.log = s => currentStage = s;
// eslint-disable-next-line
eval(window.Babel.transform(code, {
presets: ['react', 'es2015']
}).code);
}
handleEdit = (e) => {
e.preventDefault();
this.setState({
isEditing: true
});
}
handleCloseEdit = (nextCode) => {
this.setState({
isEditing: false,
history: [],
currentStep: 0,
code: nextCode
});
this.runCode(nextCode);
}
render() {
const { history, currentStep, isEditing, code } = this.state;
if (isEditing) {
return ;
}
const { fibers, action, stage } = history[currentStep] || {};
let friendlyAction;
if (fibers) {
let wipFiber = fibers.descriptions[fibers.workInProgressID];
let friendlyFiber = wipFiber.type || wipFiber.tag + ' #' + wipFiber.id;
switch (action) {
case 'willBeginWork':
friendlyAction = 'Before BEGIN phase on ' + friendlyFiber;
break;
case 'didBeginWork':
friendlyAction = 'After BEGIN phase on ' + friendlyFiber;
break;
case 'willCompleteWork':
friendlyAction = 'Before COMPLETE phase on ' + friendlyFiber;
break;
case 'didCompleteWork':
friendlyAction = 'After COMPLETE phase on ' + friendlyFiber;
break;
default:
throw new Error('Unknown action');
}
}
return (
{fibers &&
}
this.setState({ currentStep: Number(e.target.value) })}
/>
Step {currentStep}: {friendlyAction} (Edit)
{stage &&
Stage: {stage}
}
{Object.keys(this.state.show).map(key =>
)}
);
}
}
export default App;