9
9
untrack ,
10
10
type EventHandler ,
11
11
type QwikVisibleEvent ,
12
- useContext ,
13
12
} from '@builder.io/qwik' ;
14
13
import { getClientNavPath , shouldPreload } from './utils' ;
15
14
import { loadClientData } from './use-endpoint' ;
@@ -18,7 +17,7 @@ import { preloadRouteBundles } from './client-navigate';
18
17
import { isDev } from '@builder.io/qwik' ;
19
18
// @ts -expect-error we don't have types for the preloader yet
20
19
import { p as preload } from '@builder.io/qwik/preloader' ;
21
- import { fallbackToMpaContext } from './contexts' ;
20
+ // import { fallbackToMpaContext } from './contexts';
22
21
23
22
/** @public */
24
23
export const Link = component$ < LinkProps > ( ( props ) => {
@@ -37,11 +36,11 @@ export const Link = component$<LinkProps>((props) => {
37
36
...linkProps
38
37
} = ( ( ) => props ) ( ) ;
39
38
40
- const defaultFallbackToMpa = useContext ( fallbackToMpaContext ) . default ;
39
+ // const defaultFallbackToMpa = useContext(fallbackToMpaContext).default;
41
40
42
- const fallbackToMpa = __EXPERIMENTAL__ . enableFallbackToMpa
43
- ? untrack ( ( ) => Boolean ( fallbackToMpaProp ?? defaultFallbackToMpa ) )
44
- : undefined ;
41
+ // const fallbackToMpa = __EXPERIMENTAL__.enableFallbackToMpa
42
+ // ? untrack(() => Boolean(fallbackToMpaProp ?? defaultFallbackToMpa))
43
+ // : undefined;
45
44
46
45
const clientNavPath = untrack ( ( ) => getClientNavPath ( { ...linkProps , reload } , loc ) ) ;
47
46
linkProps . href = clientNavPath || originalHref ;
@@ -104,11 +103,23 @@ export const Link = component$<LinkProps>((props) => {
104
103
if ( ! target ?. href ) {
105
104
return ;
106
105
}
107
- const onTooMany = ( ) => location . assign ( target . href ) ;
108
- window . addEventListener ( 'overlySlowReprioritizedPreloading' , onTooMany ) ;
106
+ const onTooMany = ( event : Event ) => {
107
+ const userEventPreloads = ( event as CustomEvent ) . detail ;
108
+ /**
109
+ * On chrome 3G throttling, 10kb takes ~1s to download. Bundles weight ~1kb on average, so 100
110
+ * bundles is ~100kb which takes ~10s to download.
111
+ *
112
+ * This can serve to fallback to MPA when SPA navigation takes more than 10s. Or in extreme
113
+ * cases, if a component needs more than a 100 bundles, display a spinner.
114
+ */
115
+ if ( userEventPreloads . count >= 100 ) {
116
+ location . assign ( target . href ) ;
117
+ }
118
+ } ;
119
+ window . addEventListener ( 'userEventPreloads' , onTooMany ) ;
109
120
const url = new URL ( target . href ) ;
110
121
preloadRouteBundles ( url . pathname , 1 ) ;
111
- window . removeEventListener ( 'overlySlowReprioritizedPreloading ' , onTooMany ) ;
122
+ window . removeEventListener ( 'userEventPreloads ' , onTooMany ) ;
112
123
} ) ;
113
124
114
125
useVisibleTask$ ( ( { track } ) => {
0 commit comments