Skip to content

Commit 4a90699

Browse files
committed
[Devtools] Ensure initial read of useFormStatus returns NotPendingTransition
1 parent a8c4804 commit 4a90699

File tree

9 files changed

+69
-36
lines changed

9 files changed

+69
-36
lines changed

packages/react-art/src/ReactFiberConfigART.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import {TYPES, EVENT_TYPES, childrenAsString} from './ReactARTInternals';
1212

1313
import {DefaultEventPriority} from 'react-reconciler/src/ReactEventPriorities';
1414

15+
import type {ReactContext} from 'shared/ReactTypes';
16+
import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols';
17+
1518
const pooledTransform = new Transform();
1619

1720
const NO_CONTEXT = {};
@@ -475,3 +478,11 @@ export function waitForCommitToBeReady() {
475478
}
476479

477480
export const NotPendingTransition = null;
481+
export const HostTransitionContext: ReactContext<TransitionStatus> = {
482+
$$typeof: REACT_CONTEXT_TYPE,
483+
Provider: (null: any),
484+
Consumer: (null: any),
485+
_currentValue: NotPendingTransition,
486+
_currentValue2: NotPendingTransition,
487+
_threadCount: 0,
488+
};

packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010
import type {EventPriority} from 'react-reconciler/src/ReactEventPriorities';
1111
import type {DOMEventName} from '../events/DOMEventNames';
1212
import type {Fiber, FiberRoot} from 'react-reconciler/src/ReactInternalTypes';
13+
1314
import type {
1415
BoundingRect,
1516
IntersectionObserverOptions,
1617
ObserveVisibleRectsCallback,
1718
} from 'react-reconciler/src/ReactTestSelectors';
18-
import type {ReactScopeInstance} from 'shared/ReactTypes';
19+
import type {ReactContext, ReactScopeInstance} from 'shared/ReactTypes';
1920
import type {AncestorInfoDev} from './validateDOMNesting';
2021
import type {FormStatus} from 'react-dom-bindings/src/shared/ReactDOMFormActions';
2122
import type {
@@ -33,6 +34,7 @@ import {DefaultEventPriority} from 'react-reconciler/src/ReactEventPriorities';
3334

3435
import hasOwnProperty from 'shared/hasOwnProperty';
3536
import {checkAttributeStringCoercion} from 'shared/CheckStringCoercion';
37+
import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols';
3638

3739
import {
3840
precacheFiberNode,
@@ -3420,3 +3422,12 @@ function insertStylesheetIntoRoot(
34203422
}
34213423

34223424
export const NotPendingTransition: TransitionStatus = NotPending;
3425+
3426+
export const HostTransitionContext: ReactContext<TransitionStatus> = {
3427+
$$typeof: REACT_CONTEXT_TYPE,
3428+
Provider: (null: any),
3429+
Consumer: (null: any),
3430+
_currentValue: NotPendingTransition,
3431+
_currentValue2: NotPendingTransition,
3432+
_threadCount: 0,
3433+
};

packages/react-native-renderer/src/ReactFiberConfigFabric.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ const {
4848
} = nativeFabricUIManager;
4949

5050
import {passChildrenWhenCloningPersistedNodes} from 'shared/ReactFeatureFlags';
51+
import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols';
52+
import type {ReactContext} from 'shared/ReactTypes';
5153

5254
const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;
5355

@@ -500,6 +502,14 @@ export function waitForCommitToBeReady(): null {
500502
}
501503

502504
export const NotPendingTransition: TransitionStatus = null;
505+
export const HostTransitionContext: ReactContext<TransitionStatus> = {
506+
$$typeof: REACT_CONTEXT_TYPE,
507+
Provider: (null: any),
508+
Consumer: (null: any),
509+
_currentValue: NotPendingTransition,
510+
_currentValue2: NotPendingTransition,
511+
_threadCount: 0,
512+
};
503513

504514
// -------------------
505515
// Microtasks

packages/react-native-renderer/src/ReactFiberConfigNative.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ import {
3030
} from 'react-reconciler/src/ReactEventPriorities';
3131
import type {Fiber} from 'react-reconciler/src/ReactInternalTypes';
3232

33+
import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols';
34+
import type {ReactContext} from 'shared/ReactTypes';
35+
3336
const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;
3437

3538
export type Type = string;
@@ -536,3 +539,11 @@ export function waitForCommitToBeReady(): null {
536539
}
537540

538541
export const NotPendingTransition: TransitionStatus = null;
542+
export const HostTransitionContext: ReactContext<TransitionStatus> = {
543+
$$typeof: REACT_CONTEXT_TYPE,
544+
Provider: (null: any),
545+
Consumer: (null: any),
546+
_currentValue: NotPendingTransition,
547+
_currentValue2: NotPendingTransition,
548+
_threadCount: 0,
549+
};

packages/react-reconciler/src/ReactFiberBeginWork.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,14 @@ import {
174174
isPrimaryRenderer,
175175
getResource,
176176
createHoistableInstance,
177+
HostTransitionContext,
177178
} from './ReactFiberConfig';
178179
import type {SuspenseInstance} from './ReactFiberConfig';
179180
import {shouldError, shouldSuspend} from './ReactFiberReconciler';
180181
import {
181182
pushHostContext,
182183
pushHostContainer,
183184
getRootHostContainer,
184-
HostTransitionContext,
185185
} from './ReactFiberHostContext';
186186
import {
187187
suspenseStackCursor,

packages/react-reconciler/src/ReactFiberHooks.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ import type {HookFlags} from './ReactHookEffectTags';
2727
import type {Flags} from './ReactFiberFlags';
2828
import type {TransitionStatus} from './ReactFiberConfig';
2929

30-
import {NotPendingTransition as NoPendingHostTransition} from './ReactFiberConfig';
30+
import {
31+
HostTransitionContext,
32+
NotPendingTransition as NoPendingHostTransition,
33+
} from './ReactFiberConfig';
3134
import ReactSharedInternals from 'shared/ReactSharedInternals';
3235
import {
3336
enableDebugTracing,
@@ -148,7 +151,6 @@ import {
148151
peekEntangledActionThenable,
149152
chainThenableValue,
150153
} from './ReactFiberAsyncAction';
151-
import {HostTransitionContext} from './ReactFiberHostContext';
152154
import {requestTransitionLane} from './ReactFiberRootScheduler';
153155
import {isCurrentTreeHidden} from './ReactFiberHiddenContext';
154156
import {
@@ -3104,8 +3106,7 @@ function useHostTransitionStatus(): TransitionStatus {
31043106
if (!enableAsyncActions) {
31053107
throw new Error('Not implemented.');
31063108
}
3107-
const status: TransitionStatus | null = readContext(HostTransitionContext);
3108-
return status !== null ? status : NoPendingHostTransition;
3109+
return readContext(HostTransitionContext);
31093110
}
31103111

31113112
function mountId(): string {

packages/react-reconciler/src/ReactFiberHostContext.js

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,17 @@
99

1010
import type {Fiber} from './ReactInternalTypes';
1111
import type {StackCursor} from './ReactFiberStack';
12-
import type {
13-
Container,
14-
HostContext,
15-
TransitionStatus,
16-
} from './ReactFiberConfig';
12+
import type {Container, HostContext} from './ReactFiberConfig';
1713
import type {Hook} from './ReactFiberHooks';
18-
import type {ReactContext} from 'shared/ReactTypes';
1914

2015
import {
2116
getChildHostContext,
2217
getRootHostContext,
18+
HostTransitionContext,
19+
NotPendingTransition,
2320
isPrimaryRenderer,
2421
} from './ReactFiberConfig';
2522
import {createCursor, push, pop} from './ReactFiberStack';
26-
import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols';
2723
import {enableAsyncActions} from 'shared/ReactFeatureFlags';
2824

2925
const contextStackCursor: StackCursor<HostContext | null> = createCursor(null);
@@ -38,21 +34,6 @@ const rootInstanceStackCursor: StackCursor<Container | null> =
3834
const hostTransitionProviderCursor: StackCursor<Fiber | null> =
3935
createCursor(null);
4036

41-
// TODO: This should initialize to NotPendingTransition, a constant
42-
// imported from the fiber config. However, because of a cycle in the module
43-
// graph, that value isn't defined during this module's initialization. I can't
44-
// think of a way to work around this without moving that value out of the
45-
// fiber config. For now, the "no provider" case is handled when reading,
46-
// inside useHostTransitionStatus.
47-
export const HostTransitionContext: ReactContext<TransitionStatus | null> = {
48-
$$typeof: REACT_CONTEXT_TYPE,
49-
Provider: (null: any),
50-
Consumer: (null: any),
51-
_currentValue: null,
52-
_currentValue2: null,
53-
_threadCount: 0,
54-
};
55-
5637
function requiredContext<Value>(c: Value | null): Value {
5738
if (__DEV__) {
5839
if (c === null) {
@@ -150,13 +131,13 @@ function popHostContext(fiber: Fiber): void {
150131
pop(hostTransitionProviderCursor, fiber);
151132

152133
// When popping the transition provider, we reset the context value back
153-
// to `null`. We can do this because you're not allowd to nest forms. If
134+
// to `NotPendingTransition`. We can do this because you're not allowd to nest forms. If
154135
// we allowed for multiple nested host transition providers, then we'd
155136
// need to reset this to the parent provider's status.
156137
if (isPrimaryRenderer) {
157-
HostTransitionContext._currentValue = null;
138+
HostTransitionContext._currentValue = NotPendingTransition;
158139
} else {
159-
HostTransitionContext._currentValue2 = null;
140+
HostTransitionContext._currentValue2 = NotPendingTransition;
160141
}
161142
}
162143
}

packages/react-reconciler/src/ReactFiberNewContext.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import type {SharedQueue} from './ReactFiberClassUpdateQueue';
1919
import type {TransitionStatus} from './ReactFiberConfig';
2020
import type {Hook} from './ReactFiberHooks';
2121

22-
import {isPrimaryRenderer} from './ReactFiberConfig';
22+
import {isPrimaryRenderer, HostTransitionContext} from './ReactFiberConfig';
2323
import {createCursor, push, pop} from './ReactFiberStack';
2424
import {
2525
ContextProvider,
@@ -47,10 +47,7 @@ import {
4747
enableAsyncActions,
4848
enableRenderableContext,
4949
} from 'shared/ReactFeatureFlags';
50-
import {
51-
getHostTransitionProvider,
52-
HostTransitionContext,
53-
} from './ReactFiberHostContext';
50+
import {getHostTransitionProvider} from './ReactFiberHostContext';
5451

5552
const valueCursor: StackCursor<mixed> = createCursor(null);
5653

packages/react-test-renderer/src/ReactFiberConfigTestHost.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
* @flow
88
*/
99

10+
import type {ReactContext} from 'shared/ReactTypes';
11+
1012
import isArray from 'shared/isArray';
13+
import {REACT_CONTEXT_TYPE} from 'shared/ReactSymbols';
1114
import {
1215
DefaultEventPriority,
1316
type EventPriority,
@@ -336,3 +339,11 @@ export function waitForCommitToBeReady(): null {
336339
}
337340

338341
export const NotPendingTransition: TransitionStatus = null;
342+
export const HostTransitionContext: ReactContext<TransitionStatus> = {
343+
$$typeof: REACT_CONTEXT_TYPE,
344+
Provider: (null: any),
345+
Consumer: (null: any),
346+
_currentValue: NotPendingTransition,
347+
_currentValue2: NotPendingTransition,
348+
_threadCount: 0,
349+
};

0 commit comments

Comments
 (0)