@@ -364,10 +364,17 @@ function handleTopLevelType(
364364 if ( state === null && responder . createInitialState !== undefined ) {
365365 state = fiber . stateNode . state = responder . createInitialState ( props ) ;
366366 }
367+ const previousFiber = currentFiber ;
368+ const previousResponder = currentResponder ;
367369 currentFiber = fiber ;
368370 currentResponder = responder ;
369371
370- responder . onEvent ( responderEvent , eventResponderContext , props , state ) ;
372+ try {
373+ responder . onEvent ( responderEvent , eventResponderContext , props , state ) ;
374+ } finally {
375+ currentFiber = previousFiber ;
376+ currentResponder = previousResponder ;
377+ }
371378}
372379
373380export function runResponderEventsInBatch (
@@ -413,3 +420,30 @@ export function runResponderEventsInBatch(
413420 processEventQueue ( ) ;
414421 }
415422}
423+
424+ export function unmountEventResponder (
425+ responder : ReactEventResponder ,
426+ fiber : Fiber ,
427+ ) : void {
428+ const onUnmount = responder . onUnmount ;
429+ if ( onUnmount !== undefined ) {
430+ let { props , state } = fiber . stateNode ;
431+ const previousEventQueue = currentEventQueue ;
432+ const previousFiber = currentFiber ;
433+ const previousResponder = currentResponder ;
434+ currentEventQueue = createEventQueue ( ) ;
435+ currentFiber = fiber ;
436+ currentResponder = responder ;
437+ try {
438+ onUnmount ( eventResponderContext , props , state ) ;
439+ } finally {
440+ currentEventQueue = previousEventQueue ;
441+ currentFiber = previousFiber ;
442+ currentResponder = previousResponder ;
443+ }
444+ }
445+ if ( currentOwner === fiber ) {
446+ // TODO fire owner changed callback
447+ currentOwner = null ;
448+ }
449+ }
0 commit comments