diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js index 92a8d2d3e694b..704a2dd4415b4 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseBreadcrumbs.js @@ -8,6 +8,7 @@ */ import type {SuspenseNode} from 'react-devtools-shared/src/frontend/types'; +import typeof {SyntheticMouseEvent} from 'react-dom-bindings/src/events/SyntheticEvent'; import * as React from 'react'; import {useContext} from 'react'; @@ -15,13 +16,12 @@ import { TreeDispatcherContext, TreeStateContext, } from '../Components/TreeContext'; -import {StoreContext} from '../context'; import {useHighlightHostInstance} from '../hooks'; import styles from './SuspenseBreadcrumbs.css'; -import typeof {SyntheticMouseEvent} from 'react-dom-bindings/src/events/SyntheticEvent'; +import {useSuspenseStore} from './SuspenseTreeContext'; export default function SuspenseBreadcrumbs(): React$Node { - const store = useContext(StoreContext); + const store = useSuspenseStore(); const dispatch = useContext(TreeDispatcherContext); const {inspectedElementID} = useContext(TreeStateContext); diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js index b1c30a32300ff..ab1b6276b7507 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseRects.js @@ -19,10 +19,9 @@ import { TreeDispatcherContext, TreeStateContext, } from '../Components/TreeContext'; -import {StoreContext} from '../context'; import {useHighlightHostInstance} from '../hooks'; import styles from './SuspenseRects.css'; -import {SuspenseTreeStateContext} from './SuspenseTreeContext'; +import {useSuspenseStore} from './SuspenseTreeContext'; import typeof { SyntheticMouseEvent, SyntheticPointerEvent, @@ -46,7 +45,7 @@ function SuspenseRects({ suspenseID: SuspenseNode['id'], }): React$Node { const dispatch = useContext(TreeDispatcherContext); - const store = useContext(StoreContext); + const store = useSuspenseStore(); const {inspectedElementID} = useContext(TreeStateContext); @@ -109,9 +108,9 @@ function SuspenseRects({ function getDocumentBoundingRect( store: Store, - shells: $ReadOnlyArray, + roots: $ReadOnlyArray, ): Rect { - if (shells.length === 0) { + if (roots.length === 0) { return {x: 0, y: 0, width: 0, height: 0}; } @@ -120,14 +119,14 @@ function getDocumentBoundingRect( let maxX = Number.NEGATIVE_INFINITY; let maxY = Number.NEGATIVE_INFINITY; - for (let i = 0; i < shells.length; i++) { - const shellID = shells[i]; - const shell = store.getSuspenseByID(shellID); - if (shell === null) { + for (let i = 0; i < roots.length; i++) { + const rootID = roots[i]; + const root = store.getSuspenseByID(rootID); + if (root === null) { continue; } - const rects = shell.rects; + const rects = root.rects; if (rects === null) { continue; } @@ -154,20 +153,20 @@ function getDocumentBoundingRect( } function SuspenseRectsShell({ - shellID, + rootID, }: { - shellID: SuspenseNode['id'], + rootID: SuspenseNode['id'], }): React$Node { - const store = useContext(StoreContext); - const shell = store.getSuspenseByID(shellID); - if (shell === null) { - console.warn(` Could not find suspense node id ${shellID}`); + const store = useSuspenseStore(); + const root = store.getSuspenseByID(rootID); + if (root === null) { + console.warn(` Could not find suspense node id ${rootID}`); return null; } return ( - {shell.children.map(childID => { + {root.children.map(childID => { return ; })} @@ -175,11 +174,11 @@ function SuspenseRectsShell({ } function SuspenseRectsContainer(): React$Node { - const store = useContext(StoreContext); + const store = useSuspenseStore(); // TODO: This relies on a full re-render of all children when the Suspense tree changes. - const {shells} = useContext(SuspenseTreeStateContext); + const roots = store.roots; - const boundingRect = getDocumentBoundingRect(store, shells); + const boundingRect = getDocumentBoundingRect(store, roots); const width = '100%'; const boundingRectWidth = boundingRect.width; @@ -193,8 +192,8 @@ function SuspenseRectsContainer(): React$Node { - {shells.map(shellID => { - return ; + {roots.map(rootID => { + return ; })} diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTimeline.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTimeline.js index cbc4dab09d220..bfd90d0dd757c 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTimeline.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTimeline.js @@ -12,10 +12,10 @@ import type Store from '../../store'; import * as React from 'react'; import {useContext, useLayoutEffect, useMemo, useRef, useState} from 'react'; -import {BridgeContext, StoreContext} from '../context'; +import {BridgeContext} from '../context'; import {TreeDispatcherContext} from '../Components/TreeContext'; import {useHighlightHostInstance} from '../hooks'; -import {SuspenseTreeStateContext} from './SuspenseTreeContext'; +import {useSuspenseStore} from './SuspenseTreeContext'; import styles from './SuspenseTimeline.css'; import typeof { SyntheticEvent, @@ -63,14 +63,14 @@ function getSuspendableDocumentOrderSuspense( function SuspenseTimelineInput({rootID}: {rootID: Element['id'] | void}) { const bridge = useContext(BridgeContext); - const store = useContext(StoreContext); + const store = useSuspenseStore(); const dispatch = useContext(TreeDispatcherContext); const {highlightHostInstance, clearHighlightHostInstance} = useHighlightHostInstance(); const timeline = useMemo(() => { return getSuspendableDocumentOrderSuspense(store, rootID); - }, [store, rootID]); + }, [store, store.revisionSuspense, rootID]); const inputRef = useRef(null); const inputBBox = useRef(null); @@ -161,6 +161,7 @@ function SuspenseTimelineInput({rootID}: {rootID: Element['id'] | void}) { function handleFocus() { const suspense = timeline[value]; + dispatch({type: 'SELECT_ELEMENT_BY_ID', payload: suspense.id}); highlightHostInstance(suspense.id); } @@ -213,10 +214,10 @@ function SuspenseTimelineInput({rootID}: {rootID: Element['id'] | void}) { } export default function SuspenseTimeline(): React$Node { - const store = useContext(StoreContext); - const {shells} = useContext(SuspenseTreeStateContext); + const store = useSuspenseStore(); - const defaultSelectedRootID = shells.find(rootID => { + const roots = store.roots; + const defaultSelectedRootID = roots.find(rootID => { const suspense = store.getSuspenseByID(rootID); return ( store.supportsTogglingSuspense(rootID) && @@ -239,20 +240,18 @@ export default function SuspenseTimeline(): React$Node { return (
- {shells.length > 0 && ( + {roots.length > 0 && (