159
commitAttachRef,
160
commitPassiveEffectDurations,
161
commitResetTextContent,
162
+ isSuspenseBoundaryBeingHidden,
163
} from './ReactFiberCommitWork.new';
164
import {enqueueUpdate} from './ReactUpdateQueue.new';
165
import {resetContextDependencies} from './ReactFiberNewContext.new';
202
203
// Used by `act`
204
import enqueueTask from 'shared/enqueueTask';
204
-import {isFiberHiddenOrDeletedAndContains} from './ReactFiberTreeReflection';
205
+import {doesFiberContain} from './ReactFiberTreeReflection';
206
207
const ceil = Math.ceil;
208
2103
2104
function commitBeforeMutationEffects() {
2105
while (nextEffect !== null) {
2105
- if (
2106
- !shouldFireAfterActiveInstanceBlur &&
2107
- focusedInstanceHandle !== null &&
2108
- isFiberHiddenOrDeletedAndContains(nextEffect, focusedInstanceHandle)
2109
- ) {
2110
- shouldFireAfterActiveInstanceBlur = true;
2111
- beforeActiveInstanceBlur();
2106
+ const current = nextEffect.alternate;
2107
+
2108
+ if (!shouldFireAfterActiveInstanceBlur && focusedInstanceHandle !== null) {
2109
+ if ((nextEffect.effectTag & Deletion) !== NoEffect) {
2110
+ if (doesFiberContain(nextEffect, focusedInstanceHandle)) {
2111
+ shouldFireAfterActiveInstanceBlur = true;
2112
+ beforeActiveInstanceBlur();
2113
+ }
2114
+ } else {
2115
+ // TODO: Move this out of the hot path using a dedicated effect tag.
2116
+ if (
2117
+ nextEffect.tag === SuspenseComponent &&
2118
+ isSuspenseBoundaryBeingHidden(current, nextEffect) &&
2119
+ doesFiberContain(nextEffect, focusedInstanceHandle)
2120
+ ) {
2121
+ shouldFireAfterActiveInstanceBlur = true;
2122
+ beforeActiveInstanceBlur();
2123
+ }
2124
+ }
2125
}
2126
+
2127
const effectTag = nextEffect.effectTag;
2128
if ((effectTag & Snapshot) !== NoEffect) {
2129
setCurrentDebugFiberInDEV(nextEffect);
2130
2117
- const current = nextEffect.alternate;
2131
commitBeforeMutationEffectOnFiber(current, nextEffect);
2132
2133
resetCurrentDebugFiberInDEV();