Skip to content

Commit fa8e3a2

Browse files
authored
[devtools] Restore all Transitions for Tree updates (facebook#33042)
1 parent 408d055 commit fa8e3a2

File tree

5 files changed

+50
-9
lines changed

5 files changed

+50
-9
lines changed

packages/react-devtools-shared/src/devtools/views/Components/Element.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import type {Element as ElementType} from 'react-devtools-shared/src/frontend/ty
2323

2424
import styles from './Element.css';
2525
import Icon from '../Icon';
26+
import {useChangeOwnerAction} from './OwnersListContext';
2627

2728
type Props = {
2829
data: ItemData,
@@ -66,9 +67,10 @@ export default function Element({data, index, style}: Props): React.Node {
6667
warningCount: number,
6768
}>(errorsAndWarningsSubscription);
6869

70+
const changeOwnerAction = useChangeOwnerAction();
6971
const handleDoubleClick = () => {
7072
if (id !== null) {
71-
dispatch({type: 'SELECT_OWNER', payload: id});
73+
changeOwnerAction(id);
7274
}
7375
};
7476

packages/react-devtools-shared/src/devtools/views/Components/OwnersListContext.js

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import * as React from 'react';
1313
import {createContext, useCallback, useContext, useEffect} from 'react';
1414
import {createResource} from '../../cache';
1515
import {BridgeContext, StoreContext} from '../context';
16-
import {TreeStateContext} from './TreeContext';
16+
import {TreeDispatcherContext, TreeStateContext} from './TreeContext';
1717
import {backendToFrontendSerializedElementMapper} from 'react-devtools-shared/src/utils';
1818

1919
import type {OwnersList} from 'react-devtools-shared/src/backend/types';
@@ -70,6 +70,43 @@ type Props = {
7070
children: React$Node,
7171
};
7272

73+
function useChangeOwnerAction(): (nextOwnerID: number) => void {
74+
const bridge = useContext(BridgeContext);
75+
const store = useContext(StoreContext);
76+
const treeAction = useContext(TreeDispatcherContext);
77+
78+
return useCallback(
79+
function changeOwnerAction(nextOwnerID: number) {
80+
treeAction({type: 'SELECT_OWNER', payload: nextOwnerID});
81+
82+
const element = store.getElementByID(nextOwnerID);
83+
if (element !== null) {
84+
if (!inProgressRequests.has(element)) {
85+
let resolveFn:
86+
| ResolveFn
87+
| ((
88+
result:
89+
| Promise<Array<SerializedElement>>
90+
| Array<SerializedElement>,
91+
) => void) = ((null: any): ResolveFn);
92+
const promise = new Promise(resolve => {
93+
resolveFn = resolve;
94+
});
95+
96+
// $FlowFixMe[incompatible-call] found when upgrading Flow
97+
inProgressRequests.set(element, {promise, resolveFn});
98+
}
99+
100+
const rendererID = store.getRendererIDForElement(nextOwnerID);
101+
if (rendererID !== null) {
102+
bridge.send('getOwnersList', {id: nextOwnerID, rendererID});
103+
}
104+
}
105+
},
106+
[bridge, store],
107+
);
108+
}
109+
73110
function OwnersListContextController({children}: Props): React.Node {
74111
const bridge = useContext(BridgeContext);
75112
const store = useContext(StoreContext);
@@ -95,8 +132,6 @@ function OwnersListContextController({children}: Props): React.Node {
95132
if (element !== null) {
96133
const request = inProgressRequests.get(element);
97134
if (request != null) {
98-
inProgressRequests.delete(element);
99-
100135
request.resolveFn(
101136
ownersList.owners === null
102137
? null
@@ -129,4 +164,4 @@ function OwnersListContextController({children}: Props): React.Node {
129164
);
130165
}
131166

132-
export {OwnersListContext, OwnersListContextController};
167+
export {OwnersListContext, OwnersListContextController, useChangeOwnerAction};

packages/react-devtools-shared/src/devtools/views/Components/OwnersStack.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import Button from '../Button';
2020
import ButtonIcon from '../ButtonIcon';
2121
import Toggle from '../Toggle';
2222
import ElementBadges from './ElementBadges';
23-
import {OwnersListContext} from './OwnersListContext';
23+
import {OwnersListContext, useChangeOwnerAction} from './OwnersListContext';
2424
import {TreeDispatcherContext, TreeStateContext} from './TreeContext';
2525
import {useIsOverflowing} from '../hooks';
2626
import {StoreContext} from '../context';
@@ -81,6 +81,7 @@ export default function OwnerStack(): React.Node {
8181
const read = useContext(OwnersListContext);
8282
const {ownerID} = useContext(TreeStateContext);
8383
const treeDispatch = useContext(TreeDispatcherContext);
84+
const changeOwnerAction = useChangeOwnerAction();
8485

8586
const [state, dispatch] = useReducer<State, State, Action>(dialogReducer, {
8687
ownerID: null,
@@ -116,7 +117,7 @@ export default function OwnerStack(): React.Node {
116117
type: 'UPDATE_SELECTED_INDEX',
117118
selectedIndex: index >= 0 ? index : 0,
118119
});
119-
treeDispatch({type: 'SELECT_OWNER', payload: owner.id});
120+
changeOwnerAction(owner.id);
120121
} else {
121122
dispatch({
122123
type: 'UPDATE_SELECTED_INDEX',

packages/react-devtools-shared/src/devtools/views/Components/Tree.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import ButtonIcon from '../ButtonIcon';
3838
import Button from '../Button';
3939
import {logEvent} from 'react-devtools-shared/src/Logger';
4040
import {useExtensionComponentsPanelVisibility} from 'react-devtools-shared/src/frontend/hooks/useExtensionComponentsPanelVisibility';
41+
import {useChangeOwnerAction} from './OwnersListContext';
4142

4243
// Never indent more than this number of pixels (even if we have the room).
4344
const DEFAULT_INDENTATION_SIZE = 12;
@@ -217,13 +218,14 @@ export default function Tree(): React.Node {
217218
const handleBlur = useCallback(() => setTreeFocused(false), []);
218219
const handleFocus = useCallback(() => setTreeFocused(true), []);
219220

221+
const changeOwnerAction = useChangeOwnerAction();
220222
const handleKeyPress = useCallback(
221223
(event: $FlowFixMe) => {
222224
switch (event.key) {
223225
case 'Enter':
224226
case ' ':
225227
if (inspectedElementID !== null) {
226-
dispatch({type: 'SELECT_OWNER', payload: inspectedElementID});
228+
changeOwnerAction(inspectedElementID);
227229
}
228230
break;
229231
default:

packages/react-devtools-shared/src/devtools/views/Components/TreeContext.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ const TreeStateContext: ReactContext<StateContext> =
148148
createContext<StateContext>(((null: any): StateContext));
149149
TreeStateContext.displayName = 'TreeStateContext';
150150

151+
// TODO: `dispatch` is an Action and should be named accordingly.
151152
const TreeDispatcherContext: ReactContext<DispatcherContext> =
152153
createContext<DispatcherContext>(((null: any): DispatcherContext));
153154
TreeDispatcherContext.displayName = 'TreeDispatcherContext';
@@ -953,7 +954,7 @@ function TreeContextController({
953954

954955
return (
955956
<TreeStateContext.Provider value={state}>
956-
<TreeDispatcherContext.Provider value={dispatch}>
957+
<TreeDispatcherContext.Provider value={transitionDispatch}>
957958
{children}
958959
</TreeDispatcherContext.Provider>
959960
</TreeStateContext.Provider>

0 commit comments

Comments
 (0)