Skip to content

Commit 7c08090

Browse files
bl00mberbvaughn
andauthored
[DevTools] Improve HOC search UX (#18802)
Co-authored-by: Brian Vaughn <brian.david.vaughn@gmail.com>
1 parent 121af31 commit 7c08090

File tree

7 files changed

+51
-60
lines changed

7 files changed

+51
-60
lines changed

packages/react-devtools-shared/src/__tests__/__snapshots__/store-test.js.snap

+3
Original file line numberDiff line numberDiff line change
@@ -626,4 +626,7 @@ exports[`Store should show the right display names for special component types 1
626626
<MyComponent> [ForwardRef]
627627
▾ <Suspense>
628628
<MyComponent5>
629+
<Baz> [withFoo][withBar]
630+
<Baz> [Memo][withFoo][withBar]
631+
<Baz> [ForwardRef][withFoo][withBar]
629632
`;

packages/react-devtools-shared/src/__tests__/store-test.js

+13
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,16 @@ describe('Store', () => {
871871
const MyComponent5 = (props, ref) => null;
872872
const LazyComponent = React.lazy(() => fakeImport(MyComponent5));
873873

874+
const FakeHigherOrderComponent = () => null;
875+
FakeHigherOrderComponent.displayName = 'withFoo(withBar(Baz))';
876+
877+
const MemoizedFakeHigherOrderComponent = React.memo(
878+
FakeHigherOrderComponent,
879+
);
880+
const ForwardRefFakeHigherOrderComponent = React.forwardRef(
881+
FakeHigherOrderComponent,
882+
);
883+
874884
const App = () => (
875885
<React.Fragment>
876886
<MyComponent />
@@ -882,6 +892,9 @@ describe('Store', () => {
882892
<React.Suspense fallback="Loading...">
883893
<LazyComponent />
884894
</React.Suspense>
895+
<FakeHigherOrderComponent />
896+
<MemoizedFakeHigherOrderComponent />
897+
<ForwardRefFakeHigherOrderComponent />
885898
</React.Fragment>
886899
);
887900

packages/react-devtools-shared/src/devtools/utils.js

-18
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@
77
* @flow
88
*/
99

10-
import {
11-
ElementTypeForwardRef,
12-
ElementTypeMemo,
13-
} from 'react-devtools-shared/src/types';
14-
1510
import type {Element} from './views/Components/types';
1611
import type Store from './store';
1712

@@ -30,19 +25,6 @@ export function printElement(element: Element, includeWeight: boolean = false) {
3025
if (element.hocDisplayNames !== null) {
3126
hocDisplayNames = [...element.hocDisplayNames];
3227
}
33-
if (element.type === ElementTypeMemo) {
34-
if (hocDisplayNames === null) {
35-
hocDisplayNames = ['Memo'];
36-
} else {
37-
hocDisplayNames.push('Memo');
38-
}
39-
} else if (element.type === ElementTypeForwardRef) {
40-
if (hocDisplayNames === null) {
41-
hocDisplayNames = ['ForwardRef'];
42-
} else {
43-
hocDisplayNames.push('ForwardRef');
44-
}
45-
}
4628

4729
const hocs =
4830
hocDisplayNames === null ? '' : ` [${hocDisplayNames.join('][')}]`;

packages/react-devtools-shared/src/devtools/views/Components/Badge.js

+8-23
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@
99

1010
import * as React from 'react';
1111
import {Fragment} from 'react';
12-
import {
13-
ElementTypeMemo,
14-
ElementTypeForwardRef,
15-
} from 'react-devtools-shared/src/types';
1612
import styles from './Badge.css';
1713

1814
import type {ElementType} from 'react-devtools-shared/src/types';
@@ -21,35 +17,24 @@ type Props = {|
2117
className?: string,
2218
hocDisplayNames: Array<string> | null,
2319
type: ElementType,
20+
children: React$Node,
2421
|};
2522

26-
export default function Badge({className, hocDisplayNames, type}: Props) {
27-
let hocDisplayName = null;
23+
export default function Badge({
24+
className,
25+
hocDisplayNames,
26+
type,
27+
children,
28+
}: Props) {
2829
let totalBadgeCount = 0;
29-
let typeLabel = null;
3030

3131
if (hocDisplayNames !== null) {
32-
hocDisplayName = hocDisplayNames[0];
3332
totalBadgeCount += hocDisplayNames.length;
3433
}
3534

36-
if (type === ElementTypeMemo) {
37-
typeLabel = 'Memo';
38-
totalBadgeCount++;
39-
} else if (type === ElementTypeForwardRef) {
40-
typeLabel = 'ForwardRef';
41-
totalBadgeCount++;
42-
}
43-
44-
if (hocDisplayNames === null && typeLabel === null) {
45-
return null;
46-
}
47-
4835
return (
4936
<Fragment>
50-
<div className={`${styles.Badge} ${className || ''}`}>
51-
{hocDisplayName || typeLabel}
52-
</div>
37+
<div className={`${styles.Badge} ${className || ''}`}>{children}</div>
5338
{totalBadgeCount > 1 && (
5439
<div className={styles.ExtraLabel}>+{totalBadgeCount - 1}</div>
5540
)}

packages/react-devtools-shared/src/devtools/views/Components/Element.js

+11-5
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,17 @@ export default function ElementView({data, index, style}: Props) {
137137
"
138138
</Fragment>
139139
)}
140-
<Badge
141-
className={styles.Badge}
142-
hocDisplayNames={hocDisplayNames}
143-
type={type}
144-
/>
140+
{hocDisplayNames !== null && hocDisplayNames.length > 0 ? (
141+
<Badge
142+
className={styles.Badge}
143+
hocDisplayNames={hocDisplayNames}
144+
type={type}>
145+
<DisplayName
146+
displayName={hocDisplayNames[0]}
147+
id={((id: any): number)}
148+
/>
149+
</Badge>
150+
) : null}
145151
</div>
146152
</div>
147153
);

packages/react-devtools-shared/src/devtools/views/Components/HocBadges.js

+2-14
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
*/
99

1010
import * as React from 'react';
11-
import {
12-
ElementTypeForwardRef,
13-
ElementTypeMemo,
14-
} from 'react-devtools-shared/src/types';
1511
import styles from './HocBadges.css';
1612

1713
import type {Element} from './types';
@@ -21,22 +17,14 @@ type Props = {|
2117
|};
2218

2319
export default function HocBadges({element}: Props) {
24-
const {hocDisplayNames, type} = ((element: any): Element);
20+
const {hocDisplayNames} = ((element: any): Element);
2521

26-
let typeBadge = null;
27-
if (type === ElementTypeMemo) {
28-
typeBadge = 'Memo';
29-
} else if (type === ElementTypeForwardRef) {
30-
typeBadge = 'ForwardRef';
31-
}
32-
33-
if (hocDisplayNames === null && typeBadge === null) {
22+
if (hocDisplayNames === null) {
3423
return null;
3524
}
3625

3726
return (
3827
<div className={styles.HocBadges}>
39-
{typeBadge !== null && <div className={styles.Badge}>{typeBadge}</div>}
4028
{hocDisplayNames !== null &&
4129
hocDisplayNames.map(hocDisplayName => (
4230
<div key={hocDisplayName} className={styles.Badge}>

packages/react-devtools-shared/src/utils.js

+14
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,20 @@ export function separateDisplayNameAndHOCs(
275275
break;
276276
}
277277

278+
if (type === ElementTypeMemo) {
279+
if (hocDisplayNames === null) {
280+
hocDisplayNames = ['Memo'];
281+
} else {
282+
hocDisplayNames.unshift('Memo');
283+
}
284+
} else if (type === ElementTypeForwardRef) {
285+
if (hocDisplayNames === null) {
286+
hocDisplayNames = ['ForwardRef'];
287+
} else {
288+
hocDisplayNames.unshift('ForwardRef');
289+
}
290+
}
291+
278292
return [displayName, hocDisplayNames];
279293
}
280294

0 commit comments

Comments
 (0)