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
143 changes: 142 additions & 1 deletion packages/react-devtools-shell/src/app/SuspenseTree/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
Fragment,
Suspense,
unstable_SuspenseList as SuspenseList,
useReducer,
useState,
} from 'react';

Expand All @@ -26,10 +27,149 @@ function SuspenseTree(): React.Node {
<NestedSuspenseTest />
<SuspenseListTest />
<EmptySuspense />
<SuspenseTreeOperations />
</Fragment>
);
}

function IgnoreMePassthrough({children}: {children: React$Node}) {
return <span>{children}</span>;
}

const suspenseTreeOperationsChildren = {
a: (
<Suspense key="a" name="a">
<p>A</p>
</Suspense>
),
b: (
<div key="b">
<Suspense name="b">B</Suspense>
</div>
),
c: (
<p key="c">
<Suspense key="c" name="c">
C
</Suspense>
</p>
),
d: (
<Suspense key="d" name="d">
<div>D</div>
</Suspense>
),
e: (
<Suspense key="e" name="e">
<IgnoreMePassthrough>
<Suspense name="e-child-one">
<p>e1</p>
</Suspense>
</IgnoreMePassthrough>
<IgnoreMePassthrough>
<Suspense name="e-child-two">
<div>e2</div>
</Suspense>
</IgnoreMePassthrough>
</Suspense>
),
eReordered: (
<Suspense key="e" name="e">
<IgnoreMePassthrough>
<Suspense name="e-child-two">e2</Suspense>
</IgnoreMePassthrough>
<IgnoreMePassthrough>
<Suspense name="e-child-one">e1</Suspense>
</IgnoreMePassthrough>
</Suspense>
),
};

function SuspenseTreeOperations() {
const initialChildren: any[] = [
suspenseTreeOperationsChildren.a,
suspenseTreeOperationsChildren.b,
suspenseTreeOperationsChildren.c,
suspenseTreeOperationsChildren.d,
suspenseTreeOperationsChildren.e,
];
const [children, dispatch] = useReducer(
(
pendingState: any[],
action: 'toggle-mount' | 'reorder' | 'reorder-within-ignored',
): React$Node[] => {
switch (action) {
case 'toggle-mount':
if (pendingState.length === 5) {
return [
suspenseTreeOperationsChildren.a,
suspenseTreeOperationsChildren.b,
suspenseTreeOperationsChildren.c,
suspenseTreeOperationsChildren.d,
];
} else {
return [
suspenseTreeOperationsChildren.a,
suspenseTreeOperationsChildren.b,
suspenseTreeOperationsChildren.c,
suspenseTreeOperationsChildren.d,
suspenseTreeOperationsChildren.e,
];
}
case 'reorder':
if (pendingState[1] === suspenseTreeOperationsChildren.b) {
return [
suspenseTreeOperationsChildren.a,
suspenseTreeOperationsChildren.c,
suspenseTreeOperationsChildren.b,
suspenseTreeOperationsChildren.d,
suspenseTreeOperationsChildren.e,
];
} else {
return [
suspenseTreeOperationsChildren.a,
suspenseTreeOperationsChildren.b,
suspenseTreeOperationsChildren.c,
suspenseTreeOperationsChildren.d,
suspenseTreeOperationsChildren.e,
];
}
case 'reorder-within-ignored':
if (pendingState[1] === suspenseTreeOperationsChildren.e) {
return [
suspenseTreeOperationsChildren.a,
suspenseTreeOperationsChildren.b,
suspenseTreeOperationsChildren.c,
suspenseTreeOperationsChildren.d,
suspenseTreeOperationsChildren.eReordered,
];
} else {
return [
suspenseTreeOperationsChildren.a,
suspenseTreeOperationsChildren.b,
suspenseTreeOperationsChildren.c,
suspenseTreeOperationsChildren.d,
suspenseTreeOperationsChildren.e,
];
}
default:
return pendingState;
}
},
initialChildren,
);

return (
<>
<button onClick={() => dispatch('toggle-mount')}>Toggle Mount</button>
<button onClick={() => dispatch('reorder')}>Reorder</button>
<Suspense name="operations-parent">
<section>{children}</section>
</Suspense>
</>
);
}

function EmptySuspense() {
return <Suspense />;
}
Expand Down Expand Up @@ -144,7 +284,8 @@ function LoadLater() {
<Suspense
fallback={
<Fallback1 onClick={() => setLoadChild(true)}>Click to load</Fallback1>
}>
}
name="LoadLater">
{loadChild ? (
<Primary1 onClick={() => setLoadChild(false)}>
Loaded! Click to suspend again.
Expand Down
Loading