77 * @noflow
88 * @nolint
99 * @preventMunge
10- * @generated SignedSource<<6f91cae5b10795257ddec042012ed6d4 >>
10+ * @generated SignedSource<<44707665e2d49df89524e6821112ab6c >>
1111 */
1212
1313"use strict";
@@ -3469,7 +3469,11 @@ if (__DEV__) {
34693469 }
34703470 }
34713471
3472- function requestTransitionLane() {
3472+ function requestTransitionLane( // This argument isn't used, it's only here to encourage the caller to
3473+ // check that it's inside a transition before calling this function.
3474+ // TODO: Make this non-nullable. Requires a tweak to useOptimistic.
3475+ transition
3476+ ) {
34733477 // The algorithm for assigning an update to a lane should be stable for all
34743478 // updates at the same priority within the same event. To do this, the
34753479 // inputs to the algorithm must be the same.
@@ -3502,7 +3506,7 @@ if (__DEV__) {
35023506 // until the async action scope has completed.
35033507
35043508 var currentEntangledActionThenable = null;
3505- function entangleAsyncAction(thenable) {
3509+ function entangleAsyncAction(transition, thenable) {
35063510 // `thenable` is the return value of the async action scope function. Create
35073511 // a combined thenable that resolves once every entangled scope function
35083512 // has finished.
@@ -7738,16 +7742,7 @@ if (__DEV__) {
77387742 markSkippedUpdateLanes(updateLane);
77397743 } else {
77407744 // This update does have sufficient priority.
7741- // Check if this update is part of a pending async action. If so,
7742- // we'll need to suspend until the action has finished, so that it's
7743- // batched together with future updates in the same action.
7744- if (
7745- updateLane !== NoLane &&
7746- updateLane === peekEntangledActionLane()
7747- ) {
7748- didReadFromEntangledAsyncAction = true;
7749- } // Check if this is an optimistic update.
7750-
7745+ // Check if this is an optimistic update.
77517746 var revertLane = update.revertLane;
77527747
77537748 if (revertLane === NoLane) {
@@ -7767,6 +7762,12 @@ if (__DEV__) {
77677762 next: null
77687763 };
77697764 newBaseQueueLast = newBaseQueueLast.next = _clone;
7765+ } // Check if this update is part of a pending async action. If so,
7766+ // we'll need to suspend until the action has finished, so that it's
7767+ // batched together with future updates in the same action.
7768+
7769+ if (updateLane === peekEntangledActionLane()) {
7770+ didReadFromEntangledAsyncAction = true;
77707771 }
77717772 } else {
77727773 // This is an optimistic update. If the "revert" priority is
@@ -7777,7 +7778,14 @@ if (__DEV__) {
77777778 // The transition that this optimistic update is associated with
77787779 // has finished. Pretend the update doesn't exist by skipping
77797780 // over it.
7780- update = update.next;
7781+ update = update.next; // Check if this update is part of a pending async action. If so,
7782+ // we'll need to suspend until the action has finished, so that it's
7783+ // batched together with future updates in the same action.
7784+
7785+ if (revertLane === peekEntangledActionLane()) {
7786+ didReadFromEntangledAsyncAction = true;
7787+ }
7788+
77817789 continue;
77827790 } else {
77837791 var _clone2 = {
@@ -8288,15 +8296,18 @@ if (__DEV__) {
82888296 var prevState = actionQueue.state; // This is a fork of startTransition
82898297
82908298 var prevTransition = ReactCurrentBatchConfig$2.transition;
8291- ReactCurrentBatchConfig$2.transition = {};
8292- var currentTransition = ReactCurrentBatchConfig$2.transition;
8299+ var currentTransition = {
8300+ _callbacks: new Set()
8301+ };
8302+ ReactCurrentBatchConfig$2.transition = currentTransition;
82938303
82948304 {
82958305 ReactCurrentBatchConfig$2.transition._updatedFibers = new Set();
82968306 }
82978307
82988308 try {
82998309 var returnValue = action(prevState, payload);
8310+ notifyTransitionCallbacks(currentTransition, returnValue);
83008311
83018312 if (
83028313 returnValue !== null &&
@@ -8315,7 +8326,6 @@ if (__DEV__) {
83158326 return finishRunningFormStateAction(actionQueue, setState);
83168327 }
83178328 );
8318- entangleAsyncAction(thenable);
83198329 setState(thenable);
83208330 } else {
83218331 setState(returnValue);
@@ -8876,7 +8886,9 @@ if (__DEV__) {
88768886 higherEventPriority(previousPriority, ContinuousEventPriority)
88778887 );
88788888 var prevTransition = ReactCurrentBatchConfig$2.transition;
8879- var currentTransition = {};
8889+ var currentTransition = {
8890+ _callbacks: new Set()
8891+ };
88808892
88818893 {
88828894 // We don't really need to use an optimistic update here, because we
@@ -8895,7 +8907,8 @@ if (__DEV__) {
88958907
88968908 try {
88978909 if (enableAsyncActions) {
8898- var returnValue = callback(); // Check if we're inside an async action scope. If so, we'll entangle
8910+ var returnValue = callback();
8911+ notifyTransitionCallbacks(currentTransition, returnValue); // Check if we're inside an async action scope. If so, we'll entangle
88998912 // this new action with the existing scope.
89008913 //
89018914 // If we're not already inside an async action scope, and this action is
@@ -8909,8 +8922,7 @@ if (__DEV__) {
89098922 typeof returnValue === "object" &&
89108923 typeof returnValue.then === "function"
89118924 ) {
8912- var thenable = returnValue;
8913- entangleAsyncAction(thenable); // Create a thenable that resolves to `finishedState` once the async
8925+ var thenable = returnValue; // Create a thenable that resolves to `finishedState` once the async
89148926 // action has completed.
89158927
89168928 var thenableForFinishedState = chainThenableValue(
@@ -9214,8 +9226,10 @@ if (__DEV__) {
92149226 queue,
92159227 action
92169228 ) {
9229+ var transition = requestCurrentTransition();
9230+
92179231 {
9218- if (ReactCurrentBatchConfig$2. transition === null) {
9232+ if (transition === null) {
92199233 // An optimistic update occurred, but startTransition is not on the stack.
92209234 // There are two likely scenarios.
92219235 // One possibility is that the optimistic update is triggered by a regular
@@ -16268,9 +16282,35 @@ if (__DEV__) {
1626816282
1626916283 var ReactCurrentBatchConfig$1 =
1627016284 ReactSharedInternals.ReactCurrentBatchConfig;
16271- var NoTransition = null;
1627216285 function requestCurrentTransition() {
16273- return ReactCurrentBatchConfig$1.transition;
16286+ var transition = ReactCurrentBatchConfig$1.transition;
16287+
16288+ if (transition !== null) {
16289+ // Whenever a transition update is scheduled, register a callback on the
16290+ // transition object so we can get the return value of the scope function.
16291+ transition._callbacks.add(handleTransitionScopeResult);
16292+ }
16293+
16294+ return transition;
16295+ }
16296+
16297+ function handleTransitionScopeResult(transition, returnValue) {
16298+ if (
16299+ returnValue !== null &&
16300+ typeof returnValue === "object" &&
16301+ typeof returnValue.then === "function"
16302+ ) {
16303+ // This is an async action.
16304+ var thenable = returnValue;
16305+ entangleAsyncAction(transition, thenable);
16306+ }
16307+ }
16308+
16309+ function notifyTransitionCallbacks(transition, returnValue) {
16310+ var callbacks = transition._callbacks;
16311+ callbacks.forEach(function (callback) {
16312+ return callback(transition, returnValue);
16313+ });
1627416314 } // When retrying a Suspense/Offscreen boundary, we restore the cache that was
1627516315 // used during the previous render by placing it here, on the stack.
1627616316
@@ -21566,17 +21606,17 @@ if (__DEV__) {
2156621606 return pickArbitraryLane(workInProgressRootRenderLanes);
2156721607 }
2156821608
21569- var isTransition = requestCurrentTransition() !== NoTransition ;
21609+ var transition = requestCurrentTransition();
2157021610
21571- if (isTransition ) {
21572- if (ReactCurrentBatchConfig.transition !== null) {
21573- var transition = ReactCurrentBatchConfig.transition;
21611+ if (transition !== null ) {
21612+ {
21613+ var batchConfigTransition = ReactCurrentBatchConfig.transition;
2157421614
21575- if (!transition ._updatedFibers) {
21576- transition ._updatedFibers = new Set();
21615+ if (!batchConfigTransition ._updatedFibers) {
21616+ batchConfigTransition ._updatedFibers = new Set();
2157721617 }
2157821618
21579- transition ._updatedFibers.add(fiber);
21619+ batchConfigTransition ._updatedFibers.add(fiber);
2158021620 }
2158121621
2158221622 var actionScopeLane = peekEntangledActionLane();
@@ -21643,7 +21683,7 @@ if (__DEV__) {
2164321683 workInProgressDeferredLane = OffscreenLane;
2164421684 } else {
2164521685 // Everything else is spawned as a transition.
21646- workInProgressDeferredLane = requestTransitionLane ();
21686+ workInProgressDeferredLane = claimNextTransitionLane ();
2164721687 }
2164821688 } // Mark the parent Suspense boundary so it knows to spawn the deferred lane.
2164921689
@@ -25572,7 +25612,7 @@ if (__DEV__) {
2557225612 return root;
2557325613 }
2557425614
25575- var ReactVersion = "18.3.0-canary-382190c59 -20240125";
25615+ var ReactVersion = "18.3.0-canary-85b296e9b -20240125";
2557625616
2557725617 // Might add PROFILE later.
2557825618
0 commit comments