@@ -35,8 +35,22 @@ export const useState = (init) =>
35
35
export const useEffect = ( ...args ) =>
36
36
useBlockEnvironment ( ) !== "save" ? useReactEffect ( ...args ) : noop ;
37
37
38
- export const hydrate = ( container , element , technique ) => {
38
+ export const hydrate = ( container , element , hydrationOptions ) => {
39
+ const { technique, media } = hydrationOptions || { } ;
40
+ const cb = ( ) => {
41
+ ReactHydrate ( container , element ) ;
42
+ } ;
39
43
switch ( technique ) {
44
+ case "media" :
45
+ if ( media ) {
46
+ const mql = matchMedia ( media ) ;
47
+ if ( mql . matches ) {
48
+ cb ( ) ;
49
+ } else {
50
+ mql . addEventListener ( "change" , cb , { once : true } ) ;
51
+ }
52
+ }
53
+ break ;
40
54
// Hydrate the element when is visible in the viewport.
41
55
// https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
42
56
case "view" :
@@ -45,7 +59,7 @@ export const hydrate = (container, element, technique) => {
45
59
if ( ! entry . isIntersecting ) continue ;
46
60
// As soon as we hydrate, disconnect this IntersectionObserver.
47
61
io . disconnect ( ) ;
48
- ReactHydrate ( container , element ) ;
62
+ cb ( ) ;
49
63
break ; // break loop on first match
50
64
}
51
65
} ) ;
@@ -54,14 +68,13 @@ export const hydrate = (container, element, technique) => {
54
68
case "idle" :
55
69
// Safari does not support requestIdleCalback, we use a timeout instead. https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback
56
70
if ( "requestIdleCallback" in window ) {
57
- window . requestIdleCallback ( ( ) => {
58
- ReactHydrate ( container , element ) ;
59
- } ) ;
71
+ window . requestIdleCallback ( cb ) ;
60
72
} else {
61
- setTimeout ( ReactHydrate ( container , element ) , 200 ) ;
73
+ setTimeout ( cb , 200 ) ;
62
74
}
63
75
break ;
76
+ // Hydrate this component immediately.
64
77
default :
65
- ReactHydrate ( container , element ) ;
78
+ cb ( ) ;
66
79
}
67
80
} ;
0 commit comments