995
renderLanes: Lanes,
996
): Lane {
997
const renderLane = getHighestPriorityLane(renderLanes);
998
-
999
- let lane;
1000
- if ((renderLane & SyncUpdateLanes) !== NoLane) {
1001
- lane = SyncHydrationLane;
1002
- } else {
1003
- switch (renderLane) {
1004
- case SyncLane:
1005
- lane = SyncHydrationLane;
1006
- break;
1007
- case InputContinuousLane:
1008
- lane = InputContinuousHydrationLane;
1009
- break;
1010
- case DefaultLane:
1011
- lane = DefaultHydrationLane;
1012
- break;
1013
- case TransitionLane1:
1014
- case TransitionLane2:
1015
- case TransitionLane3:
1016
- case TransitionLane4:
1017
- case TransitionLane5:
1018
- case TransitionLane6:
1019
- case TransitionLane7:
1020
- case TransitionLane8:
1021
- case TransitionLane9:
1022
- case TransitionLane10:
1023
- case TransitionLane11:
1024
- case TransitionLane12:
1025
- case TransitionLane13:
1026
- case TransitionLane14:
1027
- case TransitionLane15:
1028
- case RetryLane1:
1029
- case RetryLane2:
1030
- case RetryLane3:
1031
- case RetryLane4:
1032
- lane = TransitionHydrationLane;
1033
- break;
1034
- case IdleLane:
1035
- lane = IdleHydrationLane;
1036
- break;
1037
- default:
1038
- // Everything else is already either a hydration lane, or shouldn't
1039
- // be retried at a hydration lane.
1040
- lane = NoLane;
1041
- break;
1042
- }
1043
- }
1044
-
998
+ const bumpedLane =
999
+ (renderLane & SyncUpdateLanes) !== NoLane
1000
+ ? // Unify sync lanes. We don't do this inside getBumpedLaneForHydrationByLane
1001
+ // because that causes things to flush synchronously when they shouldn't.
1002
+ // TODO: This is not coherent but that's beacuse the unification is not coherent.
1003
+ // We need to get merge these into an actual single lane.
1004
+ SyncHydrationLane
1005
+ : getBumpedLaneForHydrationByLane(renderLane);
1006
// Check if the lane we chose is suspended. If so, that indicates that we
1007
// already attempted and failed to hydrate at that level. Also check if we're
1008
// already rendering that lane, which is rare but could happen.
1048
- if ((lane & (root.suspendedLanes | renderLanes)) !== NoLane) {
1009
+ // TODO: This should move into the caller to decide whether giving up is valid.
1010
+ if ((bumpedLane & (root.suspendedLanes | renderLanes)) !== NoLane) {
1011
// Give up trying to hydrate and fall back to client render.
1012
return NoLane;
1013
}
1014
+ return bumpedLane;
1015
+}
1016
1017
+export function getBumpedLaneForHydrationByLane(lane: Lane): Lane {
1018
+ switch (lane) {
1019
+ case SyncLane:
1020
+ lane = SyncHydrationLane;
1021
+ break;
1022
+ case InputContinuousLane:
1023
+ lane = InputContinuousHydrationLane;
1024
+ break;
1025
+ case DefaultLane:
1026
+ lane = DefaultHydrationLane;
1027
+ break;
1028
+ case TransitionLane1:
1029
+ case TransitionLane2:
1030
+ case TransitionLane3:
1031
+ case TransitionLane4:
1032
+ case TransitionLane5:
1033
+ case TransitionLane6:
1034
+ case TransitionLane7:
1035
+ case TransitionLane8:
1036
+ case TransitionLane9:
1037
+ case TransitionLane10:
1038
+ case TransitionLane11:
1039
+ case TransitionLane12:
1040
+ case TransitionLane13:
1041
+ case TransitionLane14:
1042
+ case TransitionLane15:
1043
+ case RetryLane1:
1044
+ case RetryLane2:
1045
+ case RetryLane3:
1046
+ case RetryLane4:
1047
+ lane = TransitionHydrationLane;
1048
+ break;
1049
+ case IdleLane:
1050
+ lane = IdleHydrationLane;
1051
+ break;
1052
+ default:
1053
+ // Everything else is already either a hydration lane, or shouldn't
1054
+ // be retried at a hydration lane.
1055
+ lane = NoLane;
1056
+ break;
1057
+ }
1058
return lane;
1059
}
1060