From 3a111720f63716754812335490f4c79024b85c6a Mon Sep 17 00:00:00 2001 From: "Diogo Franco (Kovensky)" Date: Fri, 9 Mar 2018 19:28:06 +0900 Subject: [PATCH 01/17] Support hiding components in devtools with Symbol.for('react.devtools.hide') --- backend/attachRendererFiber.js | 7 +++++++ backend/getData.js | 4 ++++ frontend/Node.js | 6 ++++-- frontend/Panel.js | 2 ++ frontend/PreferencesPanel.js | 26 +++++++++++++++++++++++--- frontend/Store.js | 9 ++++++++- test/example/target.js | 3 +++ 7 files changed, 51 insertions(+), 6 deletions(-) diff --git a/backend/attachRendererFiber.js b/backend/attachRendererFiber.js index 84ac4b1b42..ba5058c0cd 100644 --- a/backend/attachRendererFiber.js +++ b/backend/attachRendererFiber.js @@ -153,6 +153,7 @@ function attachRendererFiber(hook: Hook, rid: string, renderer: ReactRenderer): var nodeType = null; var name = null; var text = null; + var hideSymbol = null; // Profiler data var actualDuration = null; @@ -176,12 +177,16 @@ function attachRendererFiber(hook: Hook, rid: string, renderer: ReactRenderer): publicInstance = fiber.stateNode; props = fiber.memoizedProps; state = fiber.memoizedState; + hideSymbol = typeof Symbol === 'function' && fiber.type[Symbol.for('react.devtools.hide')]; if (publicInstance != null) { context = publicInstance.context; if (context && Object.keys(context).length === 0) { context = null; } } + if (name === 'HigherOrderComponent') { + console.log('fiber backend', fiber); + } const inst = publicInstance; if (inst) { updater = { @@ -360,6 +365,8 @@ function attachRendererFiber(hook: Hook, rid: string, renderer: ReactRenderer): actualDuration, actualStartTime, treeBaseDuration, + + hideSymbol, }; } diff --git a/backend/getData.js b/backend/getData.js index cccb4fa1e4..0ed1f484bf 100644 --- a/backend/getData.js +++ b/backend/getData.js @@ -165,6 +165,9 @@ function getData(internalInstance: Object): DataType { }; } + const hideSymbol = nodeType === 'Composite' && typeof Symbol === 'function' && type[Symbol.for('react.devtools.hide')]; + + // $FlowFixMe return { nodeType, @@ -180,6 +183,7 @@ function getData(internalInstance: Object): DataType { text, updater, publicInstance, + hideSymbol, }; } diff --git a/frontend/Node.js b/frontend/Node.js index f82fff87d2..b8971acd0f 100644 --- a/frontend/Node.js +++ b/frontend/Node.js @@ -32,6 +32,7 @@ type PropsType = { isBottomTagSelected: boolean, searchRegExp: ?RegExp, wrappedChildren: ?Array, + hideSymbol: boolean, onHover: (isHovered: boolean) => void, onHoverBottom: (isHovered: boolean) => void, onContextMenu: () => void, @@ -202,7 +203,7 @@ class Node extends React.Component { let children = node.get('children'); - if (node.get('nodeType') === 'Wrapper') { + if (node.get('nodeType') === 'Wrapper' || (this.props.hideSymbol && node.get('hideSymbol'))) { return children.map(child => ); @@ -418,7 +419,7 @@ Node.contextTypes = { var WrappedNode = decorate({ listeners(props) { - return [props.id]; + return [props.id, 'hideSymbol']; }, props(store, props) { var node = store.get(props.id); @@ -435,6 +436,7 @@ var WrappedNode = decorate({ isBottomTagHovered: store.isBottomTagHovered, hovered: store.hovered === props.id, searchRegExp: props.searchRegExp, + hideSymbol: store.hideSymbol, onToggleCollapse: e => { e.preventDefault(); store.toggleCollapse(props.id); diff --git a/frontend/Panel.js b/frontend/Panel.js index e69ef452ec..2ecf9d21ba 100644 --- a/frontend/Panel.js +++ b/frontend/Panel.js @@ -71,6 +71,7 @@ type State = { themeKey: number, themeName: ?string, showTroubleshooting: boolean, + hideSymbol: boolean, }; class Panel extends React.Component { @@ -99,6 +100,7 @@ class Panel extends React.Component { isReact: props.alreadyFoundReact, themeKey: 0, themeName: props.themeName, + hideSymbol: true, }; this._unMounted = false; window.panel = this; diff --git a/frontend/PreferencesPanel.js b/frontend/PreferencesPanel.js index 58d810bc2e..b9e91d9df9 100644 --- a/frontend/PreferencesPanel.js +++ b/frontend/PreferencesPanel.js @@ -27,9 +27,11 @@ import type {Theme} from './types'; type Props = { changeTheme: (themeName: string) => void, + changeHideSymbol: (enabled: boolean) => void, hasCustomTheme: boolean, hide: () => void, open: bool, + hideSymbol: bool, }; type State = { @@ -44,7 +46,7 @@ class PreferencesPanel extends React.Component { showHiddenThemes: boolean, theme: Theme, themeName: string, - themes: { [key: string]: Theme }, + themes: { [key: string]: Theme } }; constructor(props, context) { @@ -69,7 +71,7 @@ class PreferencesPanel extends React.Component { render() { const {browserName, showHiddenThemes, theme, themeName, themes} = this.context; - const {hasCustomTheme, hide, open} = this.props; + const {hasCustomTheme, hide, open, hideSymbol} = this.props; const {editMode} = this.state; if (!open) { @@ -118,6 +120,16 @@ class PreferencesPanel extends React.Component { +
+ +
+
+ +
-
- +

Hiding components

+
+
-
- +
+