mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
8e1462e8c4
Currently updatePriority is tracked in the reconciler. `flushSync` is going to be implemented reconciler agnostic soon and we need to move the tracking of this state to the renderer and out of reconciler. This change implements new renderer bin dings for getCurrentUpdatePriority and setCurrentUpdatePriority. I was originally going to have the getter also do the event priority defaulting using window.event so we eliminate getCur rentEventPriority but this makes all the callsites where we store the true current updatePriority on the stack harder to work with so for now they remain separate. I also moved runWithPriority to the renderer since it really belongs whereever the state is being managed and it is only currently exposed in the DOM renderer. Additionally the current update priority is not stored on ReactDOMSharedInternals. While not particularly meaningful in this change it opens the door to implementing `flushSync` outside of the reconciler
68 lines
1.6 KiB
JavaScript
68 lines
1.6 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
*/
|
|
|
|
import type {Lane, Lanes} from './ReactFiberLane';
|
|
|
|
import {
|
|
NoLane,
|
|
SyncLane,
|
|
InputContinuousLane,
|
|
DefaultLane,
|
|
IdleLane,
|
|
getHighestPriorityLane,
|
|
includesNonIdleWork,
|
|
} from './ReactFiberLane';
|
|
|
|
export opaque type EventPriority = Lane;
|
|
|
|
export const NoEventPriority: EventPriority = NoLane;
|
|
export const DiscreteEventPriority: EventPriority = SyncLane;
|
|
export const ContinuousEventPriority: EventPriority = InputContinuousLane;
|
|
export const DefaultEventPriority: EventPriority = DefaultLane;
|
|
export const IdleEventPriority: EventPriority = IdleLane;
|
|
|
|
export function higherEventPriority(
|
|
a: EventPriority,
|
|
b: EventPriority,
|
|
): EventPriority {
|
|
return a !== 0 && a < b ? a : b;
|
|
}
|
|
|
|
export function lowerEventPriority(
|
|
a: EventPriority,
|
|
b: EventPriority,
|
|
): EventPriority {
|
|
return a === 0 || a > b ? a : b;
|
|
}
|
|
|
|
export function isHigherEventPriority(
|
|
a: EventPriority,
|
|
b: EventPriority,
|
|
): boolean {
|
|
return a !== 0 && a < b;
|
|
}
|
|
|
|
export function eventPriorityToLane(updatePriority: EventPriority): Lane {
|
|
return updatePriority;
|
|
}
|
|
|
|
export function lanesToEventPriority(lanes: Lanes): EventPriority {
|
|
const lane = getHighestPriorityLane(lanes);
|
|
if (!isHigherEventPriority(DiscreteEventPriority, lane)) {
|
|
return DiscreteEventPriority;
|
|
}
|
|
if (!isHigherEventPriority(ContinuousEventPriority, lane)) {
|
|
return ContinuousEventPriority;
|
|
}
|
|
if (includesNonIdleWork(lane)) {
|
|
return DefaultEventPriority;
|
|
}
|
|
return IdleEventPriority;
|
|
}
|