diff --git a/packages/react-devtools-shell/src/app/SuspenseTree/index.js b/packages/react-devtools-shell/src/app/SuspenseTree/index.js
index 846e3f8ef63..7db02a9fc87 100644
--- a/packages/react-devtools-shell/src/app/SuspenseTree/index.js
+++ b/packages/react-devtools-shell/src/app/SuspenseTree/index.js
@@ -12,6 +12,7 @@ import {
Fragment,
Suspense,
unstable_SuspenseList as SuspenseList,
+ useReducer,
useState,
} from 'react';
@@ -26,10 +27,149 @@ function SuspenseTree(): React.Node {
+
);
}
+function IgnoreMePassthrough({children}: {children: React$Node}) {
+ return {children};
+}
+
+const suspenseTreeOperationsChildren = {
+ a: (
+
+ A
+
+ ),
+ b: (
+
+ B
+
+ ),
+ c: (
+
+
+ C
+
+
+ ),
+ d: (
+
+ D
+
+ ),
+ e: (
+
+
+
+ e1
+
+
+
+
+ e2
+
+
+
+ ),
+ eReordered: (
+
+
+ e2
+
+
+ e1
+
+
+ ),
+};
+
+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 (
+ <>
+
+
+
+
+
+ >
+ );
+}
+
function EmptySuspense() {
return ;
}
@@ -144,7 +284,8 @@ function LoadLater() {
setLoadChild(true)}>Click to load
- }>
+ }
+ name="LoadLater">
{loadChild ? (
setLoadChild(false)}>
Loaded! Click to suspend again.