1- import { reactOnRailsContext , type Context } from './context' ;
1+ import { type Context , isWindow } from './context' ;
22import {
33 renderOrHydrateForceLoadedComponents ,
44 renderOrHydrateAllComponents ,
55 hydrateForceLoadedStores ,
66 hydrateAllStores ,
77 unmountAll ,
88} from './ClientSideRenderer' ;
9-
10- /* eslint-disable @typescript-eslint/no-explicit-any */
11-
12- declare global {
13- namespace Turbolinks {
14- interface TurbolinksStatic {
15- controller ?: unknown ;
16- }
17- }
18- }
19-
20-
21- function debugTurbolinks ( ...msg : string [ ] ) : void {
22- if ( ! window ) {
23- return ;
24- }
25-
26- const context = reactOnRailsContext ( ) ;
27- if ( context . ReactOnRails && context . ReactOnRails . option ( 'traceTurbolinks' ) ) {
28- console . log ( 'TURBO:' , ...msg ) ;
29- }
30- }
31-
32- function turbolinksInstalled ( ) : boolean {
33- return ( typeof Turbolinks !== 'undefined' ) ;
34- }
35-
36- function turboInstalled ( ) {
37- const context = reactOnRailsContext ( ) ;
38- if ( context . ReactOnRails ) {
39- return context . ReactOnRails . option ( 'turbo' ) === true ;
40- }
41- return false ;
42- }
43-
44- function turbolinksVersion5 ( ) : boolean {
45- return ( typeof Turbolinks . controller !== 'undefined' ) ;
46- }
47-
48- function turbolinksSupported ( ) : boolean {
49- return Turbolinks . supported ;
50- }
9+ import { onPageLoaded , onPageUnloaded } from './pageLifecycle' ;
10+ import { debugTurbolinks } from './turbolinksUtils' ;
5111
5212export function reactOnRailsPageLoaded ( ) : void {
5313 debugTurbolinks ( 'reactOnRailsPageLoaded' ) ;
@@ -60,44 +20,8 @@ function reactOnRailsPageUnloaded(): void {
6020 unmountAll ( ) ;
6121}
6222
63- function renderInit ( ) : void {
64- // Install listeners when running on the client (browser).
65- // We must do this check for turbolinks AFTER the document is loaded because we load the
66- // Webpack bundles first.
67- if ( ( ! turbolinksInstalled ( ) || ! turbolinksSupported ( ) ) && ! turboInstalled ( ) ) {
68- debugTurbolinks ( 'NOT USING TURBOLINKS: calling reactOnRailsPageLoaded' ) ;
69- reactOnRailsPageLoaded ( ) ;
70- return ;
71- }
72-
73- if ( turboInstalled ( ) ) {
74- debugTurbolinks (
75- 'USING TURBO: document added event listeners ' +
76- 'turbo:before-render and turbo:render.' ) ;
77- document . addEventListener ( 'turbo:before-render' , reactOnRailsPageUnloaded ) ;
78- document . addEventListener ( 'turbo:render' , reactOnRailsPageLoaded ) ;
79- reactOnRailsPageLoaded ( ) ;
80- } else if ( turbolinksVersion5 ( ) ) {
81- debugTurbolinks (
82- 'USING TURBOLINKS 5: document added event listeners ' +
83- 'turbolinks:before-render and turbolinks:render.' ) ;
84- document . addEventListener ( 'turbolinks:before-render' , reactOnRailsPageUnloaded ) ;
85- document . addEventListener ( 'turbolinks:render' , reactOnRailsPageLoaded ) ;
86- reactOnRailsPageLoaded ( ) ;
87- } else {
88- debugTurbolinks (
89- 'USING TURBOLINKS 2: document added event listeners page:before-unload and ' +
90- 'page:change.' ) ;
91- document . addEventListener ( 'page:before-unload' , reactOnRailsPageUnloaded ) ;
92- document . addEventListener ( 'page:change' , reactOnRailsPageLoaded ) ;
93- }
94- }
95-
96- function isWindow ( context : Context ) : context is Window {
97- return ( context as Window ) . document !== undefined ;
98- }
99-
100- export function clientStartup ( context : Context ) : void {
23+ export async function clientStartup ( context : Context ) : Promise < void > {
24+ await new Promise ( ( resolve ) => setTimeout ( resolve , 4000 ) ) ;
10125 // Check if server rendering
10226 if ( ! isWindow ( context ) ) {
10327 return ;
@@ -112,14 +36,11 @@ export function clientStartup(context: Context): void {
11236 // eslint-disable-next-line no-underscore-dangle, no-param-reassign
11337 context . __REACT_ON_RAILS_EVENT_HANDLERS_RAN_ONCE__ = true ;
11438
115- if ( document . readyState !== 'complete' ) {
116- // force loaded components and stores are rendered and hydrated immediately
117- renderOrHydrateForceLoadedComponents ( ) ;
118- hydrateForceLoadedStores ( ) ;
39+ // force loaded components and stores are rendered and hydrated immediately
40+ renderOrHydrateForceLoadedComponents ( ) ;
41+ hydrateForceLoadedStores ( ) ;
11942
120- // Other components and stores are rendered and hydrated when the page is fully loaded
121- document . addEventListener ( 'DOMContentLoaded' , renderInit ) ;
122- } else {
123- renderInit ( ) ;
124- }
43+ // Other components and stores are rendered and hydrated when the page is fully loaded
44+ onPageLoaded ( renderOrHydrateAllComponents ) ;
45+ onPageUnloaded ( reactOnRailsPageUnloaded ) ;
12546}
0 commit comments