@@ -17,7 +17,6 @@ let ReactFeatureFlags;
17
17
let Suspense ;
18
18
let SuspenseList ;
19
19
let act ;
20
- let useHover ;
21
20
22
21
function dispatchMouseEvent ( to , from ) {
23
22
if ( ! to ) {
@@ -76,7 +75,7 @@ describe('ReactDOMServerPartialHydration', () => {
76
75
77
76
ReactFeatureFlags = require ( 'shared/ReactFeatureFlags' ) ;
78
77
ReactFeatureFlags . enableSuspenseCallback = true ;
79
- ReactFeatureFlags . enableDeprecatedFlareAPI = true ;
78
+ ReactFeatureFlags . enableCreateEventHandleAPI = true ;
80
79
81
80
React = require ( 'react' ) ;
82
81
ReactDOM = require ( 'react-dom' ) ;
@@ -2202,8 +2201,10 @@ describe('ReactDOMServerPartialHydration', () => {
2202
2201
} ) ;
2203
2202
2204
2203
// @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' ) ;
2206
2206
let suspend = false ;
2207
+ let isServerRendering = true ;
2207
2208
let resolve ;
2208
2209
const promise = new Promise ( resolvePromise => ( resolve = resolvePromise ) ) ;
2209
2210
@@ -2216,17 +2217,15 @@ describe('ReactDOMServerPartialHydration', () => {
2216
2217
}
2217
2218
2218
2219
const onEvent = jest . fn ( ) ;
2219
- const TestResponder = React . DEPRECATED_createResponder (
2220
- 'TestEventResponder' ,
2221
- {
2222
- targetEventTypes : [ 'click' ] ,
2223
- onEvent,
2224
- } ,
2225
- ) ;
2226
2220
2227
2221
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 > ;
2230
2229
}
2231
2230
2232
2231
function App ( ) {
@@ -2253,6 +2252,7 @@ describe('ReactDOMServerPartialHydration', () => {
2253
2252
// On the client we don't have all data yet but we want to start
2254
2253
// hydrating anyway.
2255
2254
suspend = true ;
2255
+ isServerRendering = false ;
2256
2256
const root = ReactDOM . createRoot ( container , { hydrate : true } ) ;
2257
2257
root . render ( < App /> ) ;
2258
2258
@@ -2364,23 +2364,25 @@ describe('ReactDOMServerPartialHydration', () => {
2364
2364
} ) ;
2365
2365
2366
2366
// @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 ( ) => {
2368
2368
let suspend = false ;
2369
+ let isServerRendering = true ;
2369
2370
let resolve ;
2370
2371
const promise = new Promise ( resolvePromise => ( resolve = resolvePromise ) ) ;
2371
2372
2372
2373
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' ) ;
2380
2375
2381
2376
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 > ;
2384
2386
}
2385
2387
2386
2388
function Child ( ) {
@@ -2416,6 +2418,7 @@ describe('ReactDOMServerPartialHydration', () => {
2416
2418
// On the client we don't have all data yet but we want to start
2417
2419
// hydrating anyway.
2418
2420
suspend = true ;
2421
+ isServerRendering = false ;
2419
2422
const root = ReactDOM . createRoot ( container , { hydrate : true } ) ;
2420
2423
root . render ( < App /> ) ;
2421
2424
@@ -2704,124 +2707,6 @@ describe('ReactDOMServerPartialHydration', () => {
2704
2707
document . body . removeChild ( container ) ;
2705
2708
} ) ;
2706
2709
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
-
2825
2710
// @gate experimental
2826
2711
it ( 'finishes normal pri work before continuing to hydrate a retry' , async ( ) => {
2827
2712
let suspend = false ;
0 commit comments