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;