@@ -16,6 +16,11 @@ const FERN_CONTENT_WRAPPER_ID = 'fern-header-content-wrapper'
16
16
const DEVREV_CONTENT_WRAPPER_ID = 'devrev-header-content-wrapper'
17
17
const FERN_HEADER_CONTAINER_ID = 'fern-header'
18
18
19
+ // ADD GUARDS: Track what's already been rendered
20
+ let headerRendered = false
21
+ let footerRendered = false
22
+ let sidenavRendered = false
23
+
19
24
const render = async ( ) => {
20
25
if ( typeof window === 'undefined' ) {
21
26
return
@@ -28,7 +33,9 @@ const render = async () => {
28
33
29
34
const theme = document . getElementsByTagName ( 'html' ) [ 0 ] . getAttribute ( 'class' )
30
35
31
- if ( ! document . getElementById ( 'sidenav-header-wrapper' ) && sidenav ) {
36
+ if ( ! sidenavRendered && ! document . getElementById ( 'sidenav-header-wrapper' ) && sidenav ) {
37
+ sidenavRendered = true
38
+
32
39
const sidenavHeaderWrapper = document . createElement ( 'div' )
33
40
sidenavHeaderWrapper . setAttribute ( 'id' , 'sidenav-header-wrapper' )
34
41
sidenav . appendChild ( sidenavHeaderWrapper )
@@ -51,7 +58,11 @@ const render = async () => {
51
58
const fernHeaderId = document . getElementById ( FERN_CONTENT_WRAPPER_ID )
52
59
const devrevHeaderId = document . getElementById ( DEVREV_CONTENT_WRAPPER_ID )
53
60
54
- if ( ! fernHeaderId && ! devrevHeaderId ) {
61
+ // GUARD: Only render header once
62
+ if ( ! headerRendered && ! fernHeaderId && ! devrevHeaderId ) {
63
+ console . log ( 'DEBUG: Rendering header...' )
64
+ headerRendered = true
65
+
55
66
// Main Container
56
67
const fernHeaderContainer = document . createElement ( 'div' )
57
68
fernHeaderContainer . setAttribute ( 'id' , FERN_HEADER_CONTAINER_ID )
@@ -83,7 +94,7 @@ const render = async () => {
83
94
document . body . appendChild ( fernHeaderContainer )
84
95
}
85
96
86
- // Updated to createRoot - callback handling changed
97
+ // Render header component
87
98
const headerRoot = ReactDOM . createRoot ( devrevContentWrapper )
88
99
headerRoot . render (
89
100
React . createElement ( Header , {
@@ -95,19 +106,27 @@ const render = async () => {
95
106
// Make header visible immediately
96
107
setTimeout ( ( ) => {
97
108
const header = document . getElementById ( FERN_HEADER_CONTAINER_ID )
98
- if ( header ) header . style . display = 'block'
109
+ if ( header ) {
110
+ header . style . display = 'block'
111
+ }
99
112
} , 0 )
100
113
}
101
114
115
+ // GUARD: Only render footer once
102
116
const footerElement = document . getElementById ( 'fern-footer' )
103
- if ( footerElement ) {
117
+ if ( ! footerRendered && footerElement && ! footerElement . hasAttribute ( 'data-footer-rendered' ) ) {
118
+ footerRendered = true
119
+ footerElement . setAttribute ( 'data-footer-rendered' , 'true' )
120
+
104
121
const footerRoot = ReactDOM . createRoot ( footerElement )
105
- footerRoot . render ( React . createElement ( Footer , { ...data . footer } ) )
122
+ footerRoot . render ( React . createElement ( Footer , { ...data . footer } ) )
106
123
107
124
// Make footer visible immediately
108
125
setTimeout ( ( ) => {
109
126
const footer = document . getElementById ( 'fern-footer' )
110
- if ( footer ) footer . style . display = 'block'
127
+ if ( footer ) {
128
+ footer . style . display = 'block'
129
+ }
111
130
} , 0 )
112
131
}
113
132
@@ -149,35 +168,66 @@ const render = async () => {
149
168
}
150
169
151
170
let observations = 0
171
+ let isInitialized = false
172
+
173
+ // BETTER INITIALIZATION: Only run once
174
+ const initialize = async ( ) => {
175
+ if ( isInitialized ) {
176
+ return
177
+ }
178
+ isInitialized = true
179
+
180
+ await render ( )
181
+ setupMutationObserver ( )
182
+ }
152
183
153
184
if ( document . readyState === 'loading' ) {
154
- document . addEventListener ( 'DOMContentLoaded' , async ( ) => {
155
- await render ( )
156
- setupMutationObserver ( )
157
- } )
185
+ document . addEventListener ( 'DOMContentLoaded' , initialize )
158
186
} else {
159
- // DOM is already ready, run immediately
160
- render ( ) . then ( ( ) => {
161
- setupMutationObserver ( )
162
- } )
187
+ // Use a small delay to ensure app router has finished initial render
188
+ setTimeout ( initialize , 50 )
163
189
}
164
190
165
191
function setupMutationObserver ( ) {
166
- new MutationObserver ( async ( e , o ) => {
167
- await render ( )
168
- for ( const item of e ) {
169
- if ( item . target instanceof HTMLElement ) {
170
- const target = item . target
192
+ console . log ( 'DEBUG: Setting up mutation observer' )
193
+
194
+ new MutationObserver ( async ( mutations , observer ) => {
195
+ // LESS AGGRESSIVE: Only re-render in specific cases
196
+ let shouldRender = false
197
+
198
+ for ( const mutation of mutations ) {
199
+ if ( mutation . target instanceof HTMLElement ) {
200
+ const target = mutation . target
201
+
202
+ // Only re-render if fern-header or fern-footer are added/removed
171
203
if ( target . id === 'fern-header' || target . id === 'fern-footer' ) {
172
- if ( observations < 3 ) {
173
- // react hydration will trigger a mutation event
174
- observations ++
175
- } else {
176
- o . disconnect ( )
177
- }
204
+ console . log ( `DEBUG: ${ target . id } changed, triggering re-render` )
205
+ shouldRender = true
178
206
break
179
207
}
208
+
209
+ // Check if fern-footer was added to DOM
210
+ if ( mutation . type === 'childList' ) {
211
+ for ( const node of Array . from ( mutation . addedNodes ) ) {
212
+ if ( node instanceof HTMLElement && node . id === 'fern-footer' ) {
213
+ console . log ( 'DEBUG: fern-footer added to DOM, triggering re-render' )
214
+ shouldRender = true
215
+ break
216
+ }
217
+ }
218
+ }
180
219
}
181
220
}
221
+
222
+ if ( shouldRender && observations < 3 ) {
223
+ observations ++
224
+ console . log ( `DEBUG: Re-rendering (${ observations } /3)` )
225
+ await render ( )
226
+ } else if ( observations >= 3 ) {
227
+ console . log ( 'DEBUG: Max observations reached, disconnecting observer' )
228
+ observer . disconnect ( )
229
+ } else {
230
+ console . log ( 'DEBUG: DOM change detected but no re-render needed' )
231
+ }
182
232
} ) . observe ( document . body , { childList : true , subtree : true } )
183
233
}
0 commit comments