diff --git a/packages/react-devtools-shared/src/__tests__/__snapshots__/inspectedElementContext-test.js.snap b/packages/react-devtools-shared/src/__tests__/__snapshots__/inspectedElementContext-test.js.snap index 0c7b024dffb81..2ef217a451e61 100644 --- a/packages/react-devtools-shared/src/__tests__/__snapshots__/inspectedElementContext-test.js.snap +++ b/packages/react-devtools-shared/src/__tests__/__snapshots__/inspectedElementContext-test.js.snap @@ -1,5 +1,34 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`InspectedElementContext display complex values of useDebugValue: DisplayedComplexValue 1`] = ` +{ + "id": 2, + "owners": null, + "context": null, + "hooks": [ + { + "id": null, + "isStateEditable": false, + "name": "DebuggableHook", + "value": { + "foo": 2 + }, + "subHooks": [ + { + "id": 0, + "isStateEditable": true, + "name": "State", + "value": 1, + "subHooks": [] + } + ] + } + ], + "props": {}, + "state": null +} +`; + exports[`InspectedElementContext should dehydrate complex nested values when requested: 1: Initially inspect element 1`] = ` { "id": 2, diff --git a/packages/react-devtools-shared/src/__tests__/inspectedElementContext-test.js b/packages/react-devtools-shared/src/__tests__/inspectedElementContext-test.js index 07ee71fc69de3..4e292ecdbe5a7 100644 --- a/packages/react-devtools-shared/src/__tests__/inspectedElementContext-test.js +++ b/packages/react-devtools-shared/src/__tests__/inspectedElementContext-test.js @@ -1571,4 +1571,54 @@ describe('InspectedElementContext', () => { done(); }); + + it('display complex values of useDebugValue', async done => { + let getInspectedElementPath: GetInspectedElementPath = ((null: any): GetInspectedElementPath); + let inspectedElement = null; + function Suspender({target}) { + const context = React.useContext(InspectedElementContext); + getInspectedElementPath = context.getInspectedElementPath; + inspectedElement = context.getInspectedElement(target); + return null; + } + + const container = document.createElement('div'); + + function useDebuggableHook() { + React.useDebugValue({foo: 2}); + React.useState(1); + return 1; + } + function DisplayedComplexValue() { + useDebuggableHook(); + return null; + } + + await utils.actAsync(() => + ReactDOM.render(, container), + ); + + const ignoredComplexValueIndex = 0; + const ignoredComplexValueId = ((store.getElementIDAtIndex( + ignoredComplexValueIndex, + ): any): number); + await utils.actAsync( + () => + TestRenderer.create( + + + + + , + ), + false, + ); + expect(getInspectedElementPath).not.toBeNull(); + expect(inspectedElement).not.toBeNull(); + expect(inspectedElement).toMatchSnapshot('DisplayedComplexValue'); + + done(); + }); }); diff --git a/packages/react-devtools-shared/src/devtools/views/Components/HooksTree.css b/packages/react-devtools-shared/src/devtools/views/Components/HooksTree.css index 37e0d9dbd5e00..7b381faa9fa02 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/HooksTree.css +++ b/packages/react-devtools-shared/src/devtools/views/Components/HooksTree.css @@ -53,6 +53,7 @@ overflow: hidden; text-overflow: ellipsis; cursor: default; + white-space: nowrap; } .None { diff --git a/packages/react-devtools-shared/src/devtools/views/Components/HooksTree.js b/packages/react-devtools-shared/src/devtools/views/Components/HooksTree.js index f055d207e9066..c4ff5a8765ffc 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/HooksTree.js +++ b/packages/react-devtools-shared/src/devtools/views/Components/HooksTree.js @@ -17,7 +17,7 @@ import EditableValue from './EditableValue'; import ExpandCollapseToggle from './ExpandCollapseToggle'; import {InspectedElementContext} from './InspectedElementContext'; import KeyValue from './KeyValue'; -import {serializeHooksForCopy} from '../utils'; +import {getMetaValueLabel, serializeHooksForCopy} from '../utils'; import styles from './HooksTree.css'; import useContextMenu from '../../ContextMenu/useContextMenu'; import {meta} from '../../../hydration'; @@ -202,6 +202,9 @@ function HookView({canEditHooks, hook, id, inspectPath, path}: HookViewProps) { className={name !== '' ? styles.Name : styles.NameAnonymous}> {name || 'Anonymous'} + + {isOpen || getMetaValueLabel(value)} +