@@ -122,7 +122,10 @@ export type UpdateQueue<State> = {
122
122
firstEffect : Update < State > | null ,
123
123
lastEffect : Update < State > | null ,
124
124
125
- // TODO: Workaround for lack of tuples. Could global state instead.
125
+ firstCapturedEffect : Update < State > | null ,
126
+ lastCapturedEffect : Update < State > | null ,
127
+
128
+ // TODO: Workaround for lack of tuples. Could use global state instead.
126
129
hasForceUpdate : boolean ,
127
130
128
131
// DEV-only
@@ -144,6 +147,8 @@ export function createUpdateQueue<State>(baseState: State): UpdateQueue<State> {
144
147
lastCapturedUpdate : null ,
145
148
firstEffect : null ,
146
149
lastEffect : null ,
150
+ firstCapturedEffect : null ,
151
+ lastCapturedEffect : null ,
147
152
hasForceUpdate : false ,
148
153
} ;
149
154
if ( __DEV__ ) {
@@ -170,6 +175,9 @@ function cloneUpdateQueue<State>(
170
175
171
176
firstEffect : null ,
172
177
lastEffect : null ,
178
+
179
+ firstCapturedEffect : null ,
180
+ lastCapturedEffect : null ,
173
181
} ;
174
182
if ( __DEV__ ) {
175
183
queue . isProcessing = false ;
@@ -428,12 +436,22 @@ export function processUpdateQueue<State>(
428
436
} else {
429
437
// This update does have sufficient priority. Process it and compute
430
438
// a new result.
431
- resultState = processSingleUpdate (
432
- workInProgress ,
433
- queue ,
434
- update ,
435
- resultState ,
436
- ) ;
439
+ const commit = update . commit ;
440
+ const process = update . process ;
441
+ if ( process !== null ) {
442
+ resultState = process ( workInProgress , resultState , queue ) ;
443
+ }
444
+ if ( commit !== null ) {
445
+ workInProgress . effectTag |= Callback ;
446
+ // Set this to null, in case it was mutated during an aborted render.
447
+ update . nextEffect = null ;
448
+ if ( queue . lastEffect === null ) {
449
+ queue . firstEffect = queue . lastEffect = update ;
450
+ } else {
451
+ queue . lastEffect . nextEffect = update ;
452
+ queue . lastEffect = update ;
453
+ }
454
+ }
437
455
}
438
456
// Continue to the next update.
439
457
update = update . next ;
@@ -467,12 +485,22 @@ export function processUpdateQueue<State>(
467
485
} else {
468
486
// This update does have sufficient priority. Process it and compute
469
487
// a new result.
470
- resultState = processSingleUpdate (
471
- workInProgress ,
472
- queue ,
473
- update ,
474
- resultState ,
475
- ) ;
488
+ const commit = update . commit ;
489
+ const process = update . process ;
490
+ if ( process !== null ) {
491
+ resultState = process ( workInProgress , resultState , queue ) ;
492
+ }
493
+ if ( commit !== null ) {
494
+ workInProgress . effectTag |= Callback ;
495
+ // Set this to null, in case it was mutated during an aborted render.
496
+ update . nextEffect = null ;
497
+ if ( queue . lastCapturedEffect === null ) {
498
+ queue . firstCapturedEffect = queue . lastCapturedEffect = update ;
499
+ } else {
500
+ queue . lastCapturedEffect . nextEffect = update ;
501
+ queue . lastCapturedEffect = update ;
502
+ }
503
+ }
476
504
}
477
505
update = update . next ;
478
506
}
@@ -533,4 +561,15 @@ export function commitUpdateQueue<State>(
533
561
}
534
562
effect = effect.nextEffect;
535
563
}
564
+
565
+ effect = finishedQueue . firstCapturedEffect ;
566
+ finishedQueue . firstCapturedEffect = finishedQueue . lastCapturedEffect = null ;
567
+ while ( effect !== null ) {
568
+ const commit = effect . commit ;
569
+ if ( commit !== null ) {
570
+ effect . commit = null ;
571
+ commit ( finishedWork ) ;
572
+ }
573
+ effect = effect.nextEffect;
574
+ }
536
575
}
0 commit comments