@@ -23,27 +23,42 @@ export function renderInContainer(Component: FunctionComponent, container: HTMLE
2323}
2424
2525export function onDOMContentMutate ( render : ( ) => void ) {
26- // observe DOM changes to re-render the custom header and footer
27- let observations = 0
26+ let hasRendered = false
27+ // observe DOM changes to re-render the custom header and footer
28+ let observations = 0
29+
30+ const setupMutationObserver = ( ) => {
31+ if ( ! hasRendered ) {
32+ console . log ( "Initial render" )
33+ render ( )
34+ hasRendered = true
35+ }
36+ new MutationObserver ( ( e , o ) => {
37+ for ( const item of e ) {
38+ if ( item . target instanceof HTMLElement ) {
39+ const target = item . target
40+ if ( target . id === 'fern-header' || target . id === 'fern-footer' ) {
41+ if ( observations < 3 ) {
42+ // react hydration will trigger a mutation event
43+ observations ++
44+ } else {
45+ o . disconnect ( )
46+ }
47+ break
48+ }
49+ }
50+ }
51+ } ) . observe ( document . body , { childList : true , subtree : true } )
52+ }
53+
54+ // if DOM is already loaded we run
55+ if ( document . readyState === 'loading' ) {
2856 document . addEventListener ( 'DOMContentLoaded' , ( ) => {
29- console . log ( 'DOMContentLoaded' )
30- render ( )
31- new MutationObserver ( ( e , o ) => {
32- render ( )
33- for ( const item of e ) {
34- if ( item . target instanceof HTMLElement ) {
35- const target = item . target
36- if ( target . id === 'fern-header' || target . id === 'fern-footer' ) {
37- if ( observations < 3 ) {
38- // react hydration will trigger a mutation event
39- observations ++
40- } else {
41- o . disconnect ( )
42- }
43- break
44- }
45- }
46- }
47- } ) . observe ( document . body , { childList : true , subtree : true } )
57+ console . log ( 'DOMContentLoaded (delayed)' )
58+ setupMutationObserver ( )
4859 } )
49- }
60+ } else {
61+ console . log ( 'DOMContentLoaded already fired' )
62+ setupMutationObserver ( )
63+ }
64+ }
0 commit comments