diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js index 03cb122aca473..0e4a3aad8d715 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.new.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.new.js @@ -598,6 +598,27 @@ export function scheduleUpdateOnFiber( flushSyncCallbackQueue(); } } + } else if (decoupleUpdatePriorityFromScheduler) { + const updateLanePriority = getCurrentUpdateLanePriority(); + + // Schedule a discrete update but only if it's not Sync. + if ( + (executionContext & DiscreteEventContext) !== NoContext && + // Only updates at user-blocking priority or greater are considered + // discrete, even inside a discrete event. + updateLanePriority === InputDiscreteLanePriority + ) { + // This is the result of a discrete event. Track the lowest priority + // discrete update per root so we can flush them early, if needed. + if (rootsWithPendingDiscreteUpdates === null) { + rootsWithPendingDiscreteUpdates = new Set([root]); + } else { + rootsWithPendingDiscreteUpdates.add(root); + } + } + // Schedule other updates after in case the callback is sync. + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, lane); } else { // Schedule a discrete update but only if it's not Sync. if ( diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js index d3eeb26d11cb9..77bd914eaa5fc 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.old.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.old.js @@ -598,6 +598,27 @@ export function scheduleUpdateOnFiber( flushSyncCallbackQueue(); } } + } else if (decoupleUpdatePriorityFromScheduler) { + const updateLanePriority = getCurrentUpdateLanePriority(); + + // Schedule a discrete update but only if it's not Sync. + if ( + (executionContext & DiscreteEventContext) !== NoContext && + // Only updates at user-blocking priority or greater are considered + // discrete, even inside a discrete event. + updateLanePriority === InputDiscreteLanePriority + ) { + // This is the result of a discrete event. Track the lowest priority + // discrete update per root so we can flush them early, if needed. + if (rootsWithPendingDiscreteUpdates === null) { + rootsWithPendingDiscreteUpdates = new Set([root]); + } else { + rootsWithPendingDiscreteUpdates.add(root); + } + } + // Schedule other updates after in case the callback is sync. + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, lane); } else { // Schedule a discrete update but only if it's not Sync. if (