1
1
import './main.css'
2
2
import '@devrev/marketing-shared-components/dist/cjs/index.css'
3
3
4
- import ReactDOM from 'react-dom'
5
-
4
+ import ReactDOM from 'react-dom/client'
6
5
import React from 'react'
7
6
8
7
import Header from './components/header'
@@ -15,13 +14,12 @@ import { getPageData } from './modules/sanity/utils'
15
14
16
15
const FERN_CONTENT_WRAPPER_ID = 'fern-header-content-wrapper'
17
16
const DEVREV_CONTENT_WRAPPER_ID = 'devrev-header-content-wrapper'
18
-
19
17
const FERN_HEADER_CONTAINER_ID = 'fern-header'
20
18
21
19
const render = async ( ) => {
22
- /*
23
- * This is a where we try to make async data call.
24
- */
20
+ if ( typeof window === 'undefined' ) {
21
+ return
22
+ }
25
23
26
24
const data = await getPageData ( )
27
25
@@ -30,20 +28,22 @@ const render = async () => {
30
28
31
29
const theme = document . getElementsByTagName ( 'html' ) [ 0 ] . getAttribute ( 'class' )
32
30
33
- if ( ! document . getElementById ( 'sidenav-header-wrapper' ) ) {
31
+ if ( ! document . getElementById ( 'sidenav-header-wrapper' ) && sidenav ) {
34
32
const sidenavHeaderWrapper = document . createElement ( 'div' )
35
33
sidenavHeaderWrapper . setAttribute ( 'id' , 'sidenav-header-wrapper' )
36
34
sidenav . appendChild ( sidenavHeaderWrapper )
37
35
38
36
const search = document . createElement ( 'div' )
39
37
search . setAttribute ( 'id' , 'search-component' )
40
38
sidenavHeaderWrapper . appendChild ( search )
41
- ReactDOM . render ( React . createElement ( Search ) , search )
39
+ const searchRoot = ReactDOM . createRoot ( search )
40
+ searchRoot . render ( React . createElement ( Search ) )
42
41
43
42
const wrapper = document . createElement ( 'div' )
44
43
wrapper . setAttribute ( 'id' , 'theme-switch' )
45
44
sidenavHeaderWrapper . appendChild ( wrapper )
46
- ReactDOM . render ( React . createElement ( ThemeSwitch ) , wrapper )
45
+ const themeRoot = ReactDOM . createRoot ( wrapper )
46
+ themeRoot . render ( React . createElement ( ThemeSwitch ) )
47
47
48
48
sidenav . replaceWith ( sidenavHeaderWrapper )
49
49
}
@@ -83,29 +83,33 @@ const render = async () => {
83
83
document . body . appendChild ( fernHeaderContainer )
84
84
}
85
85
86
- ReactDOM . render (
86
+ // Updated to createRoot - callback handling changed
87
+ const headerRoot = ReactDOM . createRoot ( devrevContentWrapper )
88
+ headerRoot . render (
87
89
React . createElement ( Header , {
88
90
...data . header ,
89
91
version : theme == 'dark' ? 'light' : 'dark' ,
90
- } ) ,
91
- devrevContentWrapper ,
92
- ( ) => {
93
- // Once the header component is loaded, make it visible
94
- const header = document . getElementById ( FERN_HEADER_CONTAINER_ID )
95
- if ( header ) header . style . display = 'block'
96
- }
92
+ } )
97
93
)
94
+
95
+ // Make header visible immediately
96
+ setTimeout ( ( ) => {
97
+ const header = document . getElementById ( FERN_HEADER_CONTAINER_ID )
98
+ if ( header ) header . style . display = 'block'
99
+ } , 0 )
98
100
}
99
101
100
- ReactDOM . render (
101
- React . createElement ( Footer , { ...data . footer } ) ,
102
- document . getElementById ( 'fern-footer' ) ,
103
- ( ) => {
104
- // Once the footer component is loaded, make it visible
102
+ const footerElement = document . getElementById ( 'fern-footer' )
103
+ if ( footerElement ) {
104
+ const footerRoot = ReactDOM . createRoot ( footerElement )
105
+ footerRoot . render ( React . createElement ( Footer , { ...data . footer } ) )
106
+
107
+ // Make footer visible immediately
108
+ setTimeout ( ( ) => {
105
109
const footer = document . getElementById ( 'fern-footer' )
106
110
if ( footer ) footer . style . display = 'block'
107
- } ,
108
- )
111
+ } , 0 )
112
+ }
109
113
110
114
// Add Plug component directly to body
111
115
if ( ! document . getElementById ( 'plug-platform' ) ) {
@@ -145,8 +149,20 @@ const render = async () => {
145
149
}
146
150
147
151
let observations = 0
148
- document . addEventListener ( 'DOMContentLoaded' , async ( ) => {
149
- await render ( )
152
+
153
+ if ( document . readyState === 'loading' ) {
154
+ document . addEventListener ( 'DOMContentLoaded' , async ( ) => {
155
+ await render ( )
156
+ setupMutationObserver ( )
157
+ } )
158
+ } else {
159
+ // DOM is already ready, run immediately
160
+ render ( ) . then ( ( ) => {
161
+ setupMutationObserver ( )
162
+ } )
163
+ }
164
+
165
+ function setupMutationObserver ( ) {
150
166
new MutationObserver ( async ( e , o ) => {
151
167
await render ( )
152
168
for ( const item of e ) {
@@ -164,4 +180,4 @@ document.addEventListener('DOMContentLoaded', async () => {
164
180
}
165
181
}
166
182
} ) . observe ( document . body , { childList : true , subtree : true } )
167
- } )
183
+ }
0 commit comments