diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.css b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.css index 7e74f21eef08c..7ad31524968e8 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.css +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.css @@ -19,6 +19,10 @@ overflow: hidden; } +.SuspenseRectsScaledRect[data-visible='false'] > .SuspenseRectsBoundaryChildren { + overflow: initial; +} + .SuspenseRectsRect { box-shadow: var(--elevation-4); pointer-events: all; @@ -31,6 +35,11 @@ outline-color: var(--color-background-selected); } +.SuspenseRectsScaledRect[data-visible='false'] { + pointer-events: none; + outline-width: 0; +} + /* highlight this boundary */ .SuspenseRectsBoundary:hover:not(:has(.SuspenseRectsBoundary:hover)) > .SuspenseRectsRect, .SuspenseRectsBoundary[data-highlighted='true'] > .SuspenseRectsRect { background-color: var(--color-background-hover); diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js index 39c6f1c492517..5dac93a182c1c 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js @@ -34,10 +34,12 @@ import { function ScaledRect({ className, rect, + visible, ...props }: { className: string, rect: Rect, + visible: boolean, ... }): React$Node { const viewBox = useContext(ViewBox); @@ -50,6 +52,7 @@ function ScaledRect({
+ - {suspense.rects !== null && + {visible && + suspense.rects !== null && suspense.rects.map((rect, index) => { return (
- {suspend ? : primaryStep} + {suspend ? ( + + ) : ( + primaryStep + )} ); @@ -227,7 +235,7 @@ function useTestSequence(label: string, T1: any => any, T2: any => any) { {next} goodbye , ]; - return allSteps[step]; + return [step, allSteps[step]]; } function NestedSuspenseTest() { @@ -252,7 +260,7 @@ function Parent() {
This will never load}> - +
@@ -298,14 +306,48 @@ function LoadLater() { Loaded! Click to suspend again. ) : ( - + )} ); } -function Never() { - throw new Promise(resolve => {}); +function readRecord(promise: any): any { + if (typeof React.use === 'function') { + return React.use(promise); + } + switch (promise.status) { + case 'pending': + throw promise; + case 'rejected': + throw promise.reason; + case 'fulfilled': + return promise.value; + default: + promise.status = 'pending'; + promise.then( + value => { + promise.status = 'fulfilled'; + promise.value = value; + }, + reason => { + promise.status = 'rejected'; + promise.reason = reason; + }, + ); + throw promise; + } +} + +const nevers = new Map>(); +function Never({id}: {id: string}) { + let promise = nevers.get(id); + if (!promise) { + promise = new Promise(() => {}); + (promise as any).displayName = id; + nevers.set(id, promise); + } + readRecord(promise); } function Fallback1({prop, ...rest}: any) {