18
} from './ReactFiberConfig';
19
import type {Fiber, FiberRoot} from './ReactInternalTypes';
20
import type {Lanes} from './ReactFiberLane';
21
-import {includesOnlyViewTransitionEligibleLanes} from './ReactFiberLane';
21
+import {
22
+ includesOnlySuspenseyCommitEligibleLanes,
23
+ includesOnlyViewTransitionEligibleLanes,
24
+} from './ReactFiberLane';
25
import type {SuspenseState, RetryQueue} from './ReactFiberSuspenseComponent';
26
import type {UpdateQueue} from './ReactFiberClassUpdateQueue';
27
import type {FunctionComponentUpdateQueue} from './ReactFiberHooks';
163
mountHoistable,
164
unmountHoistable,
165
prepareToCommitHoistables,
166
+ maySuspendCommitInSyncRender,
167
suspendInstance,
168
suspendResource,
169
resetFormInstance,
4284
// ViewTransitions so that we know to also visit those to collect appearing
4285
// pairs.
4286
let suspenseyCommitFlag = ShouldSuspendCommit;
4283
-export function accumulateSuspenseyCommit(finishedWork: Fiber): void {
4287
+export function accumulateSuspenseyCommit(
4288
+ finishedWork: Fiber,
4289
+ committedLanes: Lanes,
4290
+): void {
4291
resetAppearingViewTransitions();
4285
- accumulateSuspenseyCommitOnFiber(finishedWork);
4292
+ accumulateSuspenseyCommitOnFiber(finishedWork, committedLanes);
4293
}
4294
4288
-function recursivelyAccumulateSuspenseyCommit(parentFiber: Fiber): void {
4295
+function recursivelyAccumulateSuspenseyCommit(
4296
+ parentFiber: Fiber,
4297
+ committedLanes: Lanes,
4298
+): void {
4299
if (parentFiber.subtreeFlags & suspenseyCommitFlag) {
4300
let child = parentFiber.child;
4301
while (child !== null) {
4292
- accumulateSuspenseyCommitOnFiber(child);
4302
+ accumulateSuspenseyCommitOnFiber(child, committedLanes);
4303
child = child.sibling;
4304
}
4305
}
4306
}
4307
4298
-function accumulateSuspenseyCommitOnFiber(fiber: Fiber) {
4308
+function accumulateSuspenseyCommitOnFiber(fiber: Fiber, committedLanes: Lanes) {
4309
switch (fiber.tag) {
4310
case HostHoistable: {
4301
- recursivelyAccumulateSuspenseyCommit(fiber);
4311
+ recursivelyAccumulateSuspenseyCommit(fiber, committedLanes);
4312
if (fiber.flags & suspenseyCommitFlag) {
4313
if (fiber.memoizedState !== null) {
4314
suspendResource(
4318
fiber.memoizedProps,
4319
);
4320
} else {
4321
+ const instance = fiber.stateNode;
4322
const type = fiber.type;
4323
const props = fiber.memoizedProps;
4313
- suspendInstance(type, props);
4324
+ // TODO: Allow sync lanes to suspend too with an opt-in.
4325
+ if (
4326
+ includesOnlySuspenseyCommitEligibleLanes(committedLanes) ||
4327
+ maySuspendCommitInSyncRender(type, props)
4328
+ ) {
4329
+ suspendInstance(instance, type, props);
4330
+ }
4331
}
4332
}
4333
break;
4334
}
4335
case HostComponent: {
4319
- recursivelyAccumulateSuspenseyCommit(fiber);
4336
+ recursivelyAccumulateSuspenseyCommit(fiber, committedLanes);
4337
if (fiber.flags & suspenseyCommitFlag) {
4338
+ const instance = fiber.stateNode;
4339
const type = fiber.type;
4340
const props = fiber.memoizedProps;
4323
- suspendInstance(type, props);
4341
+ // TODO: Allow sync lanes to suspend too with an opt-in.
4342
+ if (
4343
+ includesOnlySuspenseyCommitEligibleLanes(committedLanes) ||
4344
+ maySuspendCommitInSyncRender(type, props)
4345
+ ) {
4346
+ suspendInstance(instance, type, props);
4347
+ }
4348
}
4349
break;
4350
}
4355
const container: Container = fiber.stateNode.containerInfo;
4356
currentHoistableRoot = getHoistableRoot(container);
4357
4334
- recursivelyAccumulateSuspenseyCommit(fiber);
4358
+ recursivelyAccumulateSuspenseyCommit(fiber, committedLanes);
4359
currentHoistableRoot = previousHoistableRoot;
4360
} else {
4337
- recursivelyAccumulateSuspenseyCommit(fiber);
4361
+ recursivelyAccumulateSuspenseyCommit(fiber, committedLanes);
4362
}
4363
break;
4364
}
4376
// instances, even if they're in the current tree.
4377
const prevFlags = suspenseyCommitFlag;
4378
suspenseyCommitFlag = MaySuspendCommit;
4355
- recursivelyAccumulateSuspenseyCommit(fiber);
4379
+ recursivelyAccumulateSuspenseyCommit(fiber, committedLanes);
4380
suspenseyCommitFlag = prevFlags;
4381
} else {
4358
- recursivelyAccumulateSuspenseyCommit(fiber);
4382
+ recursivelyAccumulateSuspenseyCommit(fiber, committedLanes);
4383
}
4384
}
4385
break;
4399
trackAppearingViewTransition(name, state);
4400
}
4401
}
4378
- recursivelyAccumulateSuspenseyCommit(fiber);
4402
+ recursivelyAccumulateSuspenseyCommit(fiber, committedLanes);
4403
break;
4404
}
4405
// Fallthrough
4406
}
4407
default: {
4384
- recursivelyAccumulateSuspenseyCommit(fiber);
4408
+ recursivelyAccumulateSuspenseyCommit(fiber, committedLanes);
4409
}
4410
}
4411
}