From 2fea03edcb598c55c88b0e130241164cad425d5a Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Thu, 31 Jul 2025 22:03:17 +0200 Subject: [PATCH] [DevTools] Fixture for Suspense tree operations --- .../src/app/SuspenseTree/index.js | 143 +++++++++++++++++- 1 file changed, 142 insertions(+), 1 deletion(-) diff --git a/packages/react-devtools-shell/src/app/SuspenseTree/index.js b/packages/react-devtools-shell/src/app/SuspenseTree/index.js index 846e3f8ef636e..7db02a9fc8789 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 ( + <> + + + +
{children}
+
+ + ); +} + function EmptySuspense() { return ; } @@ -144,7 +284,8 @@ function LoadLater() { setLoadChild(true)}>Click to load - }> + } + name="LoadLater"> {loadChild ? ( setLoadChild(false)}> Loaded! Click to suspend again.