From d7215b4970858ea45db924e1ec435a9a3e5cff40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Markb=C3=A5ge?= Date: Mon, 13 Oct 2025 12:12:12 -0400 Subject: [PATCH] [DevTools] Preserve the original index when sorting suspended by (#34829) The index is both used as the key and for hydration purposes. Previously we didn't preserve the index when sorting so the index didn't line up which caused hydration to be the wrong slot when sorted. --- .../Components/InspectedElementSuspendedBy.js | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSuspendedBy.js b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSuspendedBy.js index d1da51a0cf..19cc47f982 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSuspendedBy.js +++ b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementSuspendedBy.js @@ -300,9 +300,31 @@ type Props = { store: Store, }; -function compareTime(a: SerializedAsyncInfo, b: SerializedAsyncInfo): number { - const ioA = a.awaited; - const ioB = b.awaited; +function withIndex( + value: SerializedAsyncInfo, + index: number, +): { + index: number, + value: SerializedAsyncInfo, +} { + return { + index, + value, + }; +} + +function compareTime( + a: { + index: number, + value: SerializedAsyncInfo, + }, + b: { + index: number, + value: SerializedAsyncInfo, + }, +): number { + const ioA = a.value.awaited; + const ioB = b.value.awaited; if (ioA.start === ioB.start) { return ioA.end - ioB.end; } @@ -364,7 +386,8 @@ export default function InspectedElementSuspendedBy({ minTime = maxTime - 25; } - const sortedSuspendedBy = suspendedBy === null ? [] : suspendedBy.slice(0); + const sortedSuspendedBy = + suspendedBy === null ? [] : suspendedBy.map(withIndex); sortedSuspendedBy.sort(compareTime); let unknownSuspenders = null; @@ -407,11 +430,11 @@ export default function InspectedElementSuspendedBy({ - {sortedSuspendedBy.map((asyncInfo, index) => ( + {sortedSuspendedBy.map(({value, index}) => (