@@ -17,7 +17,6 @@ let ReactFeatureFlags;
1717let Suspense ;
1818let SuspenseList ;
1919let act ;
20- let useHover ;
2120
2221function dispatchMouseEvent ( to , from ) {
2322 if ( ! to ) {
@@ -76,7 +75,7 @@ describe('ReactDOMServerPartialHydration', () => {
7675
7776 ReactFeatureFlags = require ( 'shared/ReactFeatureFlags' ) ;
7877 ReactFeatureFlags . enableSuspenseCallback = true ;
79- ReactFeatureFlags . enableDeprecatedFlareAPI = true ;
78+ ReactFeatureFlags . enableCreateEventHandleAPI = true ;
8079
8180 React = require ( 'react' ) ;
8281 ReactDOM = require ( 'react-dom' ) ;
@@ -2202,8 +2201,10 @@ describe('ReactDOMServerPartialHydration', () => {
22022201 } ) ;
22032202
22042203 // @gate experimental
2205- it ( 'does not invoke an event on a hydrated EventResponder until it commits' , async ( ) => {
2204+ it ( 'does not invoke an event on a hydrated event handle until it commits' , async ( ) => {
2205+ const setClick = ReactDOM . unstable_createEventHandle ( 'click' ) ;
22062206 let suspend = false ;
2207+ let isServerRendering = true ;
22072208 let resolve ;
22082209 const promise = new Promise ( resolvePromise => ( resolve = resolvePromise ) ) ;
22092210
@@ -2216,17 +2217,15 @@ describe('ReactDOMServerPartialHydration', () => {
22162217 }
22172218
22182219 const onEvent = jest . fn ( ) ;
2219- const TestResponder = React . DEPRECATED_createResponder (
2220- 'TestEventResponder' ,
2221- {
2222- targetEventTypes : [ 'click' ] ,
2223- onEvent,
2224- } ,
2225- ) ;
22262220
22272221 function Button ( ) {
2228- const listener = React . DEPRECATED_useResponder ( TestResponder , { } ) ;
2229- return < a DEPRECATED_flareListeners = { listener } > Click me</ a > ;
2222+ const ref = React . useRef ( null ) ;
2223+ if ( ! isServerRendering ) {
2224+ React . useLayoutEffect ( ( ) => {
2225+ return setClick ( ref . current , onEvent ) ;
2226+ } ) ;
2227+ }
2228+ return < a ref = { ref } > Click me</ a > ;
22302229 }
22312230
22322231 function App ( ) {
@@ -2253,6 +2252,7 @@ describe('ReactDOMServerPartialHydration', () => {
22532252 // On the client we don't have all data yet but we want to start
22542253 // hydrating anyway.
22552254 suspend = true ;
2255+ isServerRendering = false ;
22562256 const root = ReactDOM . createRoot ( container , { hydrate : true } ) ;
22572257 root . render ( < App /> ) ;
22582258
@@ -2364,23 +2364,25 @@ describe('ReactDOMServerPartialHydration', () => {
23642364 } ) ;
23652365
23662366 // @gate experimental
2367- it ( 'invokes discrete events on nested suspense boundaries in a root (responder system )' , async ( ) => {
2367+ it ( 'invokes discrete events on nested suspense boundaries in a root (createEventHandle )' , async ( ) => {
23682368 let suspend = false ;
2369+ let isServerRendering = true ;
23692370 let resolve ;
23702371 const promise = new Promise ( resolvePromise => ( resolve = resolvePromise ) ) ;
23712372
23722373 const onEvent = jest . fn ( ) ;
2373- const TestResponder = React . DEPRECATED_createResponder (
2374- 'TestEventResponder' ,
2375- {
2376- targetEventTypes : [ 'click' ] ,
2377- onEvent,
2378- } ,
2379- ) ;
2374+ const setClick = ReactDOM . unstable_createEventHandle ( 'click' ) ;
23802375
23812376 function Button ( ) {
2382- const listener = React . DEPRECATED_useResponder ( TestResponder , { } ) ;
2383- return < a DEPRECATED_flareListeners = { listener } > Click me</ a > ;
2377+ const ref = React . useRef ( null ) ;
2378+
2379+ if ( ! isServerRendering ) {
2380+ React . useLayoutEffect ( ( ) => {
2381+ return setClick ( ref . current , onEvent ) ;
2382+ } ) ;
2383+ }
2384+
2385+ return < a ref = { ref } > Click me</ a > ;
23842386 }
23852387
23862388 function Child ( ) {
@@ -2416,6 +2418,7 @@ describe('ReactDOMServerPartialHydration', () => {
24162418 // On the client we don't have all data yet but we want to start
24172419 // hydrating anyway.
24182420 suspend = true ;
2421+ isServerRendering = false ;
24192422 const root = ReactDOM . createRoot ( container , { hydrate : true } ) ;
24202423 root . render ( < App /> ) ;
24212424
@@ -2704,124 +2707,6 @@ describe('ReactDOMServerPartialHydration', () => {
27042707 document . body . removeChild ( container ) ;
27052708 } ) ;
27062709
2707- // @gate experimental
2708- it ( 'blocks only on the last continuous event (Responder system)' , async ( ) => {
2709- useHover = require ( 'react-interactions/events/hover' ) . useHover ;
2710-
2711- let suspend1 = false ;
2712- let resolve1 ;
2713- const promise1 = new Promise ( resolvePromise => ( resolve1 = resolvePromise ) ) ;
2714- let suspend2 = false ;
2715- let resolve2 ;
2716- const promise2 = new Promise ( resolvePromise => ( resolve2 = resolvePromise ) ) ;
2717-
2718- function First ( { text} ) {
2719- if ( suspend1 ) {
2720- throw promise1 ;
2721- } else {
2722- return 'Hello' ;
2723- }
2724- }
2725-
2726- function Second ( { text} ) {
2727- if ( suspend2 ) {
2728- throw promise2 ;
2729- } else {
2730- return 'World' ;
2731- }
2732- }
2733-
2734- const ops = [ ] ;
2735-
2736- function App ( ) {
2737- const listener1 = useHover ( {
2738- onHoverStart ( ) {
2739- ops . push ( 'Hover Start First' ) ;
2740- } ,
2741- onHoverEnd ( ) {
2742- ops . push ( 'Hover End First' ) ;
2743- } ,
2744- } ) ;
2745- const listener2 = useHover ( {
2746- onHoverStart ( ) {
2747- ops . push ( 'Hover Start Second' ) ;
2748- } ,
2749- onHoverEnd ( ) {
2750- ops . push ( 'Hover End Second' ) ;
2751- } ,
2752- } ) ;
2753- return (
2754- < div >
2755- < Suspense fallback = "Loading First..." >
2756- < span DEPRECATED_flareListeners = { listener1 } />
2757- { /* We suspend after to test what happens when we eager
2758- attach the listener. */ }
2759- < First />
2760- </ Suspense >
2761- < Suspense fallback = "Loading Second..." >
2762- < span DEPRECATED_flareListeners = { listener2 } >
2763- < Second />
2764- </ span >
2765- </ Suspense >
2766- </ div >
2767- ) ;
2768- }
2769-
2770- const finalHTML = ReactDOMServer . renderToString ( < App /> ) ;
2771- const container = document . createElement ( 'div' ) ;
2772- container . innerHTML = finalHTML ;
2773-
2774- // We need this to be in the document since we'll dispatch events on it.
2775- document . body . appendChild ( container ) ;
2776-
2777- const appDiv = container . getElementsByTagName ( 'div' ) [ 0 ] ;
2778- const firstSpan = appDiv . getElementsByTagName ( 'span' ) [ 0 ] ;
2779- const secondSpan = appDiv . getElementsByTagName ( 'span' ) [ 1 ] ;
2780- expect ( firstSpan . textContent ) . toBe ( '' ) ;
2781- expect ( secondSpan . textContent ) . toBe ( 'World' ) ;
2782-
2783- // On the client we don't have all data yet but we want to start
2784- // hydrating anyway.
2785- suspend1 = true ;
2786- suspend2 = true ;
2787- const root = ReactDOM . createRoot ( container , { hydrate : true } ) ;
2788- root . render ( < App /> ) ;
2789-
2790- Scheduler . unstable_flushAll ( ) ;
2791- jest . runAllTimers ( ) ;
2792-
2793- dispatchMouseEvent ( appDiv , null ) ;
2794- dispatchMouseEvent ( firstSpan , appDiv ) ;
2795- dispatchMouseEvent ( secondSpan , firstSpan ) ;
2796-
2797- // Neither target is yet hydrated.
2798- expect ( ops ) . toEqual ( [ ] ) ;
2799-
2800- // Resolving the second promise so that rendering can complete.
2801- suspend2 = false ;
2802- resolve2 ( ) ;
2803- await promise2 ;
2804-
2805- Scheduler . unstable_flushAll ( ) ;
2806- jest . runAllTimers ( ) ;
2807-
2808- // We've unblocked the current hover target so we should be
2809- // able to replay it now.
2810- expect ( ops ) . toEqual ( [ 'Hover Start Second' ] ) ;
2811-
2812- // Resolving the first promise has no effect now.
2813- suspend1 = false ;
2814- resolve1 ( ) ;
2815- await promise1 ;
2816-
2817- Scheduler . unstable_flushAll ( ) ;
2818- jest . runAllTimers ( ) ;
2819-
2820- expect ( ops ) . toEqual ( [ 'Hover Start Second' ] ) ;
2821-
2822- document . body . removeChild ( container ) ;
2823- } ) ;
2824-
28252710 // @gate experimental
28262711 it ( 'finishes normal pri work before continuing to hydrate a retry' , async ( ) => {
28272712 let suspend = false ;
0 commit comments