Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions packages/react-devtools-shared/src/__tests__/store-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3081,6 +3081,109 @@
`);
});

// @reactVersion >= 19.0
it('can reconcile Suspense inside an Offscreen', async () => {
let resolveHeadFallback;

Check failure on line 3086 in packages/react-devtools-shared/src/__tests__/store-test.js

View workflow job for this annotation

GitHub Actions / Run eslint

'resolveHeadFallback' is assigned a value but never used
let resolveHeadContent;

Check failure on line 3087 in packages/react-devtools-shared/src/__tests__/store-test.js

View workflow job for this annotation

GitHub Actions / Run eslint

'resolveHeadContent' is assigned a value but never used
let resolveMainFallback;

Check failure on line 3088 in packages/react-devtools-shared/src/__tests__/store-test.js

View workflow job for this annotation

GitHub Actions / Run eslint

'resolveMainFallback' is assigned a value but never used
let resolveMainContent;

Check failure on line 3089 in packages/react-devtools-shared/src/__tests__/store-test.js

View workflow job for this annotation

GitHub Actions / Run eslint

'resolveMainContent' is assigned a value but never used

function Component({children, promise}) {
if (promise) {
React.use(promise);
}
return <div>{children}</div>;
}

function WithSuspenseInFallback({fallbackPromise, contentPromise, name}) {
return (
<React.Suspense
name={name}
fallback={
<React.Suspense
name={`${name}-fallback`}
fallback={
<Component key={`${name}-fallback-fallback`}>
Loading fallback...
</Component>
}>
<Component
key={`${name}-fallback-content`}
promise={fallbackPromise}>
Loading...
</Component>
</React.Suspense>
}>
<Component key={`${name}-content`} promise={contentPromise}>
done
</Component>
</React.Suspense>
);
}

function App({
headFallbackPromise,
headContentPromise,
mainContentPromise,
mainFallbackPromise,
tailContentPromise,
tailFallbackPromise,
}) {
return (
<React.unstable_Activity mode="hidden">
<WithSuspenseInFallback
fallbackPromise={headFallbackPromise}
contentPromise={headContentPromise}
name="head"
/>
<WithSuspenseInFallback
fallbackPromise={mainFallbackPromise}
contentPromise={mainContentPromise}
name="main"
/>
</React.unstable_Activity>
);
}

const initialHeadContentPromise = new Promise(resolve => {
resolveHeadContent = resolve;
});
const initialHeadFallbackPromise = new Promise(resolve => {
resolveHeadFallback = resolve;
});
const initialMainContentPromise = new Promise(resolve => {
resolveMainContent = resolve;
});
const initialMainFallbackPromise = new Promise(resolve => {
resolveMainFallback = resolve;
});
await actAsync(() =>
render(
<App
headFallbackPromise={initialHeadFallbackPromise}
headContentPromise={initialHeadContentPromise}
mainContentPromise={initialMainContentPromise}
mainFallbackPromise={initialMainFallbackPromise}
/>,
),
);

expect(store).toMatchInlineSnapshot(`
[root]
▾ <App>
<Activity>
[suspense-root] rects={[{x:1,y:2,width:19,height:1}, {x:1,y:2,width:19,height:1}]}
<Suspense name="head" rects={null}>
<Suspense name="head-fallback" rects={null}>
<Suspense name="main" rects={null}>
<Suspense name="main-fallback" rects={null}>
`);

await actAsync(() => render(null));

expect(store).toMatchInlineSnapshot(``);
});

it('should handle an empty root', async () => {
await actAsync(() => render(null));
expect(store).toMatchInlineSnapshot(``);
Expand Down
Loading