1
- import { lazy , Suspense , useRef } from "react"
1
+ import { useRef } from "react"
2
+ import dynamic from "next/dynamic"
2
3
import { useTranslation } from "next-i18next"
3
4
4
5
import { EthHomeIcon } from "@/components/icons"
5
6
import Search from "@/components/Search"
6
7
7
- import { isDesktop } from "@/lib/utils/isDesktop"
8
-
9
8
import SearchButton from "../Search/SearchButton"
10
9
import SearchInputButton from "../Search/SearchInputButton"
11
10
import { BaseLink } from "../ui/Link"
12
11
13
12
import DesktopNavMenu from "./Desktop"
14
- import Menu from "./Menu"
15
13
import { useNav } from "./useNav"
16
14
15
+ import { useBreakpointValue } from "@/hooks/useBreakpointValue"
17
16
import { useIsClient } from "@/hooks/useIsClient"
18
17
19
- const MobileNavMenu = lazy ( ( ) => import ( "./Mobile" ) )
18
+ const Menu = dynamic ( ( ) => import ( "./Menu" ) , {
19
+ ssr : false ,
20
+ loading : ( ) => < div /> ,
21
+ } )
22
+ const MobileNavMenu = dynamic ( ( ) => import ( "./Mobile" ) , { ssr : false } )
20
23
21
24
// TODO display page title on mobile
22
25
const Nav = ( ) => {
23
26
const { toggleColorMode, linkSections } = useNav ( )
24
27
const { t } = useTranslation ( "common" )
25
28
const navWrapperRef = useRef ( null )
26
29
const isClient = useIsClient ( )
27
- const isDesktopFlag = isDesktop ( )
30
+ const desktopScreen = useBreakpointValue ( { base : false , md : true } )
28
31
29
32
return (
30
33
< div className = "sticky top-0 z-sticky w-full" >
@@ -44,39 +47,40 @@ const Nav = () => {
44
47
{ /* Desktop */ }
45
48
< div className = "ms-3 flex w-full justify-end md:justify-between xl:ms-8" >
46
49
{ /* avoid rendering desktop Menu version on mobile */ }
47
- { isClient && isDesktopFlag ? (
50
+ { isClient && desktopScreen ? (
48
51
< Menu className = "hidden md:block" sections = { linkSections } />
49
52
) : (
50
53
< div />
51
54
) }
52
55
53
56
< Search >
54
- { ( { onOpen } ) => (
55
- < div className = "flex items-center" >
56
- { /* Desktop */ }
57
- < div className = "hidden md:flex" >
58
- < SearchButton className = "xl:hidden" onClick = { onOpen } />
59
- < SearchInputButton
60
- className = "hidden xl:flex"
61
- onClick = { onOpen }
62
- />
63
- < DesktopNavMenu toggleColorMode = { toggleColorMode } />
64
- </ div >
57
+ { ( { onOpen } ) => {
58
+ if ( ! isClient ) return null
59
+
60
+ return (
61
+ < div className = "flex items-center" >
62
+ { /* Desktop */ }
63
+ < div className = "hidden md:flex" >
64
+ < SearchButton className = "xl:hidden" onClick = { onOpen } />
65
+ < SearchInputButton
66
+ className = "hidden xl:flex"
67
+ onClick = { onOpen }
68
+ />
69
+ < DesktopNavMenu toggleColorMode = { toggleColorMode } />
70
+ </ div >
65
71
66
- < div className = "flex md:hidden" >
67
- { /* Mobile */ }
68
- { /* use Suspense to display the Search & the Menu at the same time */ }
69
- < Suspense >
72
+ < div className = "flex md:hidden" >
73
+ { /* Mobile */ }
70
74
< SearchButton onClick = { onOpen } />
71
75
< MobileNavMenu
72
76
toggleColorMode = { toggleColorMode }
73
77
linkSections = { linkSections }
74
78
toggleSearch = { onOpen }
75
79
/>
76
- </ Suspense >
80
+ </ div >
77
81
</ div >
78
- </ div >
79
- ) }
82
+ )
83
+ } }
80
84
</ Search >
81
85
</ div >
82
86
</ div >
0 commit comments